विक्षनरी
hiwiktionary
https://hi.wiktionary.org/wiki/%E0%A4%AE%E0%A5%81%E0%A4%96%E0%A4%AA%E0%A5%83%E0%A4%B7%E0%A5%8D%E0%A4%A0
MediaWiki 1.47.0-wmf.18
case-sensitive
मीडिया
विशेष
वार्ता
सदस्य
सदस्य वार्ता
विक्षनरी
विक्षनरी वार्ता
चित्र
चित्र वार्ता
मीडियाविकि
मीडियाविकि वार्ता
साँचा
साँचा वार्ता
सहायता
सहायता वार्ता
श्रेणी
श्रेणी वार्ता
TimedText
TimedText talk
मॉड्यूल
मॉड्यूल वार्ता
Event
Event talk
असमिया
0
978
487733
448088
2026-09-02T14:03:44Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[आसामी]] को [[असमिया]] पर स्थानांतरित किया: अधिक प्रचलित नाम.
448088
wikitext
text/x-wiki
{{-hi-}}
{{-noun-}}
स्त्री.
# [[भारत]] की [[भाषा]] हैं ।
# [[व्यक्ति]]
{{-trans-}}
* {{as}} : [[অসমিয়া]]
* {{de}} : [[Assami]]
* {{en}} : [[Assamese]] [[:en:Assamese]]
* {{fr}} : [[assamais]] पु. [[:fr:assamais]] (१), [[Assamais]] पु. [[:fr:Assamais]] (२)
* {{gu}} : [[આસામી]] स्त्री. [[:gu:આસામી]]
* {{nl}} : [[Assamitisch]] न. [[:nl:Assamitisch]]
* {{zh}} : [[阿萨密语]]
{{-adj-}}
#
{{-trans-}}
* {{en}} : [[Assamese]]
* {{fr}} : [[assamais]] पु., [[assamaise]] स्त्री. [[:fr:assamaise]]
* {{gu}} : [[આસામી]]
[[श्रेणी:भाषाएँ]]
{{-hi-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
आसामी ^१ संज्ञा पुं॰ स्त्री॰ [हि॰] दे॰ 'आसामी' ।
आसामी ^२ वि॰ [हि॰ आसाम] आसाम देश का । आसाम देश संबंधी ।
आसामी ^३ संज्ञा पुं॰ आसाम देश का निवासी ।
आसामी ^४ संज्ञा स्त्री॰ आसाम देश की भाषा ।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
ptr3nbz2yrapwkoavrgiu1sfheg4hik
साँचा:audio
10
7289
487754
478030
2026-09-02T15:14:24Z
SM7
6218
updating...
487754
wikitext
text/x-wiki
{{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|1=<!--
-->{{#invoke:audio|show}}<!--
-->}}<noinclude>{{documentation}}</noinclude>
m5e7v618pe7zo812h4lo5dzfuuhjzjh
साँचा:temp
10
11912
487767
479835
2026-09-02T16:34:41Z
SM7
6218
updating...
487767
wikitext
text/x-wiki
<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:template parser/templates|template_link_t}}</onlyinclude></includeonly><!--
-->{{temp|temp}}{{documentation}}
j7pe9fadahr6jqm0fnpuxcxasravo3o
अखंड
0
140156
487728
390773
2026-09-02T13:58:48Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़]] को [[अखंड]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी
390773
wikitext
text/x-wiki
{{-hi-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
अखंड़ वि॰ [सं॰ अखण्ड़] <br><br>१. जिसके खंड़ या टुकड़े न हों । अटूट । अविछिन्न । संपूर्ण । समूचा । पूरा । उ॰—ज्ञान अखंड़ एक सीताबर । मायावस्य जीव सचराचर । —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड़ । जरत बिभीषन राखेउ दीन्हेउ राज अखंड़ । —मानस ५ ।४९ । यौ॰—अखंड़ ऐश्वर्य । अखंड़ कीर्ति । अखंड़ पुण्य । अखंड़ प्रताप । अखंड़ यश । अखंड़ राज्य । अखंड़ वृष्टि ।
अखंड़ द्वादशी संज्ञा स्त्री॰ [सं॰ अखंड़द्वादशी] अगहन सुदी द्वादशी । मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] ।
अखंड़ सौभाग्य संज्ञा पुं॰ [सं॰ अखंड़+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य । जीवन पयँत अविधवा रहने की स्थिति [को॰] ।
अखंड़ सौभाग्यवती वि॰ [सं॰ अखंड़+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰] ।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
lte67m7w9hfyeias6smnvczxhwqmekl
487730
487728
2026-09-02T14:01:28Z
अजीत कुमार तिवारी
4887
वर्तनी सुधार.
487730
wikitext
text/x-wiki
{{-as-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
अखंड वि॰ [सं॰ अखण्ड] <br><br>१. जिसके खंड या टुकड़े न हों। अटूट। अविछिन्न। संपूर्ण। समूचा। पूरा। उ॰—ज्ञान अखंड एक सीताबर। मायावस्य जीव सचराचर। —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड । जरत बिभीषन राखेउ दीन्हेउ राज अखंड। —मानस ५ ।४९ । यौ॰—अखंड ऐश्वर्य। अखंड कीर्ति। अखंड पुण्य। अखंड प्रताप। अखंड यश। अखंड राज्य। अखंड वृष्टि।
अखंड द्वादशी संज्ञा स्त्री॰ [सं॰ अखंडद्वादशी] अगहन सुदी द्वादशी। मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] ।
अखंड सौभाग्य संज्ञा पुं॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य। जीवन पर्यंत अविधवा रहने की स्थिति [को॰]।
अखंड सौभाग्यवती वि॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰]।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
6w4lmv0lub33r8oxzf91vtgr83tuse0
487731
487730
2026-09-02T14:01:50Z
अजीत कुमार तिवारी
4887
487731
wikitext
text/x-wiki
{{-hi-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
अखंड वि॰ [सं॰ अखण्ड] <br><br>१. जिसके खंड या टुकड़े न हों। अटूट। अविछिन्न। संपूर्ण। समूचा। पूरा। उ॰—ज्ञान अखंड एक सीताबर। मायावस्य जीव सचराचर। —मानस, ७ ।७८ । <br><br>२. जिसका क्रम या सिलसिला न टूटे । जो बीच में न रुके । लगातर । अनवरत । उ॰—जहाँ अखंड़ शांति रहती है वहाँ ११ सदा स्वच्छंद रहें ।—प्रेम॰, पृ॰ ३२ । <br><br>३. निर्विघ्न । बेरोक । उ॰—रावन क्रोध अनल निज स्वास समीर प्रचंड । जरत बिभीषन राखेउ दीन्हेउ राज अखंड। —मानस ५ ।४९ । यौ॰—अखंड ऐश्वर्य। अखंड कीर्ति। अखंड पुण्य। अखंड प्रताप। अखंड यश। अखंड राज्य। अखंड वृष्टि।
अखंड द्वादशी संज्ञा स्त्री॰ [सं॰ अखंडद्वादशी] अगहन सुदी द्वादशी। मार्गशीर्ष मास के शुक्ल पक्ष की बारहवीं तिथि [को॰] ।
अखंड सौभाग्य संज्ञा पुं॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यत स्त्रियों के अविधवा होने का सौभाग्य। जीवन पर्यंत अविधवा रहने की स्थिति [को॰]।
अखंड सौभाग्यवती वि॰ [सं॰ अखंड+सौभाग्यवती] जीवन पर्यंत सुहागिनी रहनेवाली [को॰]।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
malfkishzyfng9qomgt5ppmevyfkw6z
अखण्डनीय
0
140159
487725
390776
2026-09-02T13:56:18Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़नीय]] को [[अखण्डनीय]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी
390776
wikitext
text/x-wiki
{{-hi-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
अखंड़नीय वि॰ [सं॰ अखण्ड़नीय] <br><br>१. जिसके टुकड़े न हो सकें ।जिसका खंड़ न हो सके । जो काटा न जा सके । <br><br>२. जिसके विरुद्ध न कहा जा सके । पुष्ट । अकाट्य ।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
gt9l6grzm0hill6i63380h9xfwoandw
487727
487725
2026-09-02T13:57:04Z
अजीत कुमार तिवारी
4887
वर्तनी सुधार.
487727
wikitext
text/x-wiki
{{-hi-}}
== प्रकाशितकोशों से अर्थ ==
=== शब्दसागर ===
अखंडनीय वि॰ [सं॰ अखण्डनीय] <br><br>१. जिसके टुकड़े न हो सकें ।जिसका खंड न हो सके । जो काटा न जा सके । <br><br>२. जिसके विरुद्ध न कहा जा सके। पुष्ट। अकाट्य।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-शब्दसागर]]
arjkcbdgt31qhza43trmowtwtakj4j9
मॉड्यूल:scripts
828
302126
487836
487620
2026-09-02T19:54:12Z
SM7
6218
updating...
487836
Scribunto
text/plain
local export = {}
local combining_classes_module = "Module:Unicode data/combining classes"
local debug_track_module = "Module:debug/track"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local load_module = "Module:load"
local scripts_canonical_names_module = "Module:scripts/canonical names"
local scripts_chartoscript_module = "Module:scripts/charToScript"
local scripts_data_module = "Module:scripts/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local writing_systems_module = "Module:writing systems"
local writing_systems_data_module = "Module:writing systems/data"
local concat = table.concat
local get_by_code -- Defined below.
local gmatch = string.gmatch
local insert = table.insert
local make_object -- Defined below.
local match = string.match
local require = require
local select = select
local setmetatable = setmetatable
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local toNFKC = mw.ustring.toNFKC
local toNFKD = mw.ustring.toNFKD
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function category_name_has_suffix(...)
category_name_has_suffix = require(language_like_module).categoryNameHasSuffix
return category_name_has_suffix(...)
end
local function category_name_to_code(...)
category_name_to_code = require(language_like_module).categoryNameToCode
return category_name_to_code(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function explode(...)
explode = require(string_utilities_module).explode_utf8
return explode(...)
end
local function get_writing_system(...)
get_writing_system = require(writing_systems_module).getByCode
return get_writing_system(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function to_json(...)
to_json = require(json_module).toJSON
return to_json(...)
end
local function track(page)
debug_track("scripts/" .. page)
return true
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local scripts_canonical_names
local function get_scripts_canonical_names()
scripts_canonical_names, get_scripts_canonical_names = load_data(scripts_canonical_names_module), nil
return scripts_canonical_names
end
local scripts_data
local function get_scripts_data()
scripts_data, get_scripts_data = load_data(scripts_data_module), nil
return scripts_data
end
local scripts_suffixes
local function get_scripts_suffixes()
scripts_suffixes, get_scripts_suffixes = {
"script",
"code",
"notation",
"letters",
"numerals",
"semaphore",
}, nil
for _, v in pairs(load_data(writing_systems_data_module)) do
insert(scripts_suffixes, v[1])
end
return scripts_suffixes
end
local Script = {}
Script.__index = Script
--[==[Returns the script code of the script. Example: {{lua|"Cyrl"}} for Cyrillic.]==]
function Script:getCode()
return self._code
end
--[==[
Return the canonical name of the script. This is the name used to represent that script on Wiktionary.
Example: {"Cyrillic"} for Cyrillic. If `lang` is specified and the script has a language-specific name,
return that (e.g. {"Shahmukhi"} for script `Aran` with Punjabi and certain related languages); otherwise,
return the default name (if the script has different names in different languages, e.g. {"Arabic"} for
`Aran`), or the only name if there is only one.
]==]
function Script:getCanonicalName(lang)
local rawdata = self._data[1]
if type(rawdata) == "string" then
return rawdata
end
local name
if lang then
name = rawdata[lang:getCode()]
if name then
return name
end
name = rawdata[lang:getFullCode()]
if name then
return name
end
end
name = rawdata.default
if not name then
error(("Internal error: no default key in script name table for script %s"):format(self:getCode()))
end
return name
end
--[==[
Return the table mapping languages to names for the script. If the script has only one name (as most scripts
do), return a string consisting of that name. Otherwise, return a table mapping language codes to names,
where the key named `default` contains the default name used for languages not specified in the table.
]==]
function Script:getCanonicalNameTable()
return self._data[1]
end
--[==[
Return all canonical names of the script. The default name is first.
]==]
function Script:getCanonicalNames()
local rawdata = self._data[1]
if type(rawdata) == "string" then
return {rawdata}
end
local names = {}
for lang, name in pairs(rawdata) do
if lang ~= "default" then
require(table_module).insertIfNot(names, name)
end
end
table.sort(names)
require(table_module).insertIfNot(names, rawdata.default, {pos = 1})
return names
end
--[==[
Return the display form of the script. For scripts, this is the same as the value returned by
{:getCategoryName("nocap")}, i.e. it reads <code>"<var>NAME</var> script"</code> (e.g. {"Arabic script"}).
The displayed text used in {:makeCategoryLink()} is always the same as the display form. If the script has
different names in different languages (e.g. `Aran`, which is called {"Shahmukhi"} in Punjabi and certain
related languages but otherwise {"Arabic"}), and `lang` is given, return the language-specific name;
otherwise return the default or only name.
]==]
function Script:getDisplayForm(lang)
return self:getCategoryName("nocap", lang)
end
function Script:getAliases()
Script.getAliases = require(language_like_module).getAliases
return self:getAliases()
end
function Script:getVarieties(flatten)
Script.getVarieties = require(language_like_module).getVarieties
return self:getVarieties(flatten)
end
function Script:getOtherNames()
Script.getOtherNames = require(language_like_module).getOtherNames
return self:getOtherNames()
end
function Script:getAllNames()
Script.getAllNames = require(language_like_module).getAllNames
return self:getAllNames()
end
--[==[Returns the {{w|IETF language tag#Syntax of language tags|IETF subtag}} used for the script, which should always be a valid {{w|ISO 15924}} script code. This is used when constructing HTML {{code|html|lang{{=}}}} tags. The {{lua|ietf_subtag}} value from the script's data file is used, if present; otherwise, the script code is used. For script codes which contain a hyphen, only the part after the hyphen is used (e.g. {{lua|"fa-Arab"}} becomes {{lua|"Arab"}}).]==]
function Script:getIETFSubtag()
local code = self._ietf_subtag
if code == nil then
code = self._data.ietf_subtag or match(self:getCode(), "[^%-]+$")
self._ietf_subtag = code
end
return code
end
--[==[Returns a script object for the parent of the script, such as {"Arab"} for {"fa-Arab"}. It returns {nil} for scripts without a parent, like {"Latn"}, {"Grek"}, etc.]==]
function Script:getParent()
local parent = self._parentObject
if parent == nil then
parent = self:getParentCode()
-- If the value is nil, it's cached as false.
parent = parent and get_by_code(parent) or false
self._parentObject = parent
end
return parent or nil
end
--[==[Returns the script code of the parent of the script, such as {"Arab"} for {"fa-Arab"}. It returns {nil} for scripts without a parent, like {"Latn"}, {"Grek"}, etc.]==]
function Script:getParentCode()
local parent = self._parentCode
if parent == nil then
-- If the value is nil, it's cached as false.
parent = self._data.parent or false
self._parentCode = parent
end
return parent or nil
end
function Script:getSystemCodes()
if not self._systemCodes then
local system_codes = self._data[3]
if type(system_codes) == "table" then
self._systemCodes = system_codes
elseif type(system_codes) == "string" then
self._systemCodes = split(system_codes, ",", true, true)
else
self._systemCodes = {}
end
end
return self._systemCodes
end
function Script:getSystems()
if not self._systemObjects then
self._systemObjects = {}
for _, system in ipairs(self:getSystemCodes()) do
insert(self._systemObjects, get_writing_system(system))
end
end
return self._systemObjects
end
--[==[Check whether the script is of type `system`, which can be a writing system code or object. If multiple systems are passed, return true if the script is any of the specified systems.]==]
function Script:isSystem(...)
for _, system in ipairs{...} do
if type(system) == "table" then
system = system:getCode()
end
for _, s in ipairs(self:getSystemCodes()) do
if system == s then
return true
end
end
end
return false
end
--[==[Returns a table of types as a lookup table (with the types as keys).
Currently, the only possible type is {script}.]==]
function Script:getTypes()
local types = self._types
if types == nil then
types = {script = true}
local rawtypes = self._data.type
if rawtypes then
for t in gmatch(rawtypes, "[^,]+") do
types[t] = true
end
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the script has all of them.
Use {{lua|hasType("script")}} to determine if an object that may be a language, family or script is a script.]==]
function Script:hasType(...)
Script.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[
Return the name of the main category of that script. Example: {"Cyrillic script"} for Cyrillic, whose
category is at [[:Category:Cyrillic script]]. Unless optional argument `nocap` is given, the script name at
the beginning of the returned value will be capitalized. This capitalization is correct for category names,
but not if the script name is lowercase and the returned value of this function is used in the middle of a
sentence. (For example, the script with the code `Semap` has the name {"flag semaphore"}, which should remain
lowercase when used as part of the category name [[:Category:Translingual letters in flag semaphore]] but
should be capitalized in [[:Category:Flag semaphore templates]].) If you are considering using
{getCategoryName("nocap")}, use {getDisplayForm()} instead. If the script has different names in different
languages (e.g. `Aran`, which is called {"Shahmukhi"} in Punjabi and certain related languages but otherwise
{"Arabic"}), and `lang` is given, return the language-specific name; otherwise return the default or only
name.
]==]
function Script:getCategoryName(nocap, lang)
local name = self:getCanonicalName(lang)
if category_name_has_suffix(name, scripts_suffixes or get_scripts_suffixes()) then
name = name .. " script"
end
if not nocap then
name = mw.getContentLanguage():ucfirst(name)
end
return name
end
--[==[
Return a link to the appropriate category for the script, displaying using the display form of the script.
For example, `Cyrl` returns `[[:Category:Cyrillic script|Cyrillic script]]`. The display form is not
automatically capitalized, so e.g. the script code `Semap` will return
`[[:Category:Flag semaphore|flag semaphore]]`. If the script has different names in different languages (e.g.
`Aran`, which is called {"Shahmukhi"} in Punjabi and certain related languages but otherwise {"Arabic"}), and
`lang` is given, return the language-specific name; otherwise return the default or only name.
]==]
function Script:makeCategoryLink(lang)
return "[[:Category:" .. self:getCategoryName(lang) .. "|" .. self:getDisplayForm(lang) .. "]]"
end
--[==[Returns the Wikidata item id for the script or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Script:getWikidataItem()
Script.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[
Returns the name of the Wikipedia article for the script. `project` specifies the language and project to retrieve
the article from, defaulting to {"enwiki"} for the English Wikipedia. Normally if specified it should be the project
code for a specific-language Wikipedia e.g. "zhwiki" for the Chinese Wikipedia, but it can be any project, including
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn't be retrieved, the
return value will fall back to a link to the script's category, but this won't normally happen for any other project.
]==]
function Script:getWikipediaArticle(noCategoryFallback, project)
Script.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
--[==[Returns the name of the Wikimedia Commons category page for the script.]==]
function Script:getCommonsCategory()
Script.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
--[==[Returns the charset defining the script's characters from the script's data file.
This can be used to search for words consisting only of this script, but see the warning above.]==]
function Script:getCharacters()
return self.characters or nil
end
--[==[Returns the number of characters in the text that are part of this script.
'''Note:''' You should never assume that text consists entirely of the same script. Strings may contain spaces, punctuation and even wiki markup or HTML tags. HTML tags will skew the counts, as they contain Latin-script characters. So it's best to avoid them.]==]
function Script:countCharacters(text)
local charset = self._data.characters
if charset == nil then
return 0
end
return select(2, ugsub(text, "[" .. charset .. "]", ""))
end
function Script:hasCapitalization()
return not not self._data.capitalized
end
function Script:hasSpaces()
return self._data.spaces ~= false
end
function Script:isTransliterated()
return self._data.translit ~= false
end
--[==[Returns true if the script is (sometimes) sorted by scraping page content, meaning that it is sensitive to changes in capitalization during sorting.]==]
function Script:sortByScraping()
return not not self._data.sort_by_scraping
end
--[==[Returns the text direction. Horizontal scripts return {{lua|"ltr"}} (left-to-right) or {{lua|"rtl"}} (right-to-left), while vertical scripts return {{lua|"vertical-ltr"}} (vertical left-to-right) or {{lua|"vertical-rtl"}} (vertical right-to-left).]==]
function Script:getDirection()
return self._data.direction or "ltr"
end
function Script:getData()
return self._data
end
--[==[Returns the name of the module containing the script's data. Currently, this is always [[Module:scripts/data]].]==]
function Script:getDataModuleName()
return scripts_data_module
end
--[==[Returns {{lua|true}} if the script contains characters that require fixes to Unicode normalization under certain circumstances, {{lua|false}} if it doesn't.]==]
function Script:hasNormalizationFixes()
return not not self._data.normalizationFixes
end
--[==[Corrects discouraged sequences of Unicode characters to the encouraged equivalents.]==]
function Script:fixDiscouragedSequences(text)
if self:hasNormalizationFixes() then
local norm_fixes = self._data.normalizationFixes
local to = norm_fixes.to
if to then
for i, v in ipairs(norm_fixes.from) do
text = ugsub(text, v, to[i] or "")
end
end
end
return text
end
do
local combining_classes
-- Obtain the list of default combining classes.
local function get_combining_classes()
combining_classes, get_combining_classes = load_data(combining_classes_module), nil
return combining_classes
end
-- Implements a modified form of Unicode normalization for instances where there are identified deficiencies in the default Unicode combining classes.
local function fixNormalization(text, self)
if not self:hasNormalizationFixes() then
return text
end
local norm_fixes = self._data.normalizationFixes
local new_classes = norm_fixes.combiningClasses
if not (new_classes and umatch(text, "[" .. norm_fixes.combiningClassCharacters .. "]")) then
return text
end
text = explode(text)
-- Manual sort based on new combining classes.
-- We can't use table.sort, as it compares the first/last values in an array as a shortcut, which messes things up.
for i = 2, #text do
local char = text[i]
local class = new_classes[char] or (combining_classes or get_combining_classes())[char]
if class then
repeat
i = i - 1
local prev = text[i]
if (new_classes[prev] or (combining_classes or get_combining_classes())[prev] or 0) < class then
break
end
text[i], text[i + 1] = char, prev
until i == 1
end
end
return concat(text)
end
function Script:toFixedNFC(text)
return fixNormalization(toNFC(text), self)
end
function Script:toFixedNFD(text)
return fixNormalization(toNFD(text), self)
end
function Script:toFixedNFKC(text)
return fixNormalization(toNFKC(text), self)
end
function Script:toFixedNFKD(text)
return fixNormalization(toNFKD(text), self)
end
end
function Script:toJSON(opts)
local ret = {
canonicalName = self:getCanonicalName(),
canonicalNameTable = self:getCanonicalNameTable(),
categoryName = self:getCategoryName("nocap"),
code = self:getCode(),
parent = self:getParentCode(),
systems = self:getSystemCodes(),
aliases = self:getAliases(),
varieties = self:getVarieties(),
otherNames = self:getOtherNames(),
type = keys_to_list(self:getTypes()),
direction = self:getDirection(),
characters = self:getCharacters(),
ietfSubtag = self:getIETFSubtag(),
wikidataItem = self:getWikidataItem(),
wikipediaArticle = self:getWikipediaArticle(true),
}
-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.
return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)
end
function export.makeObject(code, data)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
return setmetatable({_data = data, _code = code, characters = data.characters}, Script)
end
make_object = export.makeObject
local scripts_to_track = {
["fa-Arab"] = true,
["kk-Arab"] = true,
["ks-Arab"] = true,
["ku-Arab"] = true,
["ms-Arab"] = true,
["mzn-Arab"] = true,
["ota-Arab"] = true,
["pa-Arab"] = true,
["ps-Arab"] = true,
["sd-Arab"] = true,
["tt-Arab"] = true,
["ug-Arab"] = true,
["ur-Arab"] = true,
}
--[==[
Finds the script whose code matches the one provided. If it exists, it returns a {Script} object representing the
script. Otherwise, it returns {nil}.]==]
function export.getByCode(code)
if scripts_to_track[code] then
track(code)
end
local data = (scripts_data or get_scripts_data())[code]
return data ~= nil and make_object(code, data) or nil
end
get_by_code = export.getByCode
--[==[
Look for the script whose canonical name (the name used to represent that script on Wiktionary) matches the one
provided. If it exists, it returns a {Script} object representing the script. Otherwise, it returns {nil}. The
canonical name of scripts should always be unique (it is an error for two scripts on Wiktionary to share the same
canonical name), so this is guaranteed to give at most one result.]==]
function export.getByCanonicalName(name)
if name == nil then
return nil
end
local code = (scripts_canonical_names or get_scripts_canonical_names())[name]
if code == nil then
return nil
end
return get_by_code(code)
end
--[==[
Look for the script whose category name (the name used in categories for that script) matches the one provided.
If it exists, it returns a {Script} object representing the script. Otherwise, it returns {nil}. In almost all cases,
the category name for a script is its canonical name plus the word "script", e.g. "Cyrillic" has the category name
"Cyrillic script". Where a canonical name ends with "script", "code" or "semaphore", the category name is identical
to the canonical name.
]==]
function export.getByCategoryName(name)
if name == nil then
return nil
end
local code, canonical_name = category_name_to_code(
name,
" script",
scripts_canonical_names or get_scripts_canonical_names(),
scripts_suffixes or get_scripts_suffixes()
)
if code == nil then
return nil, nil
end
return get_by_code(code), canonical_name
end
--[==[
Convert a canonical name to the corresponding category name. Unless optional argument `nocap` is given, the script
name at the beginning of the returned value will be capitalized. See {:getCategoryName()} for more discussion.
]==]
function export.canonicalNameToCategoryName(name, nocap)
if category_name_has_suffix(name, scripts_suffixes or get_scripts_suffixes()) then
name = name .. " script"
end
if not nocap then
name = mw.getContentLanguage():ucfirst(name)
end
return name
end
--[==[
Takes a codepoint or a character and finds the script code (if any) that is
appropriate for it based on the codepoint, using the data module
[[Module:scripts/recognition data]]. The data module was generated from the
patterns in [[Module:scripts/data]] using [[Module:User:Erutuon/script recognition]].
Converts the character to a codepoint. Returns a script code if the codepoint
is in the list of individual characters, or if it is in one of the defined
ranges in the 4096-character block that it belongs to, else returns "None".
]==]
function export.charToScript(char)
export.charToScript = require(scripts_chartoscript_module).charToScript
return export.charToScript(char)
end
--[==[
Returns the code for the script that has the greatest number of characters in `text`. Useful for script tagging text
that is unspecified for language. Uses [[Module:scripts/recognition data]] to determine a script code for a character
language-agnostically. Specifically, it works as follows:
Convert each character to a codepoint. Increment the counter for the script code if the codepoint is in the list
of individual characters, or if it is in one of the defined ranges in the 4096-character block that it belongs to.
Each script has a two-part counter, for primary and secondary matches. Primary matches are when the script is the
first one listed; otherwise, it's a secondary match. When comparing scripts, first the total of both are compared
(i.e. the overall number of matches). If these are the same, the number of primary and then secondary matches are
used as tiebreakers. For example, this is used to ensure that `Grek` takes priority over `Polyt` if no characters
which exclusively match `Polyt` are found, as `Grek` is a subset of `Polyt`.
If `none_is_last_resort_only` is specified, this will never return {"None"} if any characters in `text` belong to a
script. Otherwise, it will return {"None"} if there are more characters that don't belong to a script than belong to
any individual script. (FIXME: This behavior is probably wrong, and `none_is_last_resort_only` should probably
become the default.)
]==]
function export.findBestScriptWithoutLang(text, none_is_last_resort_only)
export.findBestScriptWithoutLang = require(scripts_chartoscript_module).findBestScriptWithoutLang
return export.findBestScriptWithoutLang(text, none_is_last_resort_only)
end
return export
io3j9hrdqyxoerkjf8e2y02nar9stid
मॉड्यूल:scripts/data
828
302127
487837
487549
2026-09-02T19:55:42Z
SM7
6218
updating...
487837
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alphabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"syllabary",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Caucasian Albanian",
2495716,
"alphabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Arabic",
1828555,
"abjad", -- more precisely, impure abjad
varieties = {"Jawi", "Perso-Arabic", "Sulat Sūg"},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["Aran"] = {
{
hnd = "Shahmukhi", -- Southern Hindko
hno = "Shahmukhi", -- Northern Hindko
["inc-opa"] = "Shahmukhi", -- Old Punjabi
lah = "Shahmukhi", -- Lahnda
pa = "Shahmukhi", -- Punjabi
phr = "Shahmukhi", -- Pahari-Potwari
skr = "Shahmukhi", -- Saraiki
default = "Arabic",
},
1133121, -- FIXME: 133800 for Shahmukhi
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
aliases = {"Nastaliq", "Nastaleeq"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["Armi"] = process_ranges{
"Imperial Aramaic",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenian",
11932,
"alphabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avestan",
790681,
"alphabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Balinese",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"syllabary",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alphabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengali",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assamese",
191272,
m["Beng"][3],
other_names = {"Eastern Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logography",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"semisyllabary",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alphabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Canadian syllabic",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alphabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Cham",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"syllabary",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Coptic",
321083,
"alphabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"syllabary",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cypriot",
1757689,
"syllabary",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Cyrillic",
8209,
"alphabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Old Cyrillic",
442244,
m["Cyrl"][3],
aliases = {"Early Cyrillic"},
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
wikipedia_article = "Early Cyrillic alphabet",
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
{
ahr = "Balbodh", -- Ahirani
kfq = "Balbodh", -- Korku
kok = "Balbodh", -- Konkani
mr = "Balbodh", -- Marathi
omr = "Balbodh", -- Old Marathi
vah = "Balbodh", -- Varhadi
default = "Devanagari",
},
38592, -- FIXME: 16948817 for Balbodh
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alphabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alphabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotic",
188519,
"abjad, logography",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratic",
208111,
"abjad, logography",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Egyptian hieroglyphic",
132659,
"abjad, logography",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alphabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Ethiopic",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
sort_key = "Ethi-sortkey",
strip_diacritics = {remove_diacritics = u(0x135D) .. u(0x135E) .. u(0x135F)}
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alphabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alphabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
translit = "Geok-translit",
}
m["Geor"] = process_ranges{
"Georgian",
3317411,
"alphabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagolitic",
145625,
"alphabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Gothic",
467784,
"alphabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Greek",
8216,
"alphabet",
ranges = {
0x0341, 0x0341,
0x0374, 0x0375,
0x037E, 0x037E,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03D7,
0x03DA, 0x03DB,
0x03DE, 0x03E1,
0x03F0, 0x03F1,
0x03F4, 0x03F4,
0x03FC, 0x03FC,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Greek",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x0340, 0x0340,
0x0342, 0x0345,
0x0370, 0x0373,
0x0376, 0x0377,
0x037A, 0x037D,
0x037F, 0x037F,
0x03D8, 0x03D9,
0x03DC, 0x03DD,
0x03F2, 0x03F3,
0x03F5, 0x03FB,
0x03FD, 0x03FF,
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"syllabary",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Han",
8201,
"logography",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x3347F,
},
varieties = {"Hanzi", "Kanji", "Hanja", "Chu Nom"},
spaces = false,
}
m["Hans"] = {
"Simplified Han",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Traditional Han",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Hebrew",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Anatolian hieroglyphic",
521323,
"logography, syllabary",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"semisyllabary",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alphabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Old Hungarian",
446224,
"alphabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Northeastern Iberian",
1113155,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Southeastern Iberian",
2305351,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Image-rendered",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"International Phonetic Alphabet",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Old Italic",
4891256,
"alphabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
translit = "Ital-translit",
}
m["Java"] = process_ranges{
"Javanese",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logography",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Khom Thai",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan large",
6401797,
"logography",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan small",
6401800,
"logography, syllabary",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
translit = "kn-translit",
}
m["Kpel"] = {
"Kpelle",
1586299,
"syllabary",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latin",
8229,
"alphabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelic",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
other_names = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alphabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
translit = "Lisu-translit",
sort_key = {
from = {"𑾰"},
to = {"ꓬ" .. p[1]}
},
}
m["Loma"] = {
"Loma",
13023816,
"syllabary",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycian",
913587,
"alphabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydian",
4261300,
"alphabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makasar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaic",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Manichaean",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
translit = "Mani-translit",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Meroitic cursive",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Meroitic hieroglyphic",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
translit = "ml-translit",
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
do
local Mong_displaytext = {
from = {"([ᠨ-ᡂᡸ])ᠶ([ᠨ-ᡂᡸ])", "([ᠠ-ᡂᡸ])ᠸ([^᠋ᠠ-ᠧ])", "([ᠠ-ᡂᡸ])ᠸ$"},
to = {"%1ᠢ%2", "%1ᠧ%2", "%1ᠧ"}
}
m["Mong"] = process_ranges{
"Mongolian",
1055705,
"alphabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
display_text = Mong_displaytext,
strip_diacritics = Mong_displaytext,
translit = "Mong-translit",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "mnc-translit",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Clear Script",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
translit = "xwo-translit",
}
end
m["Moon"] = {
"Moon",
918391,
"alphabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Morse code",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"musical notation",
233861,
"pictography",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Burmese",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alphabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Ancient North Arabian",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
translit = "Narb-translit",
}
m["Nbat"] = process_ranges{
"Nabataean",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"pictography",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"syllabary",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"unspecified",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"syllabary",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alphabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Old Turkic",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
translit = "Orkh-translit",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
translit = "Osge-translit",
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Old Uyghur",
1998938,
"abjad, alphabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyrene",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Proto-Cuneiform",
1650699,
"pictography",
-- Not in Unicode
}
m["Pelm"] = {
"Proto-Elamite",
56305763,
"pictography",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Old Permic",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Inscriptional Pahlavi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Psalter Pahlavi",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Book Pahlavi",
72403118,
"abjad",
direction = "rtl",
wikipedia_article = "Pahlavi scripts#Book Pahlavi",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenician",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
translit = "Phnx-translit",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Inscriptional Parthian",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Proto-Sinaitic",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Rumi numerals",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Runic",
82996,
"alphabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
do
local Samr_stripdiacritics = {
remove_diacritics = c.CGJ .. u(0x0816) .. "-" .. u(0x082D),
}
m["Samr"] = process_ranges{
"Samaritan",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
strip_diacritics = Samr_stripdiacritics,
sort_key = Samr_stripdiacritics,
}
end
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
translit = "Sarb-translit",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"pictography",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"pictography",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shavian",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
translit = "Shrd-translit",
}
m["Shui"] = {
"Sui",
752854,
"logography",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
translit = "Sidd-translit",
}
m["Sidt"] = {
"Sidetic",
36659,
"alphabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhalese",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdian",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Old Sogdian",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sundanese",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alphabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Syriac",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"New Tai Lue",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logography, syllabary",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
translit = "txg-translit",
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = process_ranges{
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
ranges = {
0x1E6C0, 0x1E6DE,
0x1E6E0, 0x1E6F5,
0x1E6FE, 0x1E6FF,
},
spaces = false,
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alphabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
other_names = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
varieties = {"Badlit", "Basahan", "Kur-itan"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
do
local Tibt_displaytext = {
from = {"ༀ", "༌", "།།", "༚༚", "༚༝", "༝༚", "༝༝", "ཷ", "ཹ", "ེེ", "ོོ"},
to = {"ཨོཾ", "་", "༎", "༛", "༟", "࿎", "༞", "ྲཱྀ", "ླཱྀ", "ཻ", "ཽ"}
}
m["Tibt"] = process_ranges{
"Tibetan",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
display_text = Tibt_displaytext,
strip_diacritics = Tibt_displaytext,
sort_key = "Tibt-sortkey",
translit = "Tibt-translit",
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
-- There is no inheritance of properties currently implemented for scripts. Per [[User:Theknightwho]], this
-- is because it's tricky to do since there are several types of child scripts: those that are mere display
-- variants (like fa-Arab), which should be eliminated in favor of CSS language selectors to
-- handle the font differences; those that are genuinely different scripts that happen to share the same
-- Unicode codepoints but have mostly different properties (e.g. Manchu vs. Mongolian); and those that are
-- somewhere in between (like Tamyig vs. Tibetan). As a result, we currently have to manually specify
-- which properties we want inherited as follows.
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
display_text = m["Tibt"].display_text,
strip_diacritics = m["Tibt"].strip_diacritics,
sort_key = m["Tibt"].sort_key,
translit = m["Tibt"].translit,
}
end
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alphabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alphabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alphabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugaritic",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"syllabary",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alphabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuqi",
3301993,
"alphabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alphabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"syllabary",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Old Persian",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"Cuneiform",
401,
aliases = {"Sumero-Akkadian Cuneiform"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Yi",
1197646,
"syllabary",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"mathematical notation",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zname"] = process_ranges{
"Znamenny musical notation",
965834,
"pictography",
ranges = {
0x1CF00, 0x1CF2D,
0x1CF30, 0x1CF46,
0x1CF50, 0x1CFC3,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Zsym"] = process_ranges{
"symbolic",
80071,
"pictography",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zxxx"] = {
"unwritten",
104839715,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"uncoded",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"syllabary",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Japanese",
190502,
"logography, syllabary",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korean",
711797,
"logography, syllabary",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
-- `漢字(한자)`→`漢字`
-- `가-나-다`→`가나다`, `가--나--다`→`가-나-다`
-- `온돌(溫突/溫堗)`→`온돌` ([[ondol]])
strip_diacritics = {
remove_diacritics = u(0x302E) .. u(0x302F),
from = {"([" .. m["Hani"].characters .. "])%(.-%)", "^%-", "%-$", "%-(%-?)", "\1", "%([" .. m["Hani"].characters .. "/]+%)"},
to = {"%1", "\1", "\1", "%1", "-"}
}
}
return require("Module:languages").finalizeData(m, "script")
9sspbdakjsd6y1scsky44ytlagvjvy1
मॉड्यूल:script utilities
828
302131
487785
477441
2026-09-02T17:17:56Z
SM7
6218
updating...
487785
Scribunto
text/plain
local export = {}
local anchors_module = "Module:anchors"
local debug_track_module = "Module:debug/track"
local links_module = "Module:links"
local munge_text_module = "Module:munge text"
local parameters_module = "Module:parameters"
local scripts_module = "Module:scripts"
local string_utilities_module = "Module:string utilities"
local utilities_module = "Module:utilities"
local concat = table.concat
local insert = table.insert
local require = require
local toNFD = mw.ustring.toNFD
local dump = mw.dumpObject
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function embedded_language_links(...)
embedded_language_links = require(links_module).embedded_language_links
return embedded_language_links(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function language_anchor(...)
language_anchor = require(anchors_module).language_anchor
return language_anchor(...)
end
local function munge_text(...)
munge_text = require(munge_text_module)
return munge_text(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function track(...)
track = require(debug_track_module)
return track(...)
end
local function u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data, get_data = mw.loadData("Module:script utilities/data"), nil
return m_data
end
--[=[
Modules used:
[[Module:script utilities/data]]
[[Module:scripts]]
[[Module:anchors]] (only when IDs present)
[[Module:string utilities]] (only when hyphens in Korean text or spaces in vertical text)
[[Module:languages]]
[[Module:parameters]]
[[Module:utilities]]
[[Module:debug/track]]
]=]
function export.is_Latin_script(sc)
-- Latn, Latf, Latg, pjt-Latn
return sc:getCode():find("Lat") and true or false
end
--[==[{{temp|#invoke:script utilities|lang_t}}
This is used by {{temp|lang}} to wrap portions of text in a language tag. See there for more information.]==]
do
local function get_args(frame)
return process_params(frame:getParent().args, {
[1] = {required = true, type = "language", default = "und"},
[2] = {required = true, allow_empty = true, default = ""},
["sc"] = {type = "script"},
["face"] = true,
["class"] = true,
})
end
function export.lang_t(frame)
local args = get_args(frame)
local lang = args[1]
local sc = args["sc"]
local text = args[2]
local cats = {}
if sc then
-- Track uses of sc parameter.
if sc:getCode() == lang:findBestScript(text):getCode() then
insert(cats, lang:getFullName() .. " terms with redundant script codes")
else
insert(cats, lang:getFullName() .. " terms with non-redundant manual script codes")
end
else
sc = lang:findBestScript(text)
end
text = embedded_language_links{
term = text,
lang = lang,
sc = sc
}
cats = #cats > 0 and format_categories(cats, lang, "-", nil, nil, sc) or ""
local face = args["face"]
local class = args["class"]
return export.tag_text(text, lang, sc, face, class) .. cats
end
end
-- Ustring turns on the codepoint-aware string matching. The basic string function
-- should be used for simple sequences of characters, Ustring function for
-- sets – [].
local function trackPattern(text, pattern, tracking)
if pattern and umatch(text, pattern) then
track("script/" .. tracking)
end
end
local function track_text(text, lang, sc)
if lang and text then
local langCode = lang:getFullCode()
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/ang/acute]]
if langCode == "ang" then
local decomposed = toNFD(text)
local acute = u(0x301)
trackPattern(decomposed, acute, "ang/acute")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-phi]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-theta]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-kappa]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Greek/wrong-rho]]
ϑ, ϰ, ϱ, ϕ should generally be replaced with θ, κ, ρ, φ.
]=]
elseif langCode == "el" or langCode == "grc" then
trackPattern(text, "ϑ", "Greek/wrong-theta")
trackPattern(text, "ϰ", "Greek/wrong-kappa")
trackPattern(text, "ϱ", "Greek/wrong-rho")
trackPattern(text, "ϕ", "Greek/wrong-phi")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/spacing-coronis]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/spacing-smooth-breathing]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Ancient Greek/wrong-apostrophe]]
When spacing coronis and spacing smooth breathing are used as apostrophes,
they should be replaced with right single quotation marks (’).
]=]
if langCode == "grc" then
trackPattern(text, u(0x1FBD), "Ancient Greek/spacing-coronis")
trackPattern(text, u(0x1FBF), "Ancient Greek/spacing-smooth-breathing")
trackPattern(text, "[" .. u(0x1FBD) .. u(0x1FBF) .. "]", "Ancient Greek/wrong-apostrophe", true)
end
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Russian/grave-accent]]
elseif langCode == "ru" then
local decomposed = toNFD(text)
trackPattern(decomposed, u(0x300), "Russian/grave-accent")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Chuvash/latin-homoglyph]]
elseif langCode == "cv" then
trackPattern(text, "[ĂăĔĕÇçŸÿ]", "Chuvash/latin-homoglyph")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script/Tibetan/trailing-punctuation]]
elseif langCode == "bo" then
trackPattern(text, "[་།]$", "Tibetan/trailing-punctuation")
trackPattern(text, "[་།]%]%]$", "Tibetan/trailing-punctuation")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/broken-am]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Thai/wrong-rue-lue]]
]=]
elseif langCode == "th" then
trackPattern(text, "เ".."เ", "Thai/broken-ae")
trackPattern(text, "ํ[่้๊๋]?า", "Thai/broken-am")
trackPattern(text, "[ฤฦ]า", "Thai/wrong-rue-lue")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/broken-am]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-no]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-mo]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lao/possible-broken-ho-lo]]
]=]
elseif langCode == "lo" then
trackPattern(text, "ເ".."ເ", "Lao/broken-ae")
trackPattern(text, "ໍ[່້໊໋]?າ", "Lao/broken-am")
trackPattern(text, "ຫນ", "Lao/possible-broken-ho-no")
trackPattern(text, "ຫມ", "Lao/possible-broken-ho-mo")
trackPattern(text, "ຫລ", "Lao/possible-broken-ho-lo")
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lü/broken-ae]]
[[Special:WhatLinksHere/Wiktionary:Tracking/script/Lü/possible-wrong-sequence]]
]=]
elseif langCode == "khb" then
trackPattern(text, "ᦵ".."ᦵ", "Lü/broken-ae")
trackPattern(text, "[ᦀ-ᦫ][ᦵᦶᦷᦺ]", "Lü/possible-wrong-sequence")
end
end
end
local function Kore_ruby(...)
-- Cache character sets on the first call.
local Hang_chars = get_script("Hang"):getCharacters()
local Hani_chars = get_script("Hani"):getCharacters()
-- Overwrite with the actual function, which is called directly on subsequent calls.
function Kore_ruby(txt)
return (ugsub(txt, "([%-".. Hani_chars .. "]+)%(([%-" .. Hang_chars .. "]+)%)", "<ruby>%1<rp>(</rp><rt>%2</rt><rp>)</rp></ruby>"))
end
return Kore_ruby(...)
end
--[==[Wraps the given text in HTML tags with appropriate CSS classes (see [[WT:CSS]]) for the [[Module:languages#Language objects|language]] and script. This is required for all non-English text on Wiktionary.
The actual tags and CSS classes that are added are determined by the <code>face</code> parameter. It can be one of the following:
; {{code|lua|"term"}}
: The text is wrapped in {{code|html|2=<i class="(sc) mention" lang="(lang)">...</i>}}.
; {{code|lua|"head"}}
: The text is wrapped in {{code|html|2=<strong class="(sc) headword" lang="(lang)">...</strong>}}.
; {{code|lua|"hypothetical"}}
: The text is wrapped in {{code|html|2=<span class="hypothetical-star">*</span><i class="(sc) hypothetical" lang="(lang)">...</i>}}.
; {{code|lua|"bold"}}
: The text is wrapped in {{code|html|2=<b class="(sc)" lang="(lang)">...</b>}}.
; {{code|lua|nil}}
: The text is wrapped in {{code|html|2=<span class="(sc)" lang="(lang)">...</span>}}.
The optional <code>class</code> parameter can be used to specify an additional CSS class to be added to the tag.]==]
function export.tag_text(text, lang, sc, face, class, id)
if not sc then
if lang then
sc = lang:findBestScript(text)
else
sc = find_best_script_without_lang(text)
end
end
track_text(text, lang, sc)
-- Replace space characters with newlines in Mongolian-script text, which is written top-to-bottom.
if sc:getDirection():find("vertical", nil, true) and text:find(" ", nil, true) then
text = munge_text(text, function(txt)
-- having extra parentheses makes sure only the first return value gets through
return (txt:gsub(" +", "<br>"))
end)
end
-- Hack Korean script text to remove hyphens.
-- FIXME: This should be handled in a more general fashion, but needs to
-- be efficient by not doing anything if no hyphens are present, and currently this is the only
-- language needing such processing.
-- 20220221: Also convert 漢字(한자) to ruby, instead of needing [[Template:Ruby]].
if sc:getCode() == "Kore" and text:match("[%-()g]") then
local title, display = require("Module:links").get_wikilink_parts(text, true)
if title ~= nil then -- special case that the text is a single link, do not munge and preserve affix hyphens
if lang and lang:getCode() == "okm" then -- Middle Korean code from [[User:Chom.kwoy]]
-- Comment from [[User:Lunabunn]]:
-- In Middle Korean orthography, syllable formation is phonemic as opposed to morpheme-boundary-based a la
-- modern Korean. As such, for example, if you were to write nam-i, it would be rendered as na.mi so if you
-- then put na-mi to indicate particle boundaries as in modern Korean, the hyphen would be misplaced.
-- Previously, this was alleviated by specialcasing na--mi but [[User:Theknightwho]] made that resolve to -
-- in the Hangul (previously we used to just delete all -s in Hangul processing), so it broke.
-- [[User:Chom.kwoy]] implemented a different solution, which is writing -> instead using however many >s to
-- shift the hyphen by that number of letters in the romanization.
-- By the time we are called, > signs have been converted to > by a call to encode_entities() in
-- make_link() in [[Module:links]] (near the bottom of the function).
-- 'g' in Middle Korean is a special sign to treat the following ㅇ sign as /G/ instead of null.
display = display:gsub(">", ""):gsub("g", "")
end
if display:find("<") then
display = munge_text(display, function(txt)
txt = txt:gsub("(.)%-(%-?)(.)", "%1%2%3")
return Kore_ruby(txt)
end)
else
display = display:gsub("(.)%-(%-?)(.)", "%1%2%3")
display = Kore_ruby(display)
end
text = "[[" .. title .. "|" .. display .. "]]"
else
text = munge_text(text, function(txt)
if lang and lang:getCode() == "okm" then
txt = txt:gsub(">", ""):gsub("g", "")
end
if txt == text then -- special case for the entire text being plain
txt = txt:gsub("(.)%-(%-?)(.)", "%1%2%3")
else
txt = txt:gsub("%-(%-?)", "%1")
end
return Kore_ruby(txt)
end)
end
end
if sc:getCode() == "Image" then
face = nil
end
if face == "hypothetical" then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/script-utilities/face/hypothetical]]
track("script-utilities/face/hypothetical")
end
local data = (m_data or get_data()).faces[face or "plain"]
if data == nil then
error('Invalid script face "' .. face .. '".')
end
local tag = data.tag
local opening_tag = {tag}
if lang and id then
insert(opening_tag, 'id="' .. language_anchor(lang, id) .. '"')
end
local classes = {data.class}
-- if the script code is hyphenated (i.e. language code-script code, add the last component as a class as well)
-- e.g. mnc-Mong adds both Mong and mnc-Mong as classes
if sc:getCode():find("-", nil, true) then
insert(classes, 1, (ugsub(sc:getCode(), ".+%-", "")))
insert(classes, 2, sc:getCode())
else
insert(classes, 1, sc:getCode())
end
if class and class ~= '' then
insert(classes, class)
end
insert(opening_tag, 'class="' .. concat(classes, ' ') .. '"')
-- FIXME: Is it OK to insert the etymology-only lang code and have it fall back to the first part of the
-- lang code (by chopping off the '-...' part)? It seems the :lang() selector does this; not sure about
-- [lang=...] attributes.
if lang then
insert(opening_tag, 'lang="' .. lang:getFullCode() .. '"')
end
-- Add a script wrapper
return (data.prefix or "") .. "<" .. concat(opening_tag, " ") .. ">" .. text .. "</" .. tag .. ">"
end
--[==[Tags the transliteration for given text {translit} and language {lang}. It will add the language, script subtag (as defined in [https://www.rfc-editor.org/rfc/bcp/bcp47.txt BCP 47 2.2.3]) and [https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir dir] (directional) attributes as needed.
The optional <code>kind</code> parameter can be one of the following:
; {{code|lua|"term"}}
: tag transliteration for {{temp|mention}}
; {{code|lua|"usex"}}
: tag transliteration for {{temp|usex}}
; {{code|lua|"head"}}
: tag transliteration for {{temp|head}}
; {{code|lua|"default"}}
: default
The optional <code>attributes</code> parameter is used to specify additional HTML attributes for the tag.]==]
function export.tag_translit(translit, lang, kind, attributes, is_manual)
if type(lang) == "table" then
-- FIXME: Do better support for etym languages; see https://www.rfc-editor.org/rfc/bcp/bcp47.txt
lang = lang.getFullCode and lang:getFullCode()
or error("Second argument to tag_translit should be a language code or language object.")
end
local data = (m_data or get_data()).translit[kind or "default"]
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if lang == "ja" then
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. (is_manual and "manual-tr " or "") .. 'tr"')
else
insert(opening_tag, 'lang="' .. lang .. '-Latn"')
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. (is_manual and "manual-tr " or "") .. 'tr Latn"')
end
local dir = data.dir
if dir then
insert(opening_tag, 'dir="' .. dir .. '"')
end
if attributes then
track("tag_translit/attributes")
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. translit .. "</" .. tag .. ">"
end
function export.tag_transcription(transcription, lang, kind, attributes)
if type(lang) == "table" then
-- FIXME: Do better support for etym languages; see https://www.rfc-editor.org/rfc/bcp/bcp47.txt
lang = lang.getFullCode and lang:getFullCode()
or error("Second argument to tag_transcription should be a language code or language object.")
end
local data = (m_data or get_data()).transcription[kind or "default"]
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if lang == "ja" then
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. 'ts"')
else
insert(opening_tag, 'lang="' .. lang .. '-Latn"')
insert(opening_tag, 'class="' .. (class and (class .. " ") or "") .. 'ts Latn"')
end
local dir = data.dir
if dir then
insert(opening_tag, 'dir="' .. dir .. '"')
end
if attributes then
track("tag_transcription/attributes")
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. transcription .. "</" .. tag .. ">"
end
--[==[Tags {def} as a definition.
The <code>def</code> parameter must be one of the following:
; {{code|lua|"gloss"}}
: The text is wrapped in {{code|html|2=<span class="(mention-gloss">...</span>}}.
; {{code|lua|"non-gloss"}}
: The text is wrapped in {{code|html|2=<span class="use-with-mention">...</span>}}.
The optional <code>attributes</code> parameter is used to specify additional HTML attributes for the tag.]==]
function export.tag_definition(def, kind, attributes)
local data = (m_data or get_data()).definition[kind]
if data == nil then
error("Second argument to tag_definition should specify the kind of definition from the list in [[Module:script utilities/data]].")
end
local tag = data.tag
local opening_tag = {tag}
local class = data.class
if class then
insert(opening_tag, 'class="' .. class .. '"')
end
if attributes then
insert(opening_tag, attributes)
end
return "<" .. concat(opening_tag, " ") .. ">" .. def .. "</" .. tag .. ">"
end
--[==[Generates a request to provide a term in its native script, if it is missing. This is used by the {{temp|rfscript}} template as well as by the functions in [[Module:links]].
The function will add entries to one of the subcategories of [[:Category:Requests for native script by language]], and do several checks on the given language and script. In particular:
* If the script was given, a subcategory named "Requests for (script) script" is added, but only if the language has more than one script. Otherwise, the main "Requests for native script" category is used.
* Nothing is added at all if the language has no scripts other than Latin and its varieties.]==]
function export.request_script(lang, sc, usex, nocat, sort_key)
local scripts = lang.getScripts and lang:getScripts() or error('The language "' .. lang:getCode() .. '" does not have the method getScripts. It may be unwritten.')
-- By default, request for "native" script
local cat_script = "native"
local disp_script = "लिपि"
-- If the script was not specified, and the language has only one script, use that.
if not sc and #scripts == 1 then
sc = scripts[1]
end
-- Is the script known?
if sc and sc:getCode() ~= "None" then
-- If the script is Latin, return nothing.
if export.is_Latin_script(sc) then
return ""
end
if (not scripts[1]) or sc:getCode() ~= scripts[1]:getCode() then
disp_script = sc:getCanonicalName()
end
-- The category needs to be specific to script only if there is chance of ambiguity. This occurs when when the language has multiple scripts (or with codes such as "und").
if (not scripts[1]) or scripts[2] then
cat_script = sc:getCanonicalName()
end
else
-- The script is not known.
-- Does the language have at least one non-Latin script in its list?
local has_nonlatin = false
for _, val in ipairs(scripts) do
if not export.is_Latin_script(val) then
has_nonlatin = true
break
end
end
-- If there are no non-Latin scripts, return nothing.
if not has_nonlatin and lang:getCode() ~= "und" then
return ""
end
end
-- Etymology languages have their own categories, whose parents are the regular language.
return "<small>[" .. disp_script .. " needed]</small>" .. (nocat and "" or
format_categories("Requests for " .. cat_script .. " script " ..
(usex and "in" or "for") .. " " .. lang:getCanonicalName() .. " " ..
(usex == "quote" and "quotations" or usex and "usage examples" or "terms"),
lang, sort_key
)
)
end
--[==[This is used by {{temp|rfscript}}. See there for more information.]==]
function export.template_rfscript(frame)
local boolean = {type = "boolean"}
local args = process_params(frame:getParent().args, {
[1] = {required = true, type = "language", default = "und"},
["sc"] = {type = "script"},
["usex"] = boolean,
["quote"] = boolean,
["nocat"] = boolean,
["sort"] = true,
})
local ret = export.request_script(args[1], args["sc"], args.quote and "quote" or args.usex, args.nocat, args.sort)
if ret == "" then
error("This language is written in the Latin alphabet. It does not need a native script.")
end
return ret
end
function export.checkScript(text, scriptCode, result)
local scriptObject = get_script(scriptCode)
if not scriptObject then
error('The script code "' .. scriptCode .. '" is not recognized.')
end
local originalText = text
-- Remove non-letter characters.
text = ugsub(text, "%A+", "")
-- Remove all characters of the script in question.
text = ugsub(text, "[" .. scriptObject:getCharacters() .. "]+", "")
if text ~= "" then
if type(result) == "string" then
error(result)
else
error('The text "' .. originalText .. '" contains the letters "' .. text .. '" that do not belong to the ' .. scriptObject:getDisplayForm() .. '.', 2)
end
end
end
return export
rzm4o5bgeoygyloax24lbwgngj7wpo6
मॉड्यूल:script utilities/data
828
302134
487787
477442
2026-09-02T17:19:13Z
SM7
6218
updating...
487787
Scribunto
text/plain
local data = {}
local translit = {
["term"] = {
--[=[ can't be done until Kana transliterations are correctly parsed by [[Module:links]]
["tag"] = "i",
]=]
["class"] = "mention-tr",
},
["usex"] = {
["tag"] = "i",
["class"] = "e-transliteration",
},
["head"] = {
["class"] = "headword-tr",
["dir"] = "ltr",
},
["default"] = {},
}
for _, v in next, translit do
if not v.tag then
v.tag = "span"
end
end
data.translit = translit
data.transcription = {
["head"] = {
["tag"] = "span",
["class"] = "headword-ts",
["dir"] = "ltr",
},
["usex"] = {
["tag"] = "span",
["class"] = "e-transcription",
},
["default"] = {},
}
data.definition = {
["gloss"] = {
["tag"] = "span",
["class"] = "mention-gloss",
},
["non-gloss"] = {
["tag"] = "span",
["class"] = "use-with-mention",
},
}
local faces = {
["term"] = {
["tag"] = "i",
["class"] = "mention",
},
["head"] = {
["tag"] = "strong",
["class"] = "headword",
},
["hypothetical"] = {
["prefix"] = '<span class="hypothetical-star">*</span>',
["tag"] = "i",
["class"] = "hypothetical",
},
["bold"] = {
["tag"] = "b",
},
["plain"] = {
["tag"] = "span",
}
}
faces["translation"] = faces["plain"]
data.faces = faces
return data
glatf44lq0ipqkut0sozbs72zba142n
मॉड्यूल:headword
828
302137
487781
487589
2026-09-02T17:12:39Z
SM7
6218
localization...
487781
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[
Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can
be used for any term if you want links added to single-word terms as well. If you want to only add
links to multiword terms, first check that the term is multiword using `head_is_multiword`.
If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This
should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not
when taken from a {{para|head}} parameter.
]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Appendix:Gestures/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data, is_varform_only)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat and not is_varform_only then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
]==]
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "s" and pos or
pluralize(pos)
end
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "लेम्मा"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "लेम्मा"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "non-lemma form"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "non-lemma form"
elseif best_guess then
return plpos:find(" forms$") and "non-lemma form" or "लेम्मा"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप"
end
return export.pluralize_pos(pos)
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys")
end
if different then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl = page.wikitext_topic_cat[lang:getCode()]
local sortkey = nil
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with topic categories using raw markup")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with language name categories using raw markup")
end
if get_current_L2() ~= canonical then
insert(lang_cats, canonical .. " entries with incorrect language header")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]]
track("incorrect language header", lang)
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or
actual_namespace == "मॉड्यूल"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
if data.altform then
-- Temporary tracking for use of old altform=
track("altform", data.lang)
end
local is_varform_only = data.var and data.var ~= "both"
local is_varform_both = data.var == "both"
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
init_and_find_maximum_index(data, "श्रेणियाँ")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat and not is_varform_only then
local pos_category = full_langname .. " " .. data.pos_category
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Translingual Han characters" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat and not is_varform_only then
insert(data.categories, 1, full_langname .. " " .. postype .. "s")
end
-- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in
-- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]].
if (is_varform_only or is_varform_both) and postype then
insert(data.categories, 1, full_langname .. " variant " .. postype .. "s")
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace")
elseif data.lang:hasType("appendix-constructed") then
error("Entries in " .. langname .. " must be placed in the Appendix: namespace")
end
elseif namespace == "Citations" or namespace == "Thesaurus" then
error("Headword templates should not be used in the " .. namespace .. ": namespace.")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ")
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " terms with non-redundant manual script codes")
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Pages using discouraged character sequences")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, full_langname .. " terms with redundant transliterations")
else
insert(data.categories, full_langname .. " terms with non-redundant manual transliterations")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms")
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Reconstruction" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Reconstruction:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't
-- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't
-- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu
-- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the
-- page but instead needs to check if there are any languages using scripts other than Aran.
if dt_script_code == "Aran" and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, full_langname .. " terms with redundant head parameter")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, full_langname .. " कई शब्द वाले टर्म")
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "लंबे " .. full_langname .. " शब्द")
end
end
end
end
-- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check
-- each head, as the heads may (theoretically) have different scripts.
local default_sccat = m_headword_data.default_sccat
if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then
local function needs_sccat(sccat_entry, sc)
if sccat_entry == true or not sccat_entry then
return sccat_entry
end
if type(sccat_entry) == "table" then
local in_list = contains(sccat_entry, sc:getCode())
if sccat_entry[1] == "not" then
in_list = not in_list
end
return in_list
end
return nil
end
for _, head in ipairs(data.heads) do
-- First check the `sccat` specified at the {{head}} level.
local this_needs_sccat = needs_sccat(data.sccat, head.sc)
-- If that wasn't given, check the default sccat at the language level for the lang code.
if this_needs_sccat == nil and not is_varform_only then
this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc)
end
-- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level.
if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then
this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc)
end
if this_needs_sccat then
insert(data.categories, full_langname .. " " .. data.pos_category .. " in " ..
head.sc:getDisplayForm(data.lang))
end
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Reconstruction" and not is_varform_only then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode)
-- The following is correct; it relies on side-effecing the explode_standard[] table.
ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, full_langname .. " terms spelled with numbers")
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, full_langname .. " terms spelled with emoji")
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. char)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌")
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. character)
end
end
end
if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter")
end
end
-- Categorise for palindromes
if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, full_langname .. " पैलिंड्रोम")
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data, is_varform_only) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
eyvsm46yn0rfctlhis3poxc3lhndtof
487782
487781
2026-09-02T17:13:58Z
SM7
6218
localization...
487782
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[
Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can
be used for any term if you want links added to single-word terms as well. If you want to only add
links to multiword terms, first check that the term is multiword using `head_is_multiword`.
If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This
should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not
when taken from a {{para|head}} parameter.
]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Appendix:Gestures/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data, is_varform_only)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat and not is_varform_only then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
]==]
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "" and pos or
pluralize(pos)
end
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "लेम्मा"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "लेम्मा"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "non-lemma form"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "non-lemma form"
elseif best_guess then
return plpos:find(" forms$") and "non-lemma form" or "लेम्मा"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप"
end
return export.pluralize_pos(pos)
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys")
end
if different then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl = page.wikitext_topic_cat[lang:getCode()]
local sortkey = nil
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with topic categories using raw markup")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with language name categories using raw markup")
end
if get_current_L2() ~= canonical then
insert(lang_cats, canonical .. " entries with incorrect language header")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]]
track("incorrect language header", lang)
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or
actual_namespace == "मॉड्यूल"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
if data.altform then
-- Temporary tracking for use of old altform=
track("altform", data.lang)
end
local is_varform_only = data.var and data.var ~= "both"
local is_varform_both = data.var == "both"
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
init_and_find_maximum_index(data, "श्रेणियाँ")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat and not is_varform_only then
local pos_category = full_langname .. " " .. data.pos_category
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Translingual Han characters" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat and not is_varform_only then
insert(data.categories, 1, full_langname .. " " .. postype .. "")
end
-- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in
-- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]].
if (is_varform_only or is_varform_both) and postype then
insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "")
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace")
elseif data.lang:hasType("appendix-constructed") then
error("Entries in " .. langname .. " must be placed in the Appendix: namespace")
end
elseif namespace == "Citations" or namespace == "Thesaurus" then
error("Headword templates should not be used in the " .. namespace .. ": namespace.")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ")
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " terms with non-redundant manual script codes")
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Pages using discouraged character sequences")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, full_langname .. " terms with redundant transliterations")
else
insert(data.categories, full_langname .. " terms with non-redundant manual transliterations")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms")
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Reconstruction" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Reconstruction:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't
-- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't
-- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu
-- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the
-- page but instead needs to check if there are any languages using scripts other than Aran.
if dt_script_code == "Aran" and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, full_langname .. " terms with redundant head parameter")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, full_langname .. " कई शब्द वाले टर्म")
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "लंबे " .. full_langname .. " शब्द")
end
end
end
end
-- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check
-- each head, as the heads may (theoretically) have different scripts.
local default_sccat = m_headword_data.default_sccat
if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then
local function needs_sccat(sccat_entry, sc)
if sccat_entry == true or not sccat_entry then
return sccat_entry
end
if type(sccat_entry) == "table" then
local in_list = contains(sccat_entry, sc:getCode())
if sccat_entry[1] == "not" then
in_list = not in_list
end
return in_list
end
return nil
end
for _, head in ipairs(data.heads) do
-- First check the `sccat` specified at the {{head}} level.
local this_needs_sccat = needs_sccat(data.sccat, head.sc)
-- If that wasn't given, check the default sccat at the language level for the lang code.
if this_needs_sccat == nil and not is_varform_only then
this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc)
end
-- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level.
if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then
this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc)
end
if this_needs_sccat then
insert(data.categories, full_langname .. " " .. data.pos_category .. " in " ..
head.sc:getDisplayForm(data.lang))
end
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Reconstruction" and not is_varform_only then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode)
-- The following is correct; it relies on side-effecing the explode_standard[] table.
ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, full_langname .. " terms spelled with numbers")
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, full_langname .. " terms spelled with emoji")
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. char)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌")
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. character)
end
end
end
if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter")
end
end
-- Categorise for palindromes
if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, full_langname .. " पैलिंड्रोम")
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data, is_varform_only) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
bkjlsqf7k368usjgc60mfr3w6wvufb1
487796
487782
2026-09-02T17:44:26Z
SM7
6218
सुधार
487796
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[
Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can
be used for any term if you want links added to single-word terms as well. If you want to only add
links to multiword terms, first check that the term is multiword using `head_is_multiword`.
If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This
should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not
when taken from a {{para|head}} parameter.
]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Appendix:Gestures/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data, is_varform_only)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat and not is_varform_only then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
]==]
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "" and pos or
pluralize(pos)
end
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "लेम्मा"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "लेम्मा"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "non-lemma form"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "non-lemma form"
elseif best_guess then
return plpos:find(" forms$") and "non-lemma form" or "लेम्मा"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप"
end
return export.pluralize_pos(pos)
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys")
end
if different then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl = page.wikitext_topic_cat[lang:getCode()]
local sortkey = nil
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with topic categories using raw markup")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with language name categories using raw markup")
end
if get_current_L2() ~= canonical then
insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]]
track("त्रुटिपूर्ण भाषा हेडर", lang)
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or
actual_namespace == "मॉड्यूल"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
if data.altform then
-- Temporary tracking for use of old altform=
track("altform", data.lang)
end
local is_varform_only = data.var and data.var ~= "both"
local is_varform_both = data.var == "both"
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
init_and_find_maximum_index(data, "श्रेणियाँ")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat and not is_varform_only then
local pos_category = full_langname .. " " .. data.pos_category
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Translingual Han characters" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat and not is_varform_only then
insert(data.categories, 1, full_langname .. " " .. postype .. "")
end
-- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in
-- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]].
if (is_varform_only or is_varform_both) and postype then
insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "")
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace")
elseif data.lang:hasType("appendix-constructed") then
error("Entries in " .. langname .. " must be placed in the Appendix: namespace")
end
elseif namespace == "Citations" or namespace == "Thesaurus" then
error("Headword templates should not be used in the " .. namespace .. ": namespace.")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ")
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " terms with non-redundant manual script codes")
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Pages using discouraged character sequences")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, full_langname .. " terms with redundant transliterations")
else
insert(data.categories, full_langname .. " terms with non-redundant manual transliterations")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms")
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Reconstruction" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Reconstruction:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't
-- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't
-- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu
-- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the
-- page but instead needs to check if there are any languages using scripts other than Aran.
if dt_script_code == "Aran" and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, full_langname .. " terms with redundant head parameter")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, full_langname .. " कई शब्द वाले टर्म")
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "लंबे " .. full_langname .. " शब्द")
end
end
end
end
-- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check
-- each head, as the heads may (theoretically) have different scripts.
local default_sccat = m_headword_data.default_sccat
if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then
local function needs_sccat(sccat_entry, sc)
if sccat_entry == true or not sccat_entry then
return sccat_entry
end
if type(sccat_entry) == "table" then
local in_list = contains(sccat_entry, sc:getCode())
if sccat_entry[1] == "not" then
in_list = not in_list
end
return in_list
end
return nil
end
for _, head in ipairs(data.heads) do
-- First check the `sccat` specified at the {{head}} level.
local this_needs_sccat = needs_sccat(data.sccat, head.sc)
-- If that wasn't given, check the default sccat at the language level for the lang code.
if this_needs_sccat == nil and not is_varform_only then
this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc)
end
-- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level.
if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then
this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc)
end
if this_needs_sccat then
insert(data.categories, full_langname .. " " .. data.pos_category .. " in " ..
head.sc:getDisplayForm(data.lang))
end
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Reconstruction" and not is_varform_only then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode)
-- The following is correct; it relies on side-effecing the explode_standard[] table.
ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, full_langname .. " terms spelled with numbers")
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, full_langname .. " terms spelled with emoji")
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. char)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌")
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. character)
end
end
end
if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter")
end
end
-- Categorise for palindromes
if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, full_langname .. " पैलिंड्रोम")
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data, is_varform_only) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
ccsdk2qtqw6x7bl3xw0h7wwwe4cu328
487801
487796
2026-09-02T18:32:20Z
SM7
6218
फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था। इसलिए इसे निरस्त रखा है।
487801
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[
Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can
be used for any term if you want links added to single-word terms as well. If you want to only add
links to multiword terms, first check that the term is multiword using `head_is_multiword`.
If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This
should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not
when taken from a {{para|head}} parameter.
]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Appendix:Gestures/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data, is_varform_only)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat and not is_varform_only then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था।
इसलिए इसे निरस्त रखा है।
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "" and pos or
pluralize(pos)
end
]==]
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "लेम्मा"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "लेम्मा"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "non-lemma form"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "non-lemma form"
elseif best_guess then
return plpos:find(" forms$") and "non-lemma form" or "लेम्मा"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप"
end
return export.pluralize_pos(pos)
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys")
end
if different then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl = page.wikitext_topic_cat[lang:getCode()]
local sortkey = nil
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with topic categories using raw markup")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with language name categories using raw markup")
end
if get_current_L2() ~= canonical then
insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]]
track("त्रुटिपूर्ण भाषा हेडर", lang)
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or
actual_namespace == "मॉड्यूल"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
if data.altform then
-- Temporary tracking for use of old altform=
track("altform", data.lang)
end
local is_varform_only = data.var and data.var ~= "both"
local is_varform_both = data.var == "both"
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
init_and_find_maximum_index(data, "श्रेणियाँ")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat and not is_varform_only then
local pos_category = full_langname .. " " .. data.pos_category
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Translingual Han characters" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat and not is_varform_only then
insert(data.categories, 1, full_langname .. " " .. postype .. "")
end
-- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in
-- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]].
if (is_varform_only or is_varform_both) and postype then
insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "")
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace")
elseif data.lang:hasType("appendix-constructed") then
error("Entries in " .. langname .. " must be placed in the Appendix: namespace")
end
elseif namespace == "Citations" or namespace == "Thesaurus" then
error("Headword templates should not be used in the " .. namespace .. ": namespace.")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ")
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " terms with non-redundant manual script codes")
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Pages using discouraged character sequences")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, full_langname .. " terms with redundant transliterations")
else
insert(data.categories, full_langname .. " terms with non-redundant manual transliterations")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms")
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Reconstruction" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Reconstruction:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't
-- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't
-- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu
-- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the
-- page but instead needs to check if there are any languages using scripts other than Aran.
if dt_script_code == "Aran" and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, full_langname .. " terms with redundant head parameter")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, full_langname .. " कई शब्द वाले टर्म")
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "लंबे " .. full_langname .. " शब्द")
end
end
end
end
-- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check
-- each head, as the heads may (theoretically) have different scripts.
local default_sccat = m_headword_data.default_sccat
if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then
local function needs_sccat(sccat_entry, sc)
if sccat_entry == true or not sccat_entry then
return sccat_entry
end
if type(sccat_entry) == "table" then
local in_list = contains(sccat_entry, sc:getCode())
if sccat_entry[1] == "not" then
in_list = not in_list
end
return in_list
end
return nil
end
for _, head in ipairs(data.heads) do
-- First check the `sccat` specified at the {{head}} level.
local this_needs_sccat = needs_sccat(data.sccat, head.sc)
-- If that wasn't given, check the default sccat at the language level for the lang code.
if this_needs_sccat == nil and not is_varform_only then
this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc)
end
-- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level.
if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then
this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc)
end
if this_needs_sccat then
insert(data.categories, full_langname .. " " .. data.pos_category .. " in " ..
head.sc:getDisplayForm(data.lang))
end
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Reconstruction" and not is_varform_only then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode)
-- The following is correct; it relies on side-effecing the explode_standard[] table.
ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, full_langname .. " terms spelled with numbers")
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, full_langname .. " terms spelled with emoji")
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. char)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌")
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. character)
end
end
end
if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter")
end
end
-- Categorise for palindromes
if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, full_langname .. " पैलिंड्रोम")
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data, is_varform_only) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
qsqmjpa3rf62ra4d196y13zara7enwo
487803
487801
2026-09-02T18:46:10Z
SM7
6218
f वाले forms को भी प्लूरल बनाने की आवश्यकता नहीं थी
487803
Scribunto
text/plain
local export = {}
-- Named constants for all modules used, to make it easier to swap out sandbox versions.
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local gender_and_number_module = "Module:gender and number"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local palindromes_module = "Module:palindromes"
local pron_qualifier_module = "Module:pron qualifier"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local script_utilities_module = "Module:script utilities"
local script_utilities_data_module = "Module:script utilities/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local dump = mw.dumpObject
local insert = table.insert
local ipairs = ipairs
local max = math.max
local new_title = mw.title.new
local pairs = pairs
local require = require
local toNFC = mw.ustring.toNFC
local toNFD = mw.ustring.toNFD
local type = type
local ufind = mw.ustring.find
local ugmatch = mw.ustring.gmatch
local ugsub = mw.ustring.gsub
local umatch = mw.ustring.match
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function find_best_script_without_lang(...)
find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang
return find_best_script_without_lang(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_genders(...)
format_genders = require(gender_and_number_module).format_genders
return format_genders(...)
end
local function format_pron_qualifiers(...)
format_pron_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_pron_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_current_L2(...)
get_current_L2 = require(pages_module).get_current_L2
return get_current_L2(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_palindrome(...)
is_palindrome = require(palindromes_module).is_palindrome
return is_palindrome(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities_module).pattern_escape
return pattern_escape(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_page(...)
process_page = require(headword_page_module).process_page
return process_page(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function tag_transcription(...)
tag_transcription = require(script_utilities_module).tag_transcription
return tag_transcription(...)
end
local function tag_translit(...)
tag_translit = require(script_utilities_module).tag_translit
return tag_translit(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local m_data
local function get_data()
m_data = load_data(headword_data_module)
return m_data
end
local script_data
local function get_script_data()
script_data = load_data(scripts_data_module)
return script_data
end
local script_utilities_data
local function get_script_utilities_data()
script_utilities_data = load_data(script_utilities_data_module)
return script_utilities_data
end
-- If set to true, categories always appear, even in non-mainspace pages
local test_force_categories = false
-- Add a tracking category to track entries with certain (unusually undesirable) properties. `track_id` is an identifier
-- for the particular property being tracked and goes into the tracking page. Specifically, this adds a link in the
-- page text to [[Wiktionary:Tracking/headword/TRACK_ID]], meaning you can find all entries with the `track_id` property
-- by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID]].
--
-- If `lang` (a language object) is given, an additional tracking page [[Wiktionary:Tracking/headword/TRACK_ID/CODE]] is
-- linked to where CODE is the language code of `lang`, and you can find all entries in the combination of `track_id`
-- and `lang` by visiting [[Special:WhatLinksHere/Wiktionary:Tracking/headword/TRACK_ID/CODE]]. This makes it possible to
-- isolate only the entries with a specific tracking property that are in a given language. Note that if `lang`
-- references at etymology-only language, both that language's code and its full parent's code are tracked.
local function track(track_id, lang)
local tracking_page = "headword/" .. track_id
if lang and lang:hasType("etymology-only") then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode(),
tracking_page .. "/" .. lang:getFullCode()}
elseif lang then
debug_track{tracking_page, tracking_page .. "/" .. lang:getCode()}
else
debug_track(tracking_page)
end
return true
end
local function text_in_script(text, script_code)
local sc = get_script(script_code)
if not sc then
error("Internal error: Bad script code " .. script_code)
end
local characters = sc.characters
local out
if characters then
text = ugsub(text, "%W", "")
out = ufind(text, "[" .. characters .. "]")
end
if out then
return true
else
return false
end
end
local spacingPunctuation = "[%s%p]+"
--[[ List of punctuation or spacing characters that are found inside of words.
Used to exclude characters from the regex above. ]]
local wordPunc = "-#%%&@־׳״'.·*’་•:᠊"
local notWordPunc = "[^" .. wordPunc .. "]+"
-- Format a term (either a head term or an inflection term) along with any left or right qualifiers, labels, references
-- or customized separator: `part` is the object specifying the term (and `lang` the language of the term), which should
-- optionally contain:
-- * left qualifiers in `q`, an array of strings;
-- * right qualifiers in `qq`, an array of strings;
-- * left labels in `l`, an array of strings;
-- * right labels in `ll`, an array of strings;
-- * references in `refs`, an array either of strings (formatted reference text) or objects containing fields `text`
-- (formatted reference text) and optionally `name` and/or `group`;
-- * a separator in `separator`, defaulting to " <i>or</i> " if this is not the first term (j > 1), otherwise "".
-- `formatted` is the formatted version of the term itself, and `j` is the index of the term.
local function format_term_with_qualifiers_and_refs(lang, part, formatted, j)
local function part_non_empty(field)
local list = part[field]
if not list then
return nil
end
if type(list) ~= "table" then
error(("Internal error: Wrong type for `part.%s`=%s, should be \"table\""):format(field, dump(list)))
end
return list[1]
end
if part_non_empty("q") or part_non_empty("qq") or part_non_empty("l") or
part_non_empty("ll") or part_non_empty("refs") then
formatted = format_pron_qualifiers {
lang = lang,
text = formatted,
q = part.q,
qq = part.qq,
l = part.l,
ll = part.ll,
refs = part.refs,
}
end
local separator = part.separator or j > 1 and " <i>अथवा</i> " -- use "" to request no separator
if separator then
formatted = separator .. formatted
end
return formatted
end
--[==[Return true if the given head is multiword according to the algorithm used in full_headword().]==]
function export.head_is_multiword(head)
for possibleWordBreak in ugmatch(head, spacingPunctuation) do
if umatch(possibleWordBreak, notWordPunc) then
return true
end
end
return false
end
do
local function workaround_to_exclude_chars(s)
return (ugsub(s, notWordPunc, "\2%1\1"))
end
--[==[
Add appropriate links to `head`, correctly handling multiword terms. This is intended for multiword terms but can
be used for any term if you want links added to single-word terms as well. If you want to only add
links to multiword terms, first check that the term is multiword using `head_is_multiword`.
If `default` is specified, this will escape colons so that they don't get interpreted as interwiki links. This
should generally only be used when `head` is an actual pagename or is taken from a {{para|pagename}} parameter, not
when taken from a {{para|head}} parameter.
]==]
function export.add_multiword_links(head, default)
head = "\1" .. ugsub(head, spacingPunctuation, workaround_to_exclude_chars) .. "\2"
if default then
head = head
:gsub("(\1[^\2]*)\\([:#][^\2]*\2)", "%1\\\\%2")
:gsub("(\1[^\2]*)([:#][^\2]*\2)", "%1\\%2")
end
--Escape any remaining square brackets to stop them breaking links (e.g. "[citation needed]").
head = encode_entities(head, "[]", true, true)
--[=[
use this when workaround is no longer needed:
head = "[[" .. ugsub(head, WORDBREAKCHARS, "]]%1[[") .. "]]"
Remove any empty links, which could have been created above
at the beginning or end of the string.
]=]
return (head
:gsub("\1\2", "")
:gsub("[\1\2]", {["\1"] = "[[", ["\2"] = "]]"}))
end
end
local function non_categorizable(full_raw_pagename)
return full_raw_pagename:find("^Appendix:Gestures/") or
-- Unsupported titles with descriptive names.
(full_raw_pagename:find("^Unsupported titles/") and not full_raw_pagename:find("`"))
end
local function tag_text_and_add_quals_and_refs(data, head, formatted, j)
-- Add language and script wrapper.
formatted = tag_text(formatted, data.lang, head.sc, "head", nil, j == 1 and data.id or nil)
-- Add qualifiers, labels, references and separator.
return format_term_with_qualifiers_and_refs(data.lang, head, formatted, j)
end
-- Format a headword with transliterations.
local function format_headword(data)
-- Are there non-empty transliterations?
local has_translits = false
local has_manual_translits = false
------ Format the headwords. ------
local head_parts = {}
local unique_head_parts = {}
local has_multiple_heads = not not data.heads[2]
for j, head in ipairs(data.heads) do
if head.tr or head.ts then
has_translits = true
end
if head.tr and head.tr_manual or head.ts then
has_manual_translits = true
end
local formatted
-- Apply processing to the headword, for formatting links and such.
if head.term:find("[[", nil, true) and head.sc:getCode() ~= "Image" then
formatted = language_link{term = head.term, lang = data.lang}
else
formatted = data.lang:makeDisplayText(head.term, head.sc, true)
end
local head_part = tag_text_and_add_quals_and_refs(data, head, formatted, j)
insert(head_parts, head_part)
-- If multiple heads, try to determine whether all heads display the same. To do this we need to effectively
-- rerun the text tagging and addition of qualifiers and references, using 1 for all indices.
if has_multiple_heads then
local unique_head_part
if j == 1 then
unique_head_part = head_part
else
unique_head_part = tag_text_and_add_quals_and_refs(data, head, formatted, 1)
end
unique_head_parts[unique_head_part] = true
end
end
local set_size = 0
if has_multiple_heads then
for _ in pairs(unique_head_parts) do
set_size = set_size + 1
end
end
if set_size == 1 then
head_parts = head_parts[1]
else
head_parts = concat(head_parts)
end
if has_manual_translits then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/manual-tr/LANGCODE]]
track("manual-tr", data.lang)
end
------ Format the transliterations and transcriptions. ------
local translits_formatted
if has_translits then
local translit_parts = {}
for _, head in ipairs(data.heads) do
if head.tr or head.ts then
local this_parts = {}
if head.tr then
insert(this_parts, tag_translit(head.tr, data.lang:getCode(), "head", nil, head.tr_manual))
if head.ts then
insert(this_parts, " ")
end
end
if head.ts then
insert(this_parts, "/" .. tag_transcription(head.ts, data.lang:getCode(), "head") .. "/")
end
insert(translit_parts, concat(this_parts))
end
end
translits_formatted = " (" .. concat(translit_parts, " <i>अथवा</i> ") .. ")"
local langname = data.lang:getCanonicalName()
local transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
local saw_translit_page = false
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
saw_translit_page = true
end
-- If data.lang is an etymology-only language and we didn't find a translation page for it, fall back to the
-- full parent.
if not saw_translit_page and data.lang:hasType("etymology-only") then
langname = data.lang:getFullName()
transliteration_page = new_title(langname .. " ट्रांसलिट्रेशन", "विक्षनरी")
if transliteration_page and transliteration_page:getContent() then
translits_formatted = " [[विक्षनरी:" .. langname .. " ट्रांसलिट्रेशन|•]]" .. translits_formatted
end
end
else
translits_formatted = ""
end
------ Paste heads and transliterations/transcriptions. ------
local lemma_gloss
if data.gloss then
lemma_gloss = ' <span class="ib-content qualifier-content">' .. data.gloss .. '</span>'
else
lemma_gloss = ""
end
return head_parts .. translits_formatted .. lemma_gloss
end
local function format_headword_genders(data, is_varform_only)
local retval = ""
if data.genders and data.genders[1] then
if data.gloss then
retval = ","
end
local pos_for_cat
if not data.nogendercat and not is_varform_only then
local no_gender_cat = (m_data or get_data()).no_gender_cat
if not (no_gender_cat[data.lang:getCode()] or no_gender_cat[data.lang:getFullCode()]) then
pos_for_cat = (m_data or get_data()).pos_for_gender_number_cat[data.pos_category:gsub("^reconstructed ", "")]
end
end
local text, cats = format_genders(data.genders, data.lang, pos_for_cat)
if cats then
extend(data.categories, cats)
end
retval = retval .. " " .. text
end
return retval
end
-- Forward reference
local format_inflections
local function format_inflection_parts(data, parts)
for j, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local partaccel = part.accel
local face = part.face or "bold"
if face ~= "bold" and face ~= "plain" and face ~= "hypothetical" then
error("The face `" .. face .. "` " .. (
(script_utilities_data or get_script_utilities_data()).faces[face] and
"should not be used for non-headword terms on the headword line." or
"is invalid."
))
end
-- Here the final part 'or data.nolinkinfl' allows to have 'nolinkinfl=true'
-- right into the 'data' table to disable inflection links of the entire headword
-- when inflected forms aren't entry-worthy, e.g.: in Vulgar Latin
local nolinkinfl = part.face == "hypothetical" or (part.nolink and track("nolink") or part.nolinkinfl) or (
data.nolink and track("nolink") or data.nolinkinfl)
local formatted
if part.label then
-- FIXME: There should be a better way of italicizing a label. As is, this isn't customizable.
formatted = "<i>" .. part.label .. "</i>"
else
-- Convert the term into a full link. Don't show a transliteration here unless enable_auto_translit is
-- requested, either at the `parts` level (i.e. per inflection) or at the `data.inflections` level (i.e.
-- specified for all inflections). This is controllable in {{head}} using autotrinfl=1 for all inflections,
-- or fNautotr=1 for an individual inflection (remember that a single inflection may be associated with
-- multiple terms). The reason for doing this is to avoid clutter in headword lines by default in languages
-- where the script is relatively straightforward to read by learners (e.g. Greek, Russian), but allow it
-- to be enabled in languages with more complex scripts (e.g. Arabic).
--
-- FIXME: With nested inflections, should we also respect `enable_auto_translit` at the top level of the
-- nested inflections structure?
local tr = part.tr or not (parts.enable_auto_translit or data.inflections.enable_auto_translit) and "-" or nil
-- FIXME: Temporary errors added 2025-10-03. Remove after a month or so.
if part.translit then
error("Internal error: Use field `tr` not `translit` for specifying an inflection part translit")
end
if part.transcription then
error("Internal error: Use field `ts` not `transcription` for specifying an inflection part transcription")
end
local postprocess_annotations
if part.inflections then
postprocess_annotations = function(infldata)
insert(infldata.annotations, format_inflections(data, part.inflections))
end
end
formatted = full_link(
{
term = not nolinkinfl and part.term or nil,
alt = part.alt or (nolinkinfl and part.term or nil),
lang = part.lang or data.lang,
sc = part.sc or parts.sc or nil,
gloss = part.gloss,
pos = part.pos,
lit = part.lit,
id = part.id,
genders = part.genders,
tr = tr,
ts = part.ts,
accel = partaccel or parts.accel,
postprocess_annotations = postprocess_annotations,
},
face
)
end
parts[j] = format_term_with_qualifiers_and_refs(part.lang or data.lang, part,
formatted, j)
end
local parts_output
if parts[1] then
parts_output = (parts.label and " " or "") .. concat(parts)
elseif parts.request then
parts_output = " <small>[please provide]</small>"
insert(data.categories, "Requests for inflections in " .. data.lang:getFullName() .. " entries")
else
parts_output = ""
end
local parts_label = parts.label and ("<i>" .. parts.label .. "</i>") or ""
return format_term_with_qualifiers_and_refs(data.lang, parts, parts_label .. parts_output, 1)
end
-- Format the inflections following the headword or nested after a given inflection. Declared local above.
function format_inflections(data, inflections)
if inflections and inflections[1] then
-- Format each inflection individually.
for key, infl in ipairs(inflections) do
inflections[key] = format_inflection_parts(data, infl)
end
return concat(inflections, ", ")
else
return ""
end
end
-- Format the top-level inflections following the headword. Currently this just adds parens around the
-- formatted comma-separated inflections in `data.inflections`.
local function format_top_level_inflections(data)
local result = format_inflections(data, data.inflections)
if result ~= "" then
return " (" .. result .. ")"
else
return result
end
end
-- Forward reference
local check_red_link_inflections
-- Check a single inflection (which consists of a label and zero or more terms, each possibly with nested inflections)
-- for red links. If so, insert a red-link category based on `plpos` (the plural part of speech to insert in the
-- category), stop further processing, and return true. If no red links found, return false.
local function check_red_link_inflection_parts(data, parts, plpos)
for _, part in ipairs(parts) do
if type(part) ~= "table" then
part = {term = part}
end
local term = part.term
if term and not term:find("%[%[") then
local stripped_physical_term = get_link_page(term, data.lang, part.sc or parts.sc or nil)
if stripped_physical_term then
local title = mw.title.new(stripped_physical_term)
if title and not title:getContent() then
insert(data.categories, data.lang:getFullName() .. " " .. plpos .. " with red links in their headword lines")
return true
end
end
end
if part.inflections then
if check_red_link_inflections(data, part.inflections, plpos) then
return true
end
end
end
return false
end
-- Check a set of inflections (each of which describes a single inflection of the term, such as feminine or plural, and
-- consists of a label and zero or more terms, each possibly with nested inflections) for red links. If so, insert a
-- red-link category based on `plpos` (the plural part of speech to insert in the category), stop further processing,
-- and return true. If no red links found, return false.
function check_red_link_inflections(data, inflections, plpos)
if inflections and inflections[1] then
-- Check each inflection individually.
for key, infl in ipairs(inflections) do
if check_red_link_inflection_parts(data, infl, plpos) then
return true
end
end
end
return false
end
-- Check the top-level inflections in `data.inflections`, along with any nested inflections, for red links. If so,
-- insert a red-link category based on `plpos` (the plural part of speech to insert in the category), stop further
-- processing, and return true. If no red links found, return false.
local function check_red_link_inflections_top_level(data, plpos)
return check_red_link_inflections(data, data.inflections, plpos)
end
--[==[
Returns the plural form of `pos`, a raw part of speech input, which could be singular or
plural. Irregular plural POS are taken into account (e.g. "kanji" pluralizes to
"kanji").
फिलहाल हिंदी विक्षनरी पर s लगा कर प्लूरल बनाने की आवश्यकता नहीं / यह मॉड्यूल:affix का प्रयोग करता था।
इसलिए इसे निरस्त रखा है।
function export.pluralize_pos(pos)
-- Make the plural form of the part of speech
return (m_data or get_data()).irregular_plurals[pos] or
pos:sub(-1) == "" and pos or
pluralize(pos)
end
]==]
--[==[
Return "lemma" if the given POS is a lemma, "non-lemma form" if a non-lemma form, or nil
if unknown. The POS passed in must be in its plural form ("nouns", "prefixes", etc.).
If you have a POS in its singular form, call {export.pluralize_pos()} above to pluralize it
in a smart fashion that knows when to add "-s" and when to add "-es", and also takes
into account any irregular plurals.
If `best_guess` is given and the POS is in neither the lemma nor non-lemma list, guess
based on whether it ends in " forms"; otherwise, return nil.
]==]
function export.pos_lemma_or_nonlemma(plpos, best_guess)
local m_headword_data = m_data or get_data()
local isLemma = m_headword_data.lemmas
-- Is it a lemma category?
if isLemma[plpos] then
return "लेम्मा"
end
local plpos_no_recon = plpos:gsub("^reconstructed ", "")
if isLemma[plpos_no_recon] then
return "लेम्मा"
end
-- Is it a nonlemma category?
local isNonLemma = m_headword_data.nonlemmas
if isNonLemma[plpos] or isNonLemma[plpos_no_recon] then
return "non-lemma form"
end
local plpos_no_mut = plpos:gsub("^mutated ", "")
if isLemma[plpos_no_mut] or isNonLemma[plpos_no_mut] then
return "non-lemma form"
elseif best_guess then
return plpos:find(" forms$") and "non-lemma form" or "लेम्मा"
else
return nil
end
end
--[==[
Canonicalize a part of speech as specified in 2= in {{tl|head}}. This checks for POS aliases and non-lemma form
aliases ending in 'f', and then pluralizes if the POS term does not have an invariable plural.
]==]
function export.canonicalize_pos(pos)
-- FIXME: Temporary code to throw an error for alias 'pre' (= preposition) that will go away.
if pos == "pre" then
-- Don't throw error on 'pref' as it's an alias for "prefix".
error("POS 'pre' for 'preposition' no longer allowed as it's too ambiguous; use 'prep'")
end
-- Likewise for pro = pronoun.
if pos == "pro" or pos == "prof" then
error("POS 'pro' for 'pronoun' no longer allowed as it's too ambiguous; use 'pron'")
end
local m_headword_data = m_data or get_data()
if m_headword_data.pos_aliases[pos] then
pos = m_headword_data.pos_aliases[pos]
elseif pos:sub(-1) == "f" then
pos = pos:sub(1, -2)
pos = (m_headword_data.pos_aliases[pos] or pos) .. " रूप"
end
return pos -- export.pluralize_pos(pos) यहाँ भी s लगाकर pluralize करने कीई आवश्यकता नहीं
end
-- Find and return the maximum index in the array `data[element]` (which may have gaps in it), and initialize it to a
-- zero-length array if unspecified. Check to make sure all keys are numeric (other than "maxindex", which is set by
-- [[Module:parameters]] for list parameters), all values are strings, and unless `allow_blank_string` is given,
-- no blank (zero-length) strings are present.
local function init_and_find_maximum_index(data, element, allow_blank_string)
local maxind = 0
if not data[element] then
data[element] = {}
end
local typ = type(data[element])
if typ ~= "table" then
error(("Internal error: In full_headword(), `data.%s` must be an array but is a %s"):format(element, typ))
end
for k, v in pairs(data[element]) do
if k ~= "maxindex" then
if type(k) ~= "number" then
error(("Internal error: Unrecognized non-numeric key '%s' in `data.%s`"):format(k, element))
end
if k > maxind then
maxind = k
end
if v then
if type(v) ~= "string" then
error(("Internal error: For key '%s' in `data.%s`, value should be a string but is a %s"):format(k, element, type(v)))
end
if not allow_blank_string and v == "" then
error(("Internal error: For key '%s' in `data.%s`, blank string not allowed; use 'false' for the default"):format(k, element))
end
end
end
end
return maxind
end
--[==[
-- Add the page to various maintenance categories for the language and the
-- whole page. These are placed in the headword somewhat arbitrarily, but
-- mainly because headword templates are mandatory for entries (meaning that
-- in theory it provides full coverage).
--
-- This is provided as an external entry point so that modules which transclude
-- information from other entries (such as {{tl|ja-see}}) can take advantage
-- of this feature as well, because they are used in place of a conventional
-- headword template.]==]
do
-- Handle any manual sortkeys that have been specified in raw categories
-- by tracking if they are the same or different from the automatically-
-- generated sortkey, so that we can track them in maintenance
-- categories.
local function handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
sortkey = sortkey or lang:makeSortKey(page.pagename)
-- If there are raw categories with no sortkey, then they will be
-- sorted based on the default MediaWiki sortkey, so we check against
-- that.
if tbl == true then
if page.raw_defaultsort ~= sortkey then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return
end
local redundant, different
for k in pairs(tbl) do
if k == sortkey then
redundant = true
else
different = true
end
end
if redundant then
insert(lang_cats, lang:getFullName() .. " terms with redundant sortkeys")
end
if different then
insert(lang_cats, lang:getFullName() .. " terms with non-redundant non-automated sortkeys")
end
return sortkey
end
function export.maintenance_cats(page, lang, lang_cats, page_cats)
extend(page_cats, page.cats)
lang = lang:getFull() -- since we are just generating categories
local canonical = lang:getCanonicalName()
local tbl = page.wikitext_topic_cat[lang:getCode()]
local sortkey = nil
if tbl then
sortkey = handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with topic categories using raw markup")
end
tbl = page.wikitext_langname_cat[canonical]
if tbl then
handle_raw_sortkeys(tbl, sortkey, page, lang, lang_cats)
insert(lang_cats, canonical .. " entries with language name categories using raw markup")
end
if get_current_L2() ~= canonical then
insert(lang_cats, canonical .. " प्रविष्टियाँ त्रुटिपूर्ण भाषा हेडर के साथ")
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/incorrect language header/LANGCODE]]
track("त्रुटिपूर्ण भाषा हेडर", lang)
end
end
end
--[==[This is the primary external entry point.
{{lua|full_headword(data)}}
This is used by {{temp|head}} and various language-specific headword templates (e.g. {{temp|ru-adj}} for Russian adjectives, {{temp|de-noun}} for German nouns, etc.) to display an entire headword line.
See [[#Further explanations for full_headword()]]
]==]
function export.full_headword(data)
-- Prevent data from being destructively modified.
data = shallow_copy(data)
------------ 1. Basic checks for old-style (multi-arg) calling convention. ------------
if data.getCanonicalName then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) of properties, not a language object")
end
if not data.lang or type(data.lang) ~= "table" or not data.lang.getCode then
error("Internal error: In full_headword(), the first argument `data` needs to be a Lua object (table) and `data.lang` must be a language object")
end
if data.id and type(data.id) ~= "string" then
error("Internal error: The id in the data table should be a string.")
end
------------ 2. Initialize pagename etc. ------------
local langcode = data.lang:getCode()
local full_langcode = data.lang:getFullCode()
local langname = data.lang:getCanonicalName()
local full_langname = data.lang:getFullName()
local raw_pagename = data.pagename
local page
local m_headword_data = m_data or get_data()
if raw_pagename and raw_pagename ~= m_headword_data.pagename then -- for testing, doc pages, etc.
-- data.pagename is often set on documentation and test pages through the pagename= parameter of various
-- templates, to emulate running on that page. Having a large number of such test templates on a single
-- page often leads to timeouts, because we fetch and parse the contents of each page in turn. However,
-- we don't really need to do that and can function fine without fetching and parsing the contents of a
-- given page, so turn off content fetching/parsing (and also setting the DEFAULTSORT key through a parser
-- function, which is *slooooow*) in certain namespaces where test and documentation templates are likely to
-- be found and where actual content does not live (User, Template, Module).
local actual_namespace = m_headword_data.page.namespace
local no_fetch_content = actual_namespace == "सदस्य" or actual_namespace == "साँचा" or
actual_namespace == "मॉड्यूल"
page = process_page(raw_pagename, no_fetch_content)
else
page = m_headword_data.page
end
local namespace = page.namespace
if data.altform then
-- Temporary tracking for use of old altform=
track("altform", data.lang)
end
local is_varform_only = data.var and data.var ~= "both"
local is_varform_both = data.var == "both"
------------ 3. Initialize `data.heads` table; if old-style, convert to new-style. ------------
if type(data.heads) == "table" and type(data.heads[1]) == "table" then
-- new-style
if data.translits or data.transcriptions then
error("Internal error: In full_headword(), if `data.heads` is new-style (array of head objects), `data.translits` and `data.transcriptions` cannot be given")
end
else
-- convert old-style `heads`, `translits` and `transcriptions` to new-style
local maxind = max(
init_and_find_maximum_index(data, "heads"),
init_and_find_maximum_index(data, "translits", true),
init_and_find_maximum_index(data, "transcriptions", true)
)
for i = 1, maxind do
data.heads[i] = {
term = data.heads[i],
tr = data.translits[i],
ts = data.transcriptions[i],
}
end
end
-- Make sure there's at least one head.
if not data.heads[1] then
data.heads[1] = {}
end
------------ 4. Initialize and validate `data.categories` and `data.whole_page_categories`, and determine `pos_category` if not given, and add basic categories. ------------
init_and_find_maximum_index(data, "श्रेणियाँ")
init_and_find_maximum_index(data, "whole_page_categories")
local pos_category_already_present = false
if data.categories[1] then
local escaped_langname = pattern_escape(full_langname)
local matches_lang_pattern = "^" .. escaped_langname .. " "
for _, cat in ipairs(data.categories) do
-- Does the category begin with the language name? If not, tag it with a tracking category.
if not cat:find(matches_lang_pattern) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/no lang category/LANGCODE]]
track("no lang category", data.lang)
end
end
-- If `pos_category` not given, try to infer it from the first specified category. If this doesn't work, we
-- throw an error below.
if not data.pos_category and data.categories[1]:find(matches_lang_pattern) then
data.pos_category = data.categories[1]:gsub(matches_lang_pattern, "")
-- Optimization to avoid inserting category already present.
pos_category_already_present = true
end
end
if not data.pos_category then
error("Internal error: `data.pos_category` not specified and could not be inferred from the categories given in "
.. "`data.categories`. Either specify the plural part of speech in `data.pos_category` "
.. "(e.g. \"proper nouns\") or ensure that the first category in `data.categories` is formed from the "
.. "language's canonical name plus the plural part of speech (e.g. \"Norwegian Bokmål proper nouns\")."
)
end
-- Insert a category at the beginning for the part of speech unless it's already present or `data.noposcat` given.
if not pos_category_already_present and not data.noposcat and not is_varform_only then
local pos_category = full_langname .. " " .. data.pos_category
-- FIXME: [[User:Theknightwho]] Why is this special case here? Please add an explanatory comment.
if pos_category ~= "Translingual Han characters" then
insert(data.categories, 1, pos_category)
end
end
-- Try to determine whether the part of speech refers to a lemma or a non-lemma form; if we can figure this out,
-- add an appropriate category.
local postype = export.pos_lemma_or_nonlemma(data.pos_category)
if not postype then
-- We don't know what this category is, so tag it with a tracking category.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANGCODE]]
track("unrecognized pos", data.lang)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/POS/LANGCODE]]
track("unrecognized pos/pos/" .. data.pos_category, data.lang)
elseif not data.noposcat and not is_varform_only then
insert(data.categories, 1, full_langname .. " " .. postype .. "")
end
-- Categorize variant forms into 'variant lemmas' or 'variant non-lemma forms'. Originally proposed in
-- [[Wiktionary:Beer parlour/2024/June#Decluttering the altform mess]] as 'alternative forms'; renamed in
-- [[Wiktionary:Beer parlour/2026/July#Renaming the "alternative forms" categories]].
if (is_varform_only or is_varform_both) and postype then
insert(data.categories, 1, full_langname .. " वैरिएंट " .. postype .. "")
end
------------ 5. Create a default headword, and add links to multiword page names. ------------
-- Determine if this is an "anti-asterisk" term, i.e. an attested term in a language that must normally be
-- reconstructed.
local is_anti_asterisk = data.heads[1].term and data.heads[1].term:find("^!!")
local lang_reconstructed = data.lang:hasType("reconstructed")
if is_anti_asterisk then
if not lang_reconstructed then
error("Anti-asterisk feature (head= beginning with !!) can only be used with reconstructed languages")
end
lang_reconstructed = false
end
-- Determine if term is reconstructed
local is_reconstructed = namespace == "Reconstruction" or lang_reconstructed
-- Create a default headword based on the pagename, which is determined in
-- advance by the data module so that it only needs to be done once.
local default_head = page.pagename
-- Add links to multi-word page names when appropriate
if not (is_reconstructed or data.nolinkhead) then
local no_links = m_headword_data.no_multiword_links
if not (no_links[langcode] or no_links[full_langcode]) and export.head_is_multiword(default_head) then
default_head = export.add_multiword_links(default_head, true)
end
end
if is_reconstructed then
default_head = "*" .. default_head
end
------------ 6. Check the namespace against the language type. ------------
if namespace == "" then
if lang_reconstructed then
error("Entries in " .. langname .. " must be placed in the Reconstruction: namespace")
elseif data.lang:hasType("appendix-constructed") then
error("Entries in " .. langname .. " must be placed in the Appendix: namespace")
end
elseif namespace == "Citations" or namespace == "Thesaurus" then
error("Headword templates should not be used in the " .. namespace .. ": namespace.")
end
------------ 7. Fill in missing values in `data.heads`. ------------
-- True if any script among the headword scripts has spaces in it.
local any_script_has_spaces = false
-- True if any term has a redundant head= param.
local has_redundant_head_param = false
for _, head in ipairs(data.heads) do
------ 7a. If missing head, replace with default head.
if not head.term then
head.term = default_head
elseif head.term == default_head then
has_redundant_head_param = true
elseif is_anti_asterisk and head.term == "!!" then
-- If explicit head=!! is given, it's an anti-asterisk term and we fill in the default head.
head.term = "!!" .. default_head
elseif head.term:find("^[!?]$") then
-- If explicit head= just consists of ! or ?, add it to the end of the default head.
head.term = default_head .. head.term
end
head.term_no_initial_bang_bang = is_anti_asterisk and head.term:sub(3) or head.term
if is_reconstructed then
local head_term = head.term
if head_term:find("%[%[") then
head_term = remove_links(head_term)
end
if head_term:sub(1, 1) ~= "*" then
error("The headword '" .. head_term .. "' must begin with '*' to indicate that it is reconstructed.")
end
end
------ 7b. Try to detect the script(s) if not provided. If a per-head script is provided, that takes precedence,
------ otherwise fall back to the overall script if given. If neither given, autodetect the script.
local auto_sc = data.lang:findBestScript(head.term)
if (
auto_sc:getCode() == "None" and
find_best_script_without_lang(head.term):getCode() ~= "None"
) then
insert(data.categories, full_langname .. " टर्म गैर-स्टैंडर्ड लिपि में")
end
if not (head.sc or data.sc) then -- No script code given, so use autodetected script.
head.sc = auto_sc
else
if not head.sc then -- Overall script code given.
head.sc = data.sc
end
-- Track uses of sc parameter.
if head.sc:getCode() == auto_sc:getCode() then
track("redundant script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " टर्म दुहराव वाले लिपि कोड के साथ")
end
else
track("non-redundant manual script code", data.lang)
if not data.no_script_code_cat then
insert(data.categories, full_langname .. " terms with non-redundant manual script codes")
end
end
end
-- If using a discouraged character sequence, add to maintenance category.
if head.sc:hasNormalizationFixes() == true then
local composed_head = toNFC(head.term)
if head.sc:fixDiscouragedSequences(composed_head) ~= composed_head then
insert(data.whole_page_categories, "Pages using discouraged character sequences")
end
end
any_script_has_spaces = any_script_has_spaces or head.sc:hasSpaces()
------ 7c. Create automatic transliterations for any non-Latin headwords without manual translit given
------ (provided automatic translit is available, e.g. not in Persian or Hebrew).
-- Make transliterations
head.tr_manual = nil
-- Try to generate a transliteration if necessary
if head.tr == "-" then
head.tr = nil
else
local notranslit = m_headword_data.notranslit
if not (notranslit[langcode] or notranslit[full_langcode]) and head.sc:isTransliterated() then
head.tr_manual = not not head.tr
local text = head.term_no_initial_bang_bang
if not data.lang:link_tr(head.sc) then
text = remove_links(text)
end
local automated_tr = data.lang:transliterate(text, head.sc)
if automated_tr then
local manual_tr = head.tr
if manual_tr then
if remove_links(manual_tr) == remove_links(automated_tr) then
insert(data.categories, full_langname .. " terms with redundant transliterations")
else
insert(data.categories, full_langname .. " terms with non-redundant manual transliterations")
end
end
if not manual_tr then
head.tr = automated_tr
end
end
-- There is still no transliteration?
-- Add the entry to a cleanup category.
if not head.tr then
head.tr = "<small>transliteration needed</small>"
-- FIXME: No current support for 'Request for transliteration of Classical Persian terms' or similar.
-- Consider adding this support in [[Module:category tree/poscatboiler/data/entry maintenance]].
insert(data.categories, "Requests for transliteration of " .. full_langname .. " terms")
else
-- Otherwise, trim it.
head.tr = trim(head.tr)
end
end
end
-- Link to the transliteration entry for languages that require this.
if head.tr and data.lang:link_tr(head.sc) then
head.tr = full_link{
term = head.tr,
lang = data.lang,
sc = get_script("Latn"),
tr = "-"
}
end
end
------------ 8. Maybe tag the title with the appropriate script code, using the `display_title` mechanism. ------------
-- Assumes that the scripts in "toBeTagged" will never occur in the Reconstruction namespace.
-- (FIXME: Don't make assumptions like this, and if you need to do so, throw an error if the assumption is violated.)
-- Avoid tagging ASCII as Hani even when it is tagged as Hani in the headword, as in [[check]]. The check for ASCII
-- might need to be expanded to a check for any Latin characters and whitespace or punctuation.
local display_title
-- Where there are multiple headwords, use the script for the first. This assumes the first headword is similar to
-- the pagename, and that headwords that are in different scripts from the pagename aren't first. This seems to be
-- about the best we can do (alternatively we could potentially do script detection on the pagename).
local dt_script = data.heads[1].sc
local dt_script_code = dt_script:getCode()
local page_non_ascii = namespace == "" and not page.pagename:find("^[%z\1-\127]+$")
local unsupported_pagename, unsupported = page.full_raw_pagename:gsub("^Unsupported titles/", "")
if unsupported == 1 and page.unsupported_titles[unsupported_pagename] then
display_title = 'Unsupported titles/<span class="' .. dt_script_code .. '">' .. page.unsupported_titles[unsupported_pagename] .. '</span>'
elseif page_non_ascii and m_headword_data.toBeTagged[dt_script_code]
or (dt_script_code == "Jpan" and (text_in_script(page.pagename, "Hira") or text_in_script(page.pagename, "Kana")))
or (dt_script_code == "Kore" and text_in_script(page.pagename, "Hang")) then
display_title = '<span class="' .. dt_script_code .. '">' .. page.full_raw_pagename .. '</span>'
-- Keep Han entries region-neutral in the display title.
elseif page_non_ascii and (dt_script_code == "Hant" or dt_script_code == "Hans") then
display_title = '<span class="Hani">' .. page.full_raw_pagename .. '</span>'
elseif namespace == "Reconstruction" then
local matched
display_title, matched = ugsub(
page.full_raw_pagename,
"^(Reconstruction:[^/]+/)(.+)$",
function(before, term)
return before .. tag_text(term, data.lang, dt_script)
end
)
if matched == 0 then
display_title = nil
end
end
-- FIXME: Generalize this.
-- If the current language uses Aran (Nastaliq), e.g. Urdu, and there's more than one language on the page, don't
-- set the display title because we don't want Nastaliq for terms that also exist in other languages that don't
-- display in Nastaliq (e.g. Arabic or Persian). Because the word "Urdu" occurs near the end of the alphabet, Urdu
-- fonts tend to override the fonts of other languages. FIXME: This is checking for more than one language on the
-- page but instead needs to check if there are any languages using scripts other than Aran.
if dt_script_code == "Aran" and page.L2_list.n > 1 then
display_title = nil
end
if display_title then
mw.getCurrentFrame():callParserFunction(
"DISPLAYTITLE",
display_title
)
end
------------ 9. Insert additional categories. ------------
if data.force_cat_output then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/force cat output]]
track("force cat output")
end
if has_redundant_head_param then
if not data.no_redundant_head_cat then
-- This is not the right way to go about this; too many exceptions and problems due to language-specific headword
-- handling customization. If we want this, it should be opt-in by a given language passing in the default headword.
-- insert(data.categories, full_langname .. " terms with redundant head parameter")
end
end
-- If the first head is multiword (after removing links), maybe insert into "LANG multiword terms".
if not data.nomultiwordcat and not is_varform_only and any_script_has_spaces and postype == "lemma" then
local no_multiword_cat = m_headword_data.no_multiword_cat
if not (no_multiword_cat[langcode] or no_multiword_cat[full_langcode]) then
-- Check for spaces or hyphens, but exclude prefixes and suffixes.
-- Use the pagename, not the head= value, because the latter may have extra
-- junk in it, e.g. superscripted text that throws off the algorithm.
local no_hyphen = m_headword_data.hyphen_not_multiword_sep
-- Exclude hyphens if the data module states that they should for this language.
local checkpattern = (no_hyphen[langcode] or no_hyphen[full_langcode]) and ".[%s፡]." or ".[%s%-፡]."
local is_multiword = umatch(page.pagename, checkpattern)
if is_multiword and not non_categorizable(page.full_raw_pagename) then
insert(data.categories, full_langname .. " कई शब्द वाले टर्म")
elseif not is_multiword then
local long_word_threshold = m_headword_data.long_word_thresholds[langcode] or
m_headword_data.long_word_thresholds[full_langcode]
if long_word_threshold and ulen(page.pagename) >= long_word_threshold then
insert(data.categories, "लंबे " .. full_langname .. " शब्द")
end
end
end
end
-- Determine whether to insert a category 'LANGNAME POS in SCRIPT'. If there are multiple heads, we may need to check
-- each head, as the heads may (theoretically) have different scripts.
local default_sccat = m_headword_data.default_sccat
if data.sccat or not is_varform_only and (default_sccat[langcode] or langcode ~= full_langcode and default_sccat[full_langcode]) then
local function needs_sccat(sccat_entry, sc)
if sccat_entry == true or not sccat_entry then
return sccat_entry
end
if type(sccat_entry) == "table" then
local in_list = contains(sccat_entry, sc:getCode())
if sccat_entry[1] == "not" then
in_list = not in_list
end
return in_list
end
return nil
end
for _, head in ipairs(data.heads) do
-- First check the `sccat` specified at the {{head}} level.
local this_needs_sccat = needs_sccat(data.sccat, head.sc)
-- If that wasn't given, check the default sccat at the language level for the lang code.
if this_needs_sccat == nil and not is_varform_only then
this_needs_sccat = needs_sccat(default_sccat[langcode], head.sc)
end
-- If that wasn't found and the lang code is an etym code, check the default sccat at the parent language level.
if this_needs_sccat == nil and not is_varform_only and langcode ~= full_langcode then
this_needs_sccat = needs_sccat(default_sccat[full_langcode], head.sc)
end
if this_needs_sccat then
insert(data.categories, full_langname .. " " .. data.pos_category .. " in " ..
head.sc:getDisplayForm(data.lang))
end
end
end
-- Reconstructed terms often use weird combinations of scripts and realistically aren't spelled so much as notated.
if namespace ~= "Reconstruction" and not is_varform_only then
-- Map from languages to a string containing the characters to ignore when considering whether a term has
-- multiple written scripts in it. Typically these are Greek or Cyrillic letters used for their phonetic
-- values.
local characters_to_ignore = {
["aaq"] = "αάὰ", -- Penobscot (Algonquian)
["acy"] = "δθ", -- Cypriot Arabic
["aez"] = "β", -- Aeka (Trans-New Guinea)
["anc"] = "γ", -- Ngas (Chadic/Afroasiatic)
["aou"] = "χ", -- A'ou (Kra-Dai)
["art-blk"] = "ч", -- Bolak (conlang)
["awg"] = "β", -- Anguthimri (Pama-Nyungan)
["az"] = "ь", -- Azerbaijani (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ba"] = "ь", -- Bashkir (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["bhp"] = "β", -- Bima (Austronesian)
["bjz"] = "β", -- Baruga (Trans-New Guinea)
["byk"] = "θ", -- Biao (Kra-Dai)
["cdy"] = "θ", -- Chadong (Kra-Dai)
["chp"] = "θ", -- Chipewyan (Athabaskan)
["cjh"] = "χ", -- Upper Chehalis (Salishan)
["clm"] = "χ", -- Klallam (Salishan)
["col"] = "χ", -- Colombia-Wenatchi (Salishan)
["coo"] = "χθ", -- Comox (Salishan)
["crx"] = "θ", -- Carrier (Athabaskan)
["ets"] = "θ", -- Yekhee (Edoid/Niger-Congo)
["ett"] = "χ", -- Etruscan (isolate; in romanizations)
["fla"] = "χ", -- Montana Salish (Salishan)
["grt"] = "་", -- Garo (South Asian Sino-Tibetan)
["gmw-gts"] = "χ", -- Gottscheerish (Bavarian variant spoken in Slovenia)
["hur"] = "χθ", -- Halkomelem (Salishan)
["itc-psa"] = "f", -- Pre-Samnite (Italic; normally written in Greek)
["izh"] = "ь", -- Ingrian (Finnic)
["kic"] = "θ", -- Kickapoo (Algonquian)
["kk"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["ky"] = "ь", -- Kyrgyz (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["lil"] = "χ", -- Lillooet (Salishan)
["lsi"] = "ꓹ", -- Lashi (Lolo-Burmese/Sino-Tibetan; represents a glottal stop)
["mhz"] = "β", -- Mor (Austronesian)
["mqn"] = "β", -- Moronene (Austronesian)
["neg"]= "ӡā", -- Negidal (Tungusic; normally in Cyrillic)
["oka"] = "χ", -- Okanagan (Salishan)
["ole"] = "θ", -- Olekha (Sino-Tibetan)
["oui"] = "γβ", -- Old Uyghur (Turkic; FIXME: others? E.g. Greek delta (δ)?)
["pox"] = "χ", -- Polabian (West Slavic)
["rif"] = "ε", -- Tarifit (Berber)
["rom"] = "Θθ", -- Romani (Indic: International Standard; two different thetas???)
["rpn"] = "β", -- Repanbitip (Austronesian)
["sah"] = "ь", -- Yakut (Turkic; 1929 - 1939 Latin spelling)
["sit-jap"] = "χ", -- Japhug (Sino-Tibetan)
["sjw"] = "θ", -- Shawnee (Algonquian)
["squ"] = "χ", -- Squamish (Salishan)
["str"] = "χθ", -- Saanich (Salishan)
["teh"] = "χ", -- Tehuelche (Chonan; spoken in Argentina)
["tep"] = "η", -- Tepecano (Uto-Aztecan)
["thp"] = "χ", -- Thompson (Salishan)
["tk"] = "ь", -- Turkmen (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["tt"] = "ь", -- Kazakh (Turkic; Yañalif Latin spelling, c. 1928 - 1938)
["twa"] = "χ", -- Twana (Salishan)
["wbl"] = "ы", -- Wakhi (Iranian)
["xbc"] = "ϸ", -- Bactrian (Iranian; represents š; normally written in Greek)
["yha"] = "θ", -- Baha (Kra-Dai)
["za"] = "зч", -- Zhuang (Tai/Kra-Dai); 1957-1982 alphabet used two Cyrillic letters (as well as some others like
-- ƃ, ƅ, ƨ, ɯ and ɵ that look like Cyrillic or Greek but are actually Latin)
["zlw-slv"] = "χђћ", -- Slovincian (West Slavic; FIXME: χ is Greek, the other two are Cyrillic, but I'm not sure
-- the currect characters are being chosen in the entry names)
["zng"] = "θ", -- Mang (Mon-Khmer)
["ztp"] = "θ", -- Loxicha Zapotec (Zapotecan)
}
-- Determine how many real scripts are found in the pagename, where we exclude symbols and such. We exclude
-- scripts whose `character_category` is false as well as Zmth (mathematical notation symbols), which has a
-- category of "Mathematical notation symbols". When counting scripts, we need to elide language-specific
-- variants because e.g. Beng and as-Beng have slightly different characters but we don't want to consider them
-- two different scripts (e.g. [[এৰ]] has two characters which are detected respectively as Beng and as-Beng).
local seen_scripts = {}
local num_seen_scripts = 0
local num_loops = 0
local canon_pagename = page.pagename
local ch_to_ignore = characters_to_ignore[full_langcode]
if ch_to_ignore then
canon_pagename = ugsub(canon_pagename, "[" .. ch_to_ignore .. "]", "")
end
while true do
if canon_pagename == "" or num_seen_scripts >= 2 or num_loops >= 10 then
break
end
-- Make sure we don't get into a loop checking the same script over and over again; happens with e.g. [[ᠪᡳ]]
num_loops = num_loops + 1
local pagename_script = find_best_script_without_lang(canon_pagename, "None only as last resort")
local script_chars = pagename_script.characters
if not script_chars then
-- we are stuck; this happens with None
break
end
local script_code = pagename_script:getCode()
local replaced
canon_pagename, replaced = ugsub(canon_pagename, "[" .. script_chars .. "]", "")
if (
replaced and
script_code ~= "Zmth" and
(script_data or get_script_data())[script_code] and
script_data[script_code].character_category ~= false
) then
script_code = script_code:gsub("^.-%-", "")
if not seen_scripts[script_code] then
seen_scripts[script_code] = true
num_seen_scripts = num_seen_scripts + 1
end
end
end
if num_seen_scripts > 1 then
insert(data.categories, full_langname .. " टर्म कई लिपियों में लिखे जाने वाले")
end
end
-- Categorise for unusual characters. Takes into account combining characters, so that we can categorise for characters with diacritics that aren't encoded as atomic characters (e.g. U̠). These can be in two formats: single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character + diacritic(s) + character). Each can have any number of diacritics.
local standard = data.lang:getStandardCharacters()
if not is_varform_only and standard and not non_categorizable(page.full_raw_pagename) then
local function char_category(char)
local specials = {
["#"] = "number sign",
["("] = "parentheses",
[")"] = "parentheses",
["<"] = "angle brackets",
[">"] = "angle brackets",
["["] = "square brackets",
["]"] = "square brackets",
["_"] = "underscore",
["{"] = "braces",
["|"] = "vertical line",
["}"] = "braces",
["ß"] = "ẞ",
["\205\133"] = "", -- this is UTF-8 for U+0345 ( ͅ)
["\239\191\189"] = "replacement character",
}
char = toNFD(char)
:gsub(".[\128-\191]*", function(m)
local new_m = specials[m]
new_m = new_m or m:uupper()
return new_m
end)
return toNFC(char)
end
if full_langcode ~= "hi" and full_langcode ~= "lo" then
local standard_chars_scripts = {}
for _, head in ipairs(data.heads) do
standard_chars_scripts[head.sc:getCode()] = true
end
-- Iterate over the scripts, in case there is more than one (as they can have different sets of standard characters).
for code in pairs(standard_chars_scripts) do
local sc_standard = data.lang:getStandardCharacters(code)
if sc_standard then
if page.pagename_len > 1 then
local explode_standard = {}
local function explode(char)
explode_standard[char] = true
return ""
end
local sc_standard_exploded = ugsub(sc_standard, page.comb_chars.combined_double, explode)
-- The following is correct; it relies on side-effecing the explode_standard[] table.
ugsub(sc_standard_exploded, page.comb_chars.combined_single, explode):gsub(".[\128-\191]*", explode)
local num_cat_inserted
for char in pairs(page.explode_pagename) do
if not explode_standard[char] then
if char:find("[0-9]") then
if not num_cat_inserted then
insert(data.categories, full_langname .. " terms spelled with numbers")
num_cat_inserted = true
end
elseif ufind(char, page.emoji_pattern) then
insert(data.categories, full_langname .. " terms spelled with emoji")
else
local upper = char_category(char)
if not explode_standard[upper] then
char = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. char)
end
end
end
end
-- If a diacritic doesn't appear in any of the standard characters, also categorise for it generally.
sc_standard = toNFD(sc_standard)
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_single) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic)
end
end
for diacritic in ugmatch(page.decompose_pagename, page.comb_chars.diacritics_double) do
if not umatch(sc_standard, diacritic) then
insert(data.categories, full_langname .. " terms spelled with ◌" .. diacritic .. "◌")
end
end
end
end
-- Ancient Greek, Hindi and Lao handled the old way for now, as their standard chars still need to be converted to the new format (because there are a lot of them).
elseif ulen(page.pagename) ~= 1 then
for character in ugmatch(page.pagename, "([^" .. standard .. "])") do
local upper = char_category(character)
if not umatch(upper, "[" .. standard .. "]") then
character = upper
end
insert(data.categories, full_langname .. " terms spelled with " .. character)
end
end
end
if not is_varform_only and data.heads[1].sc:isSystem("alphabet") then
local pagename, i = page.pagename:ulower(), 2
while umatch(pagename, "(%a)" .. ("%1"):rep(i)) do
i = i + 1
insert(data.categories, full_langname .. " terms with " .. i .. " consecutive instances of the same letter")
end
end
-- Categorise for palindromes
if not is_varform_only and not data.nopalindromecat and namespace ~= "Reconstruction" and ulen(page.pagename) > 2
-- FIXME: Use of first script here seems hacky. What is the clean way of doing this in the presence of
-- multiple scripts?
and is_palindrome(page.pagename, data.lang, data.heads[1].sc) then
insert(data.categories, full_langname .. " पैलिंड्रोम")
end
if namespace == "" and not lang_reconstructed then
for _, head in ipairs(data.heads) do
if page.full_raw_pagename ~= get_link_page(remove_links(head.term), data.lang, head.sc) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/headword/pagename spelling mismatch/LANGCODE]]
track("pagename spelling mismatch", data.lang)
break
end
end
end
-- Add red link category if called for and we're not a "large" page, where such checks are disabled.
if data.checkredlinks and not m_headword_data.large_pages[m_headword_data.pagename] then
local plposcat = type(data.checkredlinks) == "string" and data.checkredlinks or data.pos_category
check_red_link_inflections_top_level(data, plposcat)
end
-- Add to various maintenance categories.
export.maintenance_cats(page, data.lang, data.categories, data.whole_page_categories)
------------ 10. Format and return headwords, genders, inflections and categories. ------------
-- Format and return all the gathered information. This may add more categories (e.g. gender/number categories),
-- so make sure we do it before evaluating `data.categories`.
local text = '<span class="headword-line">' ..
format_headword(data) ..
format_headword_genders(data, is_varform_only) ..
format_top_level_inflections(data) .. '</span>'
-- Language-specific categories.
local cats = format_categories(
data.categories, data.lang, data.sort_key, page.encoded_pagename,
data.force_cat_output or test_force_categories, data.heads[1].sc
)
-- Language-agnostic categories.
local whole_page_cats = format_categories(
data.whole_page_categories, nil, "-"
)
return text .. cats .. whole_page_cats
end
return export
6w0fzb98z3jh236evvb6anqlkjvqe0j
मॉड्यूल:headword/data
828
302138
487802
487582
2026-09-02T18:37:11Z
SM7
6218
पार्ट्स ऑफ़ स्पीच में अंग्रेजी को alias बनाया और हिंदी नाम को मुख्य नाम रखा
487802
Scribunto
text/plain
local headword_page_module = "Module:headword/page"
local list_to_set = require("Module:table").listToSet
local data = {}
------ 1. Lists which are converted into sets. ------
--[==[ var:
Large pages where we disable label tracking, red link checking and similar.
]==]
data.large_pages = list_to_set {
-- pages that consistently hit timeouts
"a",
-- pages that sometimes hit timeouts
"A",
"baba",
"de",
"e",
"i",
"lima",
"o",
"u",
"и",
"山",
"子",
"月",
"一",
"人",
}
--[==[ var:
Map from singular to plural, and from plural to itself, for recognized parts of speech with irregular plurals. Most of
these are invariable plurals, e.g. `kanji` is its own plural; but we also have `mora` plural `morae`.
]==]
data.irregular_plurals = list_to_set({
"cmavo",
"cmene",
"fu'ivla",
"gismu",
"Han tu",
"hanja",
"hanzi",
"jyutping",
"kana",
"kanji",
"lujvo",
"phrasebook",
"pinyin",
"rafsi",
}, function(_, item)
return item
end)
local irregular_plurals = data.irregular_plurals
-- Irregular non-zero plurals AND any regular plurals where the singular ends in "s",
-- because the module assumes that inputs ending in "s" are plurals. The singular and
-- plural both need to be added, as the module will generate a default plural if
-- the input doesn't match a key in this table.
for sg, pl in next, {
mora = "morae"
} do
irregular_plurals[sg], irregular_plurals[pl] = pl, pl
end
--[==[ var:
Recognized lemmas. If the part of speech in {{tl|head}} is set to one of these or its singular equivalent, the category
'LANG lemmas' will automatically be added. If the part of speech is not a singular or plural lemma or non-lemma form and
is not an abbreviation that expands to a recognized lemma or non-lemma form, the page will be added to various tracking
categories:
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/LANG]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/pos/POS]]
* [[Special:WhatLinksHere/Wiktionary:Tracking/headword/unrecognized pos/pos/POS/LANG]]
]==]
data.lemmas = list_to_set{
"abbreviations",
"संक्षेपाक्षर",
"acronyms",
"लघुरूप",
"विशेषण",
"adnominals",
"adpositions",
"adverbs",
"क्रिया-विशेषण",
"affixes",
"ambipositions",
"articles",
"circumfixes",
"circumpositions",
"classifiers",
"cmavo",
"cmavo clusters",
"cmene",
"combining forms",
"conjunctions",
"संयोजक",
"counters",
"determiners",
"diacritical marks",
"डायक्रिटिक चिह्न",
"digraphs",
"equative adjectives",
"fu'ivla",
"gismu",
"Han characters",
"Han tu",
"hanja",
"hanzi",
"ideophones",
"idioms",
"infixes",
"initialisms",
"iteration marks",
"interfixes",
"interjections",
"विस्मयादिबोधक",
"kana",
"kanji",
"letters",
"वर्ण",
"ligatures",
"logograms",
"lujvo",
"morae",
"morphemes",
"non-constituents",
"संज्ञाएँ",
"numbers",
"संख्याएँ",
"numeral symbols",
"अंक चिह्न",
"numerals",
"अंक",
"particles",
"phrases",
"उद्गार",
"postpositions",
"परसर्ग",
"postpositional phrases",
"predicatives",
"prefixes",
"उपसर्ग",
"prepositional phrases",
"prepositions",
"preverbs",
"pronominal adverbs",
"pronouns",
"सर्वनाम",
"proper nouns",
"नामवाचक संज्ञाएँ",
"proverbs",
"punctuation marks",
"relatives",
"roots",
"धातुएँ",
"stems",
"प्रत्यय",
"suffixes",
"syllables",
"अक्षर",
"symbols",
"चिह्न",
"क्रियाएँ",
}
--[==[ var:
Recognized non-lemma forms. If the part of speech in {{tl|head}} is set to one of these or its singular equivalent, the
category 'LANG non-lemma forms' will automatically be added. If the part of speech is not a singular or plural lemma or
non-lemma form and is not an abbreviation that expands to a recognized lemma or non-lemma form, the page will be added
to various tracking categories; see the documentation of `data.lemmas`.
]==]
data.nonlemmas = list_to_set{
"active participle forms",
"active participles",
"adjectival participles",
"adjective case forms",
"adjective forms",
"adjective feminine forms",
"adjective plural forms",
"adverb forms",
"adverbial participles",
"agent participles",
"article forms",
"circumfix forms",
"combined forms",
"comparative adjective forms",
"comparative adjectives",
"comparative adverb forms",
"comparative adverbs",
"conjunction forms",
"contractions",
"converbs",
"determiner comparative forms",
"determiner forms",
"determiner superlative forms",
"diminutive nouns",
"elative adjectives",
"equative adjective forms",
"equative adjectives",
"future participles",
"gerunds",
"infinitive forms",
"infinitives",
"interjection forms",
"jyutping",
"misspellings",
"negative participles",
"nominal participles",
"noun case forms",
"noun construct forms",
"noun dual forms",
"noun forms",
"noun paucal forms",
"noun plural forms",
"noun possessive forms",
"noun singulative forms",
"numeral forms",
"participles",
"participle forms",
"particle forms",
"passive participles",
"past active participles",
"past adverbial participles",
"past participles",
"past participle forms",
"past passive participles",
"perfect active participles",
"perfect participles",
"perfect passive participles",
"pinyin",
"plurals",
"postposition forms",
"prefix forms",
"preposition contractions",
"preposition forms",
"prepositional pronouns",
"present active participles",
"present adverbial participles",
"present participles",
"present passive participles",
"preverb forms",
"pronoun forms",
"pronoun possessive forms",
"proper noun forms",
"proper noun plural forms",
"rafsi",
"romanizations",
"root forms",
"singulatives",
"suffix forms",
"superlative adjective forms",
"superlative adjectives",
"superlative adverb forms",
"superlative adverbs",
"verb forms",
"verbal nouns",
}
--[==[ var:
List of languages that will not have links to separate parts of the headword.
]==]
data.no_multiword_links = list_to_set{
"zh",
}
--[==[ var:
List of languages that will not have `LANG multiword terms` categories added. There are various reasons why languages
are in this list: (a) words are written without spaces between them; (b) syllables are written with spaces between them;
(c) variant reconstructions are notated with a tilde surrounded by spaces; (d) the language is a sign language, where
pagenames are multiword descriptions of the gesture(s) required to make an individual sign; (e) some other weirdnesses.
]==]
data.no_multiword_cat = list_to_set{
-------- Languages without spaces between words (sometimes spaces between phrases) --------
"blt", -- Tai Dam
"ja", -- Japanese
"khb", -- Lü
"km", -- Khmer
"lo", -- Lao
"mnw", -- Mon
"my", -- Burmese
"nan", -- Min Nan (some words in Latin script; hyphens between syllables)
"nan-hbl", -- Hokkien (some words in Latin script; hyphens between syllables)
"nod", -- Northern Thai
"ojp", -- Old Japanese
"shn", -- Shan
"sou", -- Southern Thai
"tdd", -- Tai Nüa
"th", -- Thai
"tts", -- Isan
"twh", -- Tai Dón
"txg", -- Tangut
"zh", -- Chinese (all varieties with Chinese characters)
"zkt", -- Khitan
-------- Languages with spaces between syllables --------
"ahk", -- Akha
"aou", -- A'ou
"atb", -- Zaiwa
"byk", -- Biao
"cdy", -- Chadong
--"duu", -- Drung; not sure
--"hmx-pro", -- Proto-Hmong-Mien
--"hnj", -- Green Hmong; not sure
"huq", -- Tsat
"ium", -- Iu Mien
--"lis", -- Lisu; not sure
"mtq", -- Muong
--"mww", -- White Hmong; not sure
"onb", -- Lingao
--"sit-gkh", -- Gokhy; not sure
--"swi", -- Sui; not sure
"tbq-lol-pro", -- Proto-Loloish
"tdh", -- Thulung
"ukk", -- Muak Sa-aak
"vi", -- Vietnamese
"yig", -- Wusa Nasu
"zng", -- Mang
-------- Languages with ~ with surrounding spaces used to separate variants --------
"mkh-ban-pro", -- Proto-Bahnaric
"sit-pro", -- Proto-Sino-Tibetan; listed above
-------- Other weirdnesses --------
"mul", -- Translingual; gestures, Morse code, etc.
"aot", -- Atong (India); bullet is a letter
-------- All sign languages --------
"ads",
"aed",
"aen",
"afg",
"ase",
"asf",
"asp",
"asq",
"asw",
"bfi",
"bfk",
"bog",
"bqn",
"bqy",
"bvl",
"bzs",
"cds",
"csc",
"csd",
"cse",
"csf",
"csg",
"csl",
"csn",
"csq",
"csr",
"doq",
"dse",
"dsl",
"ecs",
"esl",
"esn",
"eso",
"eth",
"fcs",
"fse",
"fsl",
"fss",
"gds",
"gse",
"gsg",
"gsm",
"gss",
"gus",
"hab",
"haf",
"hds",
"hks",
"hos",
"hps",
"hsh",
"hsl",
"icl",
"iks",
"ils",
"inl",
"ins",
"ise",
"isg",
"isr",
"jcs",
"jhs",
"jls",
"jos",
"jsl",
"jus",
"kgi",
"kvk",
"lbs",
"lls",
"lsl",
"lso",
"lsp",
"lst",
"lsy",
"lws",
"mdl",
"mfs",
"mre",
"msd",
"msr",
"mzc",
"mzg",
"mzy",
"nbs",
"ncs",
"nsi",
"nsl",
"nsp",
"nsr",
"nzs",
"okl",
"pgz",
"pks",
"prl",
"prz",
"psc",
"psd",
"psg",
"psl",
"pso",
"psp",
"psr",
"pys",
"rms",
"rsl",
"rsm",
"sdl",
"sfb",
"sfs",
"sgg",
"sgx",
"slf",
"sls",
"sqk",
"sqs",
"ssp",
"ssr",
"svk",
"swl",
"syy",
"tse",
"tsm",
"tsq",
"tss",
"tsy",
"tza",
"ugn",
"ugy",
"ukl",
"uks",
"vgt",
"vsi",
"vsl",
"vsv",
"xki",
"xml",
"xms",
"ygs",
"ysl",
"zib",
"zsl",
}
--[==[ var:
List of languages where a hyphen is not considered a word separator for the `LANG multiword terms` category. There are
numerous reasons why languages are in this list; by each language should be listed the reason for inclusion.
]==]
data.hyphen_not_multiword_sep = list_to_set{
"akk", -- Akkadian; hyphens between syllables
"akl", -- Aklanon; hyphens for mid-word glottal stops
"ber-pro", -- Proto-Berber; morphemes separated by hyphens
"ceb", -- Cebuano; hyphens for mid-word glottal stops
"cnk", -- Khumi Chin; hyphens used in single words
"cpi", -- Chinese Pidgin English; Chinese-derived words with hyphens between syllables
"de", -- German; too many false positives
"esx-esk-pro", -- hyphen used to separate morphemes
"fi", -- Finnish; hyphen used to separate components in compound words if the final and initial vowels match, respectively
"gd", -- Scottish Gaelic; too many false positives like [[a-chianaibh]], [[a-nìos]], [[an-dè]] and other adverbs in a- and an-
"hil", -- Hiligaynon; hyphens for mid-word glottal stops
"hnn", -- Hanunoo; too many false positives
"ilo", -- Ilocano; hyphens for mid-word glottal stops
"kne", -- Kankanaey; hyphens for mid-word glottal stops
"lcp", -- Western Lawa; dash as syllable joiner
"lwl", -- Eastern Lawa; dash as syllable joiner
"mfa", -- Pattani Malay in Thai script; dash as syllable joiner
"mkh-vie-pro", -- Proto-Vietic; morphemes separated by hyphens
"msb", -- Masbatenyo; too many false positives
"tl", -- Tagalog; too many false positives
"war", -- Waray-Waray; too many false positives
"yo", -- Yoruba; hyphens used to show lengthened nasal vowels
}
--[==[ var:
List of languages that will not have `LANG masculine nouns` and similar categories added. Generally, these languages are
lacking gender but use the gender field for other purposes. (This is a massive hack and should be changed.)
]==]
data.no_gender_cat = list_to_set{
-- Languages without gender but which use the gender field for other purposes
"ja",
"th",
}
--[==[ var:
List of languages where [[Module:headword]] should not attempt to generate a transliteration even if the term is written
in a non-Latin script. FIXME: Notate reasons why each language is in this list.
]==]
data.notranslit = list_to_set{
"ams",
"az",
"bbc",
"bug",
"cdo",
"cia",
"cjm",
"cjy",
"cmn",
"cnp",
"cpi",
"cpx",
"csp",
"czh",
"czo",
"gan",
"hak",
"hnm",
"hsn",
"ja",
"kzg",
"lad",
"ltc",
"luh",
"lzh",
"mnp",
"ms",
"mul",
"mvi",
"nan",
"nan-dat",
"nan-hbl",
"nan-hlh",
"nan-lnx",
"nan-tws",
"nan-zhe",
"nan-zsh",
"och",
"oj",
"okn",
"ryn",
"rys",
"ryu",
"sh",
"sjc",
"tgt",
"th",
"tkn",
"tly",
"txg",
"und",
"vi",
"wuu",
"xug",
"yoi",
"yox",
"yue",
"za",
"zh",
"zhx-sic",
"zhx-tai",
}
--[==[ var:
Languages where we track all direct uses of {{tl|head}} in place of a language-specific template, such as
{{tl|en-head}}, {{tl|hi-head}}, {{tl|sa-head}}, {{tl|tl-head}}.
]==]
data.track_head_template = list_to_set{
-- "en", -- when the time comes?
"hi",
"sa",
"tl",
}
--[==[ var:
List of script codes for which a script-tagged display title will be added.
]==]
data.toBeTagged = list_to_set{
"Ahom",
"Arab",
"fa-Arab",
"Aran",
"Armi",
"Armn",
"Avst",
"Bali",
"Bamu",
"Batk",
"Beng",
"as-Beng",
"Bopo",
"Brah",
"Brai",
"Bugi",
"Buhd",
"Cakm",
"Cans",
"Cari",
"Cham",
"Cher",
"Copt",
"Cprt",
"Cyrl",
"Cyrs",
"Deva",
"Dsrt",
"Egyd",
"Egyp",
"Ethi",
"Geok",
"Geor",
"Glag",
"Goth",
"Grek",
"Polyt",
"Gujr",
"Guru",
"Hang",
"Hani",
"Hano",
"Hebr",
"Hira",
"Hluw",
"Ital",
"Java",
"Kali",
"Kana",
"Khar",
"Khmr",
"Knda",
"Kthi",
"Lana",
"Laoo",
"Latn",
"Latf",
"Latg",
"pjt-Latn",
"Lepc",
"Limb",
"Linb",
"Lisu",
"Lyci",
"Lydi",
"Mand",
"Mani",
"Marc",
"Merc",
"Mero",
"Mlym",
"Mong",
"mnc-Mong",
"sjo-Mong",
"xwo-Mong",
"Mtei",
"Mymr",
"Narb",
"Nkoo",
"Nshu",
"Ogam",
"Olck",
"Orkh",
"Orya",
"Osma",
"Ougr",
"Palm",
"Phag",
"Phli",
"Phlv",
"Phnx",
"Plrd",
"Prti",
"Rjng",
"Runr",
"Samr",
"Sarb",
"Saur",
"Sgnw",
"Shaw",
"Shrd",
"Sinh",
"Sora",
"Sund",
"Sylo",
"Syrc",
"Tagb",
"Tale",
"Talu",
"Taml",
"Tang",
"Tavt",
"Telu",
"Tfng",
"Tglg",
"Thaa",
"Thai",
"Tibt",
"Ugar",
"Vaii",
"Xpeo",
"Xsux",
"Yiii",
"Zmth",
"Zsym",
"Ipach",
"Music",
"Rumin",
}
--[==[ var:
Parts of speech which will not be categorised in categories like `English terms spelled with É` if the term is the
character in question (e.g. the letter entry for English [[é]]). This contrasts with entries like the French adjective
[[m̂]], which is a one-letter word spelled with the letter.
]==]
data.pos_not_spelled_with_self = list_to_set{
"diacritical marks",
"Han characters",
"Han tu",
"hanja",
"hanzi",
"iteration marks",
"kana",
"kanji",
"letters",
"ligatures",
"logograms",
"morae",
"numeral symbols",
"numerals",
"punctuation marks",
"syllables",
"symbols",
}
------ 2. Lists not converted into sets. ------
--[==[ var:
List of languages that will default to `sccat` being true, i.e. categories like `LANG POS in SCRIPT script` will
automatically be generated. This can be overridden using {{para|sccat|0}} in {{tl|head}} or setting `sccat` to
{false} in Lua. If the value on the right-hand side is {true}, such categories will be generated for all scripts. If
{false}, no categories will be generated (this is useful for etym languages that override the spec of their parent). If
a list of scripts, such categories will be generated only for the specified scripts. If a list of scripts where the
first element is {"not"}, such categories will be generated for all scripts ''except'' the specified scripts.
]==]
data.default_sccat = {
["af"] = {"not", "Latn"},
["az"] = {"not", "Latn"},
["inc-apa"] = true,
["inc-ash"] = true,
["kfr"] = true,
["ks"] = true,
["mr"] = true,
["mwr"] = true,
["inc-oaw"] = true,
["inc-ohi"] = true,
["omr"] = true,
["inc-opa"] = true,
["phr"] = true,
["pi"] = true,
["pra"] = true,
["sa"] = true,
["skr"] = true,
["sd"] = true,
["yi"] = {"not", "Hebr"},
}
--[==[ var:
Recognized aliases for parts of speech (param 2=). Key is the short form and value is the canonical singular (not
pluralized) form. It is singular so the same table can be used in [[Module:form of]] for the {{para|p}}/{{para|POS}}
param and [[Module:links]] for the pos= param. Note that any part of speech, abbreviated or not, can be suffixed with
`f` to generate the corresponding non-lemma form part of speech, such as `adjf`, `af` or `adjectivef` for
`adjective form`, and `nounf` or `nf` for `noun form`. This expansion happens even when it does not make sense for the
given part of speech (e.g. `pclf` expands to `particle form` and `symf` expands to `symbol form`), and currently also,
at least in [[Module:headword]] (but not [[Module:links]]), even if the part before the `f` is not a recognized part of
speech or abbreviation (hence `nerf` expands to `ner form`).
]==]
data.pos_aliases = {
a = "adjective",
adj = "विशेषण",
adjective = "विशेषण",
adv = "adverb",
art = "article",
aug = "augmentative",
cls = "classifier",
compadj = "comparative adjective",
compadv = "comparative adverb",
compdet = "comparative determiner",
comppron = "comparative pronoun",
conj = "conjunction",
contr = "contraction",
conv = "converb",
det = "determiner",
dim = "diminutive",
infin = "infinitive", -- not inf, which is ambiguous due to infixes
int = "interjection",
interj = "interjection",
intj = "interjection",
n = "संज्ञाएँ",
nouns = "संज्ञाएँ",
noun = "संज्ञाएँ",
-- the next two support Algonquian languages; see also vii/vai/vti/vta below
na = "animate noun",
ni = "inanimate noun",
num = "numeral",
part = "participle",
pastpart = "past participle",
pastptcp = "past participle",
pcl = "particle",
phr = "phrase",
pn = "proper noun",
postp = "postposition",
pref = "prefix",
prep = "preposition",
prepphr = "prepositional phrase",
prespart = "present participle",
presptcp = "present participle",
pron = "pronoun",
prop = "proper noun",
proper = "proper noun",
propn = "proper noun",
ptcp = "participle",
rom = "romanization",
roman = "romanization",
romanisation = "romanization",
romanisations = "romanization",
suf = "suffix",
supadj = "superlative adjective",
supadv = "superlative adverb",
supdet = "superlative determiner",
suppron = "superlative pronoun",
sym = "symbol",
v = "क्रियाएँ",
vb = "क्रियाएँ",
verb = "क्रियाएँ",
vi = "intransitive verb",
vm = "modal verb",
vt = "transitive verb",
-- the next four support Algonquian languages
vii = "inanimate intransitive verb",
vai = "animate intransitive verb",
vti = "transitive inanimate verb",
vta = "transitive animate verb",
}
--[==[ var:
Map of parts of speech for which categories like `German masculine nouns` or `Russian imperfective verbs` will be
generated if the headword is of the appropriate gender/number. The map is used to canonicalize parts of speech for
categorization purposes; specifically, proper nouns categorizes like nouns.
]==]
data.pos_for_gender_number_cat = {
["संज्ञाएँ"] = "संज्ञाएँ",
["नामवाचक संज्ञाएँ"] = "nouns",
["suffixes"] = "प्रत्यय",
-- We include verbs because impf and pf are valid "genders".
["क्रियाएँ"] = "क्रियायें",
}
--[==[ var:
Lower limit for a "long" word in a particular language. Used to categorize terms into e.g.
[[:Category:Long English words]] automatically. Languages with no mapping here do not get categorized.
]==]
data.long_word_thresholds = {
["af"] = 20,
["bg"] = 20,
["cy"] = 25,
["de"] = 20,
["en"] = 25,
["es"] = 20,
["fr"] = 20,
["ka"] = 20,
["sv"] = 20,
["tl"] = 25,
}
------ 3. Page-wide processing (so that it only needs to be done once per page). ------
data.page = require(headword_page_module).process_page()
-- Set some page properties directly on `data` for ease of use.
data.pagename = data.page.pagename
data.encoded_pagename = data.page.encoded_pagename
return data
iiga4g8sq7ftugbvlu4lt6e4ocdv5ct
मॉड्यूल:etymology
828
302144
487878
478039
2026-09-03T10:10:27Z
SM7
6218
updating...
487878
Scribunto
text/plain
local export = {}
-- For testing
local force_cat = false
local debug_track_module = "Module:debug/track"
local languages_module = "Module:languages"
local links_module = "Module:links"
local pron_qualifier_module = "Module:pron qualifier"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local insert = table.insert
local new_title = mw.title.new
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function format_qualifiers(...)
format_qualifiers = require(pron_qualifier_module).format_qualifiers
return format_qualifiers(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_language_data_module_name(...)
get_language_data_module_name = require(languages_module).getDataModuleName
return get_language_data_module_name(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function language_link(...)
language_link = require(links_module).language_link
return language_link(...)
end
local function serial_comma_join(...)
serial_comma_join = require(table_module).serialCommaJoin
return serial_comma_join(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function track(page, code)
local tracking_page = "etymology/" .. page
debug_track(tracking_page)
if code then
debug_track(tracking_page .. "/" .. code)
end
end
local function join_segs(segs, conj)
if not segs[2] then
return segs[1]
elseif conj == "and" or conj == "or" then
return serial_comma_join(segs, {conj = conj})
end
local sep
if conj == "," or conj == ";" then
sep = conj .. " "
elseif conj == "/" then
sep = "/"
elseif conj == "~" then
sep = " ~ "
elseif conj then
error(("Internal error: Unrecognized conjunction \"%s\""):format(conj))
else
error(("Internal error: No value supplied for conjunction"):format(conj))
end
return concat(segs, sep)
end
-- Returns true if `lang` is the same as `source`, or a variety of it.
local function lang_is_source(lang, source)
return lang:getCode() == source:getCode() or lang:hasParent(source)
end
--[==[
Format one or more links as specified in `termobjs`, a list of term objects of the format accepted by `full_link()` in
[[Module:links]], additionally with optional qualifiers, labels and references. `conj` is used to join multiple terms
and must be specified if there is more than one term. `template_name` is the template name used in debug tracking and
must be specified. Optional `sourcetext` is text to prepend to the concatenated terms, separated by a space if the
concatenated terms are non-empty (which is always the case unless there is a single term with the value "-"). If
`qualifiers_labels_on_outside` is given, any qualifiers, labels or references specified in the first term go on the
outside of (i.e before) `sourcetext`; otherwise they will end up on the inside.
]==]
function export.format_links(termobjs, conj, template_name, sourcetext, qualifiers_labels_on_outside)
if not template_name then
error("Internal error: Must specify `template_name` to format_links()")
end
for i, termobj in ipairs(termobjs) do
if termobj.lang:hasType("family") or termobj.lang:getFamilyCode() == "qfa-sub" then
if termobj.term and termobj.term ~= "-" then
debug_track(template_name .. "/family-with-term")
end
termobj.term = "-"
end
if termobj.term == "-" then
--[=[
[[Special:WhatLinksHere/Wiktionary:Tracking/cognate/no-term]]
[[Special:WhatLinksHere/Wiktionary:Tracking/derived/no-term]]
[[Special:WhatLinksHere/Wiktionary:Tracking/borrowed/no-term]]
[[Special:WhatLinksHere/Wiktionary:Tracking/calque/no-term]]
]=]
debug_track(template_name .. "/no-term")
termobjs[i] = i == 1 and sourcetext or ""
else
if i == 1 and qualifiers_labels_on_outside and sourcetext then
termobj.pretext = sourcetext .. " "
sourcetext = nil
end
termobjs[i] = (i == 1 and sourcetext and sourcetext .. " " or "") ..
full_link(termobj, "term", nil, "show qualifiers")
end
end
return join_segs(termobjs, conj)
end
function export.get_display_and_cat_name(source, raw)
local display, cat_name
if source:getCode() == "und" then
display = "undetermined"
cat_name = "other languages"
elseif source:getCode() == "mul" then
display = raw and "translingual" or "[[w:Translingualism|translingual]]"
cat_name = "Translingual"
elseif source:getCode() == "mul-tax" then
display = raw and "taxonomic name" or "[[w:Biological nomenclature|taxonomic name]]"
cat_name = "taxonomic names"
else
display = raw and source:getCanonicalName() or source:makeWikipediaLink()
cat_name = source:getDisplayForm()
end
return display, cat_name
end
function export.insert_source_cat_get_display(data)
local categories, lang, source = data.categories, data.lang, data.source
local display, cat_name = export.get_display_and_cat_name(source, data.raw)
if lang and not data.nocat then
-- Add the category, but only if there is a current language
if not categories then
categories = {}
end
local langname = lang:getFullName()
-- If `lang` is an etym-only language, we need to check both it and its parent full language against `source`.
-- Otherwise if e.g. `lang` is Medieval Latin and `source` is Latin, we'll end up wrongly constructing a
-- category 'Latin terms derived from Latin'.
insert(categories, langname .. (
lang_is_source(lang, source) and " terms borrowed back into " .. cat_name or
" " .. (data.borrowing_type or "terms derived") .. " from " .. cat_name
))
end
return display, categories
end
function export.format_source(data)
local lang, sort_key = data.lang, data.sort_key
-- [[Special:WhatLinksHere/Wiktionary:Tracking/etymology/sortkey]]
if sort_key then
track("sortkey")
end
local display, categories = export.insert_source_cat_get_display(data)
if lang and not data.nocat then
-- Format categories, but only if there is a current language; {{cog}} currently gets no categories
categories = format_categories(categories, lang, sort_key, nil, data.force_cat or force_cat)
else
categories = ""
end
return "<span class=\"etyl\">" .. display .. categories .. "</span>"
end
--[==[
Format sources for etymology templates such as {{tl|bor}}, {{tl|der}}, {{tl|inh}} and {{tl|cog}}. There may potentially
be more than one source language (except currently {{tl|inh}}, which doesn't support it because it doesn't really
make sense). In that case, all but the last source language is linked to the first term, but only if there is such a
term and this linking makes sense, i.e. either (1) the term page exists after stripping diacritics according to the
source language in question, or (2) the result of stripping diacritics according to the source language in question
results in a different page from the same process applied with the last source language. For example, {{m|ru|соля́нка}}
will link to [[солянка]] but {{m|en|соля́нка}} will link to [[соля́нка]] with an accent, and since they are different
pages, the use of English as a non-final source with term 'соля́нка' will link to [[соля́нка]] even though it doesn't
exist, on the assumption that it is merely a redlink that might exist. If none of the above criteria apply, a non-final
source language will be linked to the Wikipedia entry for the language, just as final source languages always are.
`data` contains the following fields:
* `lang`: The destination language object into which the terms were borrowed, inherited or otherwise derived. Used for
categorization and can be nil, as with {{tl|cog}}.
* `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are
handled specially; see above.
* `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as
multiple term objects, the non-final source objects link to the first term object.
* `sort_key`: Sort key for categories. Usually nil.
* `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source
languages ('''in which case `categories` is destructively modified'''). If `lang` is nil, no categories will be
added.
* `nocat`: Don't add any categories to the page.
* `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {"and"}. Currently recognized
values are `and`, `or`, `,`, `;`, `/` and `~`.
* `borrowing_type`: Borrowing type used in categories, such as {"learned borrowings"}. Defaults to {"terms derived"}.
* `force_cat`: Force category generation on non-mainspace pages.
]==]
function export.format_sources(data)
local lang, sources, terms, borrowing_type, sort_key, categories, nocat =
data.lang, data.sources, data.terms, data.borrowing_type, data.sort_key, data.categories, data.nocat
local term1, sources_n, source_segs = terms[1], #sources, {}
local final_link_page
local term1_term, term1_sc = term1.term, term1.sc
if sources_n > 1 and term1_term and term1_term ~= "-" then
final_link_page = get_link_page(term1_term, sources[sources_n], term1_sc)
end
for i, source in ipairs(sources) do
local seg, display_term
if i < sources_n and term1_term and term1_term ~= "-" then
local link_page = get_link_page(term1_term, source, term1_sc)
display_term = (link_page ~= final_link_page) or (link_page and not not new_title(link_page):getContent())
end
-- TODO: if the display forms or transliterations are different, display the terms separately.
if display_term then
local display, this_cats = export.insert_source_cat_get_display{
lang = lang,
source = source,
borrowing_type = borrowing_type,
raw = true,
categories = categories,
nocat = nocat,
}
seg = language_link {
lang = source,
term = term1_term,
alt = display,
tr = "-",
}
if lang and not nocat then
-- Format categories, but only if there is a current language; {{cog}} currently gets no categories
this_cats = format_categories(this_cats, lang, sort_key, nil, data.force_cat or force_cat)
else
this_cats = ""
end
seg = "<span class=\"etyl\">" .. seg .. this_cats .. "</span>"
else
seg = export.format_source{
lang = lang,
source = source,
borrowing_type = borrowing_type,
sort_key = sort_key,
categories = categories,
nocat = nocat,
}
end
insert(source_segs, seg)
end
return join_segs(source_segs, data.sourceconj or "and")
end
-- Internal implementation of {{cognate}}/{{cog}} template.
function export.format_cognate(data)
return export.format_derived {
sources = data.sources,
terms = data.terms,
sort_key = data.sort_key,
sourceconj = data.sourceconj,
conj = data.conj,
template_name = "cognate",
force_cat = data.force_cat,
}
end
--[==[
Internal implementation of {{derived}}/{{der}} template. This dispThis is called externally from [[Module:affix]],
[[Module:affixusex]] and [[Module:see]] and needs to support qualifiers, labels and references on the outside
of the sources for use by those modules.
`data` contains the following fields:
* `lang`: The destination language object into which the terms were derived. Used for categorization and can be nil, as
with {{tl|cog}}; in this case, no categories are added.
* `sources`: List of source objects. Most commonly there is only one. If there are multiple, the non-final ones are
handled specially; see `format_sources()`.
* `terms`: List of term objects. Most commonly there is only one. If there are multiple source objects as well as
multiple term objects, the non-final source objects link to the first term object.
* `conj`: Conjunction used to separate multiple terms. '''Required'''. Currently recognized values are `and`, `or`, `,`,
`;`, `/` and `~`.
* `sourceconj`: Conjunction used to separate multiple source languages. Defaults to {"and"}. Currently recognized
values are as for `conj` above.
* `qualifiers_labels_on_outside`: If specified, any qualifiers, labels or references in the first term in `terms` will
be displayed on the outside of (before) the source language(s) in `sources`. Normally this should be specified if
there is only one term possible in `terms`.
* `template_name`: Name of the template invoking this function. Must be specified. Only used for tracking pages.
* `sort_key`: Sort key for categories. Usually nil.
* `categories`: Categories to add to the page. Additional categories may be added to `categories` based on the source
languages ('''in which case `categories` is destructively modified'''). If `lang` is nil, no categories will be
added.
* `nocat`: Don't add any categories to the page.
* `borrowing_type`: Borrowing type used in categories, such as {"learned borrowings"}. Defaults to {"terms derived"}.
* `force_cat`: Force category generation on non-mainspace pages.
]==]
function export.format_derived(data)
local terms = data.terms
local sourcetext = export.format_sources(data)
return export.format_links(terms, data.conj, data.template_name, sourcetext, data.qualifiers_labels_on_outside)
end
function export.insert_borrowed_cat(categories, lang, source)
if lang_is_source(lang, source) then
return
end
-- If both are the same, we want e.g. [[:Category:English terms borrowed back into English]] not
-- [[:Category:English terms borrowed from English]]; the former is inserted automatically by format_source().
-- The second parameter here doesn't matter as it only affects `display`, which we don't use.
insert(categories, lang:getFullName() .. " terms borrowed from " .. select(2, export.get_display_and_cat_name(source, "raw")))
end
-- Internal implementation of {{borrowed}}/{{bor}} template.
function export.format_borrowed(data)
local categories = {}
if not data.nocat then
local lang = data.lang
for _, source in ipairs(data.sources) do
export.insert_borrowed_cat(categories, lang, source)
end
end
data = shallow_copy(data)
data.categories = categories
return export.format_links(data.terms, data.conj, "borrowed", export.format_sources(data))
end
do
-- Generate the non-ancestor error message.
local function show_language(lang)
local retval = ("%s (%s)"):format(lang:makeCategoryLink(), lang:getCode())
if lang:hasType("etymology-only") then
retval = retval .. (" (an etymology-only language whose regular parent is %s)"):format(
show_language(lang:getParent()))
end
return retval
end
-- Check that `lang` has `otherlang` (which may be an etymology-only language) as an ancestor. Throw an error if
-- not. When `lang` is a family, verifies that `otherlang` is a language in that family.
function export.check_ancestor(lang, otherlang)
-- When `lang` is a family, verify `otherlang` is in that family or in its parent family.
if lang.hasType and lang:hasType("family") then
local family_code = lang:getCode()
local function in_family_code(fcode, other)
if not fcode or fcode == "" then return false end
if other.inFamily and other:inFamily(fcode) then return true end
if other.getFamilyCode and other:getFamilyCode() == fcode then return true end
return false
end
local in_family = in_family_code(family_code, otherlang)
if not in_family then
local parent_code
if lang.getParent then
local parent_family = lang:getParent()
if parent_family and parent_family.getCode then
parent_code = parent_family:getCode()
end
end
if not parent_code and family_code:find("-", 1, true) then
parent_code = family_code:match("^(.+)-[^-]+$")
end
if parent_code then
in_family = in_family_code(parent_code, otherlang)
end
end
if not in_family then
local other_display = (otherlang.getCanonicalName and otherlang:getCanonicalName()) or (otherlang.getCode and otherlang:getCode()) or tostring(otherlang)
local fam_display = (lang.getCanonicalName and lang:getCanonicalName()) or family_code
error(("%s is not in family %s; inherited ancestor under a family must be a language in that family or its parent family.")
:format(other_display, fam_display))
end
return
end
-- FIXME: I don't know if this function works correctly with etym-only languages in `lang`. I have fixed up
-- the module link code appropriately (June 2024) but the remaining logic is untouched.
if lang:hasAncestor(otherlang) then
-- [[Special:WhatLinksHere/Wiktionary:Tracking/etymology/variety]]
-- Track inheritance from varieties of Latin that shouldn't have any descendants (everything except Old Latin, Classical Latin and Vulgar Latin).
if otherlang:getFullCode() == "la" then
otherlang = otherlang:getCode()
if not (otherlang == "itc-ola" or otherlang == "la-cla" or otherlang == "la-vul") then
track("bad ancestor", otherlang)
end
end
return
end
local ancestors, postscript = lang:getAncestors()
local etym_module_link = lang:hasType("etymology-only") and "[[Module:etymology languages/data]] or " or ""
local module_link = "[[" .. get_language_data_module_name(lang:getFullCode()) .. "]]"
if not ancestors[1] then
postscript = show_language(lang) .. " has no ancestors."
else
local ancestor_list = {}
for _, ancestor in ipairs(ancestors) do
insert(ancestor_list, show_language(ancestor))
end
postscript = ("The ancestor%s of %s %s %s."):format(
ancestors[2] and "s" or "", lang:getCanonicalName(),
ancestors[2] and "are" or "is", concat(ancestor_list, " and "))
end
error(("%s is not set as an ancestor of %s in %s%s. %s")
:format(show_language(otherlang), show_language(lang), etym_module_link, module_link, postscript))
end
end
-- Internal implementation of {{inherited}}/{{inh}} template.
function export.format_inherited(data)
local lang, terms, nocat = data.lang, data.terms, data.nocat
local source = terms[1].lang
local categories = {}
if not nocat then
insert(categories, lang:getFullName() .. " terms inherited from " .. source:getCanonicalName())
end
export.check_ancestor(lang, source)
data = shallow_copy(data)
data.categories = categories
data.source = source
return export.format_links(terms, data.conj, "inherited", export.format_source(data))
end
-- Internal implementation of "misc variant" templates such as {{abbrev}}, {{clipping}}, {{reduplication}} and the like.
function export.format_misc_variant(data)
local lang, notext, terms, cats, parts = data.lang, data.notext, data.terms, data.cats, {}
if not notext then
insert(parts, data.text)
end
if terms[1] then
if not notext then
-- FIXME: If term is given as '-', we should consider displaying just "Clipping" not "Clipping of".
insert(parts, " " .. (data.oftext or "of"))
end
local termparts = {}
-- Make links out of all the parts.
for _, termobj in ipairs(terms) do
local result
if termobj.lang then
result = export.format_derived {
lang = lang,
terms = {termobj},
sources = termobj.termlangs or {termobj.lang},
template_name = "misc_variant",
qualifiers_labels_on_outside = true,
force_cat = data.force_cat,
}
else
termobj.lang = lang
result = export.format_links({termobj}, nil, "misc_variant")
end
table.insert(termparts, result)
end
local linktext = join_segs(termparts, data.conj)
if not notext and linktext ~= "" then
insert(parts, " ")
end
insert(parts, linktext)
end
local categories = {}
if not data.nocat and cats then
for _, cat in ipairs(cats) do
insert(categories, lang:getFullName() .. " " .. cat)
end
end
if categories[1] then
insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat))
end
return concat(parts)
end
-- Implementation of miscellaneous templates such as {{unknown}} and {{onomatopoeia}} that have no associated terms.
function export.format_misc_variant_no_term(data)
local parts = {}
if not data.notext then
insert(parts, data.title)
end
if not data.nocat and data.cat then
local lang, categories = data.lang, {}
insert(categories, lang:getFullName() .. " " .. data.cat)
insert(parts, format_categories(categories, lang, data.sort_key, nil, data.force_cat or force_cat))
end
return concat(parts)
end
return export
719oqh4cehi6zb4y8xnbsb9vtnae84e
मॉड्यूल:etymology/templates
828
302145
487880
487665
2026-09-03T10:12:02Z
SM7
6218
updating...
487880
Scribunto
text/plain
local export = {}
local require_when_needed = require("Module:require when needed")
local get_current_L2 = require_when_needed("Module:pages", "get_current_L2")
local get_lang_by_name = require_when_needed("Module:languages", "getByCanonicalName")
local is_content_page = require_when_needed("Module:pages", "is_content_page")
local process_params = require_when_needed("Module:parameters", "process")
local trim = mw.text.trim
local lower = mw.ustring.lower
local etymology_module = "Module:etymology"
local headword_data_module = "Module:headword/data"
local etymology_specialized_module = "Module:etymology/specialized"
local parameter_utilities_module = "Module:parameter utilities"
-- For testing
local force_cat = false
local allowed_conjs = {"and", "or", ",", "/", "~", ";"}
-- Sinitic lects (Mandarin, Cantonese, Hokkien, etc.) are full languages, but Chinese entries sit
-- under a single ==Chinese== L2, while romanization entries (pinyin, jyutping, pe̍h-ōe-jī) have lect
-- L2s, and content is often shared between them. Contact languages (Chinese-based creoles and mixed
-- languages) have their own L2s and are excluded.
local function is_sinitic(lang)
return lang:inFamily("zhx") and not lang:inFamily("qfa-cnt")
end
local content_page
local function is_content_page_cached()
if content_page == nil then
content_page = is_content_page(mw.title.getCurrentTitle())
end
return content_page
end
-- Throw an error if `lang` (the language of the entry) doesn't match
-- the L2 header that the template is invoked under.
local function check_lang_matches_L2(lang, nocat)
if nocat or not lang or lang:getCode() == "und" or (lang.hasType and lang:hasType("family")) then
return
end
local headword_data = mw.loadData(headword_data_module)
if headword_data.large_pages[headword_data.pagename] then
return
end
if not is_content_page_cached() then
return
end
local current_L2 = get_current_L2()
if not current_L2 then
return
end
local full_name = lang:getFullName()
if full_name == current_L2 then
return
end
-- Accept any Sinitic language under any Sinitic L2.
if is_sinitic(lang) then
local L2_lang = get_lang_by_name(current_L2)
if L2_lang and is_sinitic(L2_lang) then
return
end
end
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if lang:getFullCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", an etymology-only language whose full language is " ..
lang:getFullCode() .. " (" .. full_name .. ")"
end
error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").")
end
local function parse_etym_args(parent_args, base_params, has_dest_lang)
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "q", "l", "ref"}},
}
local sourcearg, termarg
if has_dest_lang then
sourcearg, termarg = 2, 3
else
sourcearg, termarg = 1, 2
end
local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {
params = base_params,
param_mods = param_mods,
raw_args = parent_args,
termarg = termarg,
track_module = "etymology",
lang = function(args)
return args[sourcearg][#args[sourcearg]]
end,
sc = "sc",
-- Don't do this, doesn't seem to make sense.
-- parse_lang_prefix = true,
make_separate_g_into_list = true,
splitchar = ",",
subitem_param_handling = "last",
}
-- If term param 3= is empty, there will be no terms in terms.terms. To facilitate further code and for
-- compatibility,, insert one. It will display as <small>[Term?]</small>.
if not terms.terms[1] then
terms.terms[1] = {
lang = args[sourcearg][#args[sourcearg]],
sc = args.sc,
}
end
return terms.terms, args
end
function export.parse_2_lang_args(parent_args, has_text, no_family)
local boolean = {type = "boolean"}
local params = {
[1] = {
required = true,
type = "language",
default = "und"
},
[2] = {
required = true,
sublist = true,
type = "language",
family = not no_family,
default = "und"
},
[3] = true,
[4] = {alias_of = "alt"},
[5] = {alias_of = "t"},
["senseid"] = true,
["nocat"] = boolean,
["sort"] = true,
["sourceconj"] = true,
["conj"] = {set = allowed_conjs, default = ","},
}
if has_text then
params["notext"] = boolean
params["nocap"] = boolean
end
local terms, args = parse_etym_args(parent_args, params, "has dest lang")
check_lang_matches_L2(args[1], args.nocat)
return terms, args
end
-- Implementation of deprecated {{etyl}}. Provided to make histories more legible.
function export.etyl(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = {type = "language", default = "en"},
["sort"] = {},
}
-- Empty language means English, but "-" means no language. Yes, confusing...
local args = frame:getParent().args
if args[2] and trim(args[2]) == "-" then
params[2] = nil
args = process_params({
[1] = args[1],
["sort"] = args.sort
}, params)
else
args = process_params(args, params)
end
check_lang_matches_L2(args[2])
return require(etymology_module).format_source {
lang = args[2],
source = args[1],
sort_key = args.sort,
force_cat = force_cat,
}
end
-- Implementation of {{derived}}/{{der}}.
function export.derived(frame)
local parent_args = frame:getParent().args
local terms, args = export.parse_2_lang_args(parent_args)
return require(etymology_module).format_derived {
lang = args[1],
sources = args[2],
terms = terms,
sort_key = args.sort,
nocat = args.nocat,
sourceconj = args.sourceconj,
conj = args.conj,
template_name = "derived",
force_cat = force_cat,
}
end
-- Implementation of {{borrowed}}/{{bor}}.
function export.borrowed(frame)
local parent_args = frame:getParent().args
local terms, args = export.parse_2_lang_args(parent_args)
return require(etymology_module).format_borrowed {
lang = args[1],
sources = args[2],
terms = terms,
sort_key = args.sort,
nocat = args.nocat,
sourceconj = args.sourceconj,
conj = args.conj,
force_cat = force_cat,
}
end
function export.inherited(frame)
local parent_args = frame:getParent().args
local terms, args = export.parse_2_lang_args(parent_args)
local sources = args[2]
if sources[2] then
-- Because this doesn't really make sense.
error("[[Template:inherited]] doesn't support multiple comma-separated sources")
end
return require(etymology_module).format_inherited {
lang = args[1],
terms = terms,
sort_key = args.sort,
nocat = args.nocat,
conj = args.conj,
force_cat = force_cat,
}
end
function export.cognate(frame)
local params = {
[1] = {
required = true,
sublist = true,
type = "language",
family = true,
default = "und"
},
[2] = true,
[3] = {alias_of = "alt"},
[4] = {alias_of = "t"},
sourceconj = true,
["conj"] = {set = allowed_conjs, default = ","},
sort = true,
}
local parent_args = frame:getParent().args
local terms, args = parse_etym_args(parent_args, params, false)
return require(etymology_module).format_cognate {
sources = args[1],
terms = terms,
sort_key = args.sort,
sourceconj = args.sourceconj,
conj = args.conj,
force_cat = force_cat,
}
end
function export.noncognate(frame)
return export.cognate(frame)
end
-- Supports various specialized types of borrowings, according to `frame.args.bortype`:
-- "learned" = {{lbor}}/{{learned borrowing}}
-- "semi-learned" = {{slbor}}/{{semi-learned borrowing}}
-- "orthographic" = {{obor}}/{{orthographic borrowing}}
-- "unadapted" = {{ubor}}/{{unadapted borrowing}}
-- "calque" = {{cal}}/{{calque}}
-- "partial-calque" = {{pcal}}/{{partial calque}}
-- "semantic-loan" = {{sl}}/{{semantic loan}}
-- "transliteration" = {{translit}}/{{transliteration}}
-- "phono-semantic-matching" = {{psm}}/{{phono-semantic matching}}
function export.specialized_borrowing(frame)
local parent_args = frame:getParent().args
local terms, args = export.parse_2_lang_args(parent_args, "has text")
local m_etymology_specialized = require(etymology_specialized_module)
return m_etymology_specialized.specialized_borrowing {
bortype = frame.args.bortype,
lang = args[1],
sources = args[2],
terms = terms,
sort_key = args.sort,
nocap = args.nocap,
notext = args.notext,
nocat = args.nocat,
sourceconj = args.sourceconj,
conj = args.conj,
senseid = args.senseid,
force_cat = force_cat,
}
end
-- Implementation of miscellaneous templates such as {{abbrev}}, {{back-formation}}, {{clipping}}, {{ellipsis}},
-- {{rebracketing}} and {{reduplication}} that have a single associated term.
function export.misc_variant(frame)
local iparams = {
["ignore-params"] = true,
text = {required = true},
oftext = true,
cat = {list = true}, -- allow and compress holes
conj = true,
}
local iargs = process_params(frame.args, iparams)
local boolean = {type = "boolean"}
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true,
[3] = {alias_of = "alt"},
[4] = {alias_of = "t"},
nocap = boolean, -- should be processed in the template itself
notext = boolean,
nocat = boolean,
conj = {set = allowed_conjs},
sort = true,
}
-- |ignore-params= parameter to module invocation specifies
-- additional parameter names to allow in template invocation, separated by
-- commas. They must consist of ASCII letters or numbers or hyphens.
local ignore_params = iargs["ignore-params"]
if ignore_params then
ignore_params = trim(ignore_params)
if not ignore_params:match("^[%w%-,]+$") then
error("Invalid characters in |ignore-params=: " .. ignore_params:gsub("[%w%-,]+", ""))
end
for param in ignore_params:gmatch("[%w%-]+") do
if params[param] then
error("Duplicate param |" .. param
.. " in |ignore-params=: already specified in params")
end
params[param] = true
end
end
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"link", "q", "l", "ref"}},
}
local parent_args = frame:getParent().args
local terms, args = m_param_utils.parse_term_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
track_module = "etymology",
-- Don't set lang here as we want to know whether there was a lang prefix or not.
sc = "sc",
parse_lang_prefix = true,
allow_multiple_lang_prefixes = true,
make_separate_g_into_list = true,
splitchar = ",",
subitem_param_handling = "last",
}
check_lang_matches_L2(args[1], args.nocat)
return require(etymology_module).format_misc_variant {
lang = args[1],
notext = args.notext,
text = iargs.text,
oftext = iargs.oftext,
terms = terms.terms,
sort_key = args.sort,
conj = args.conj or iargs.conj or "and",
nocat = args.nocat,
cats = iargs.cat,
force_cat = force_cat,
}
end
-- Implementation of miscellaneous templates such as {{doublet}} that can take multiple terms. Doesn't handle {{blend}}
-- or {{univerbation}}, which display + signs between elements and use compound_like in [[Module:affix/templates]].
function export.misc_variant_multiple_terms(frame)
local iparams = {
text = {required = true},
oftext = true,
cat = {list = true}, -- allow and compress holes
conj = true,
}
local iargs = process_params(frame.args, iparams)
local boolean = {type = "boolean"}
local params = {
[1] = {required = true, type = "language", template_default = "und"},
[2] = {list = true, allow_holes = true},
nocap = boolean, -- should be processed in the template itself
notext = boolean,
nocat = boolean,
conj = {set = allowed_conjs},
sort = true,
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
-- We want to require an index for all params.
{default = true, require_index = true},
{group = {"link", "q", "l", "ref"}},
}
local parent_args = frame:getParent().args
local terms, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 2,
parse_lang_prefix = true,
allow_multiple_lang_prefixes = true,
track_module = "etymology-templates-doublet",
disallow_custom_separators = true,
-- For compatibility, we need to not skip completely unspecified items. It is common, for example, to do
-- {{suffix|lang||foo}} to generate "+ -foo".
dont_skip_items = true,
-- Don't set lang here as we want to know whether there was a lang prefix or not.
sc = "sc.default",
}
check_lang_matches_L2(args[1], args.nocat)
return require(etymology_module).format_misc_variant {
lang = args[1],
notext = args.notext,
text = iargs.text,
oftext = iargs.oftext,
terms = terms,
sort_key = args.sort,
conj = args.conj or iargs.conj or "and",
nocat = args.nocat,
cats = iargs.cat,
force_cat = force_cat,
}
end
-- Implementation of miscellaneous templates such as {{unknown}} that have no associated terms.
do
local function get_args(frame)
local boolean = {type = "boolean"}
local params = {
[1] = {required = true, type = "language", default = "und"},
["title"] = true,
["nocap"] = boolean, -- should be processed in the template itself
["notext"] = boolean,
["nocat"] = boolean,
["sort"] = true,
}
if frame.args.title2_alias then
params[2] = {alias_of = "title"}
end
local args = process_params(frame:getParent().args, params)
check_lang_matches_L2(args[1], args.nocat)
return args
end
function export.misc_variant_no_term(frame)
local args = get_args(frame)
return require(etymology_module).format_misc_variant_no_term {
lang = args[1],
notext = args.notext,
title = args.title or frame.args.text,
nocat = args.nocat,
cat = frame.args.cat,
sort_key = args.sort,
force_cat = force_cat,
}
end
-- This function works similarly to misc_variant_no_term(), but with some automatic linking to the glossary in
-- `title`.
function export.onomatopoeia(frame)
local args = get_args(frame)
local title = args.title
if title and (lower(title) == "imitative" or lower(title) == "imitation") then
title = "[[Appendix:Glossary#imitative|" .. title .. "]]"
end
return require(etymology_module).format_misc_variant_no_term {
lang = args[1],
notext = args.notext,
title = title or frame.args.text,
nocat = args.nocat,
cat = frame.args.cat,
sort_key = args.sort,
force_cat = force_cat,
}
end
end
return export
62uclsg0tnc97nmhtj6qaxzsgsp4laq
मॉड्यूल:palindromes
828
302147
487789
477437
2026-09-02T17:20:27Z
SM7
6218
updating...
487789
Scribunto
text/plain
local export = {}
local data = mw.loadData("Module:palindromes/data")
local function ignoreCharacters(term, lang, sc, langdata)
term = mw.ustring.lower(term)
term = mw.ustring.gsub(term, "[ ,%.%?!%%%-'\"]", "")
-- Language-specific substitutions
-- Ignore entire scripts (e.g. romaji in Japanese)
if langdata.ignore then
sc_name = sc and sc:getCode() or lang:findBestScript(term):getCode()
for _, script in ipairs(langdata.ignore) do
if script == sc_name then
return ""
end
end
end
for i, from in ipairs(langdata.from or {}) do
term = mw.ustring.gsub(term, from, langdata.to[i] or "")
end
return term
end
function export.is_palindrome(term, lang, sc)
local langdata = data[lang:getCode()] or data[lang:getFullCode()] or {}
-- Affixes aren't palindromes
if mw.ustring.find(term, "^%-") or mw.ustring.find(term, "%-$") then
return false
end
-- Remove punctuation and casing
term = ignoreCharacters(term, lang, sc, langdata)
local len = mw.ustring.len(term)
if langdata.allow_repeated_char then
-- Ignore single-character terms
if len < 2 then
return false
end
else
-- Ignore terms that consist of just one character repeated
-- This also excludes terms consisting of fewer than 3 characters
if term == mw.ustring.rep(mw.ustring.sub(term, 1, 1), len) then
return false
end
end
local charlist = {}
for c in mw.ustring.gmatch(term, ".") do
table.insert(charlist, c)
end
for i = 1, math.floor(len / 2) do
if charlist[i] ~= charlist[len - i + 1] then
return false
end
end
return true
end
return export
ms2gvz5ktlkntyfgy8vn9mt955uxqdg
मॉड्यूल:palindromes/data
828
302148
487788
477438
2026-09-02T17:19:46Z
SM7
6218
updating...
487788
Scribunto
text/plain
local data = {
["ar"] = {
allow_repeated_char = true,
from = {
"[أإآ]",
"ؤ",
"[ئى]",
"ة",
"ء",
},
to = {
"ا",
"و",
"ي",
"ه",
},
},
["arc"] = {
allow_repeated_char = true,
from = {
"ם",
"ן",
"ך",
"ף",
"ץ",
"ﭏ",
"װ",
"ױ",
"ײ",
"[״׳־]",
},
to = {
"מ",
"נ",
"כ",
"פ",
"צ",
"אל",
"וו",
"וי",
"יי",
}
},
["axm"] = {
from = {"ու"},
to = {"ŭ"},
},
["ca"] = {
from = {"à", "[èé]", "[íï]", "[òó]", "[úü]", "ç", "l·l"},
to = {"a", "e", "i", "o", "u", "c", "ll"},
},
["cmn"] = {ignore = {"Latn"}},
["cs"] = {
from = {"á", "é", "í", "ó", "[úů]", "ý", "ch"},
to = {"a", "e", "i", "o", "u", "y", "χ"},
},
["de"] = {
from = {"ä", "ö", "ü", "[ßẞ]"},
to = {"a", "o", "u", "ss"},
},
["el"] = {
from = {
"[ᾳάᾴὰᾲᾶᾷἀᾀἄᾄἂᾂἆᾆἁᾁἅᾅἃᾃἇᾇᾱᾰἈᾈἌᾌἊᾊἎᾎἉᾉἍᾍἋᾋἏᾏᾹᾸ]", --uppercase characters are included due to this bug: https://bugs.php.net/bug.php?id=69267
"[έὲἐἔἒἑἕἓἘἜἚἙἝἛ]",
"[ῃήῄὴῂῆῇἠᾐἤᾔἢᾒἦᾖἡᾑἥᾕἣᾓἧᾗἨᾘἬᾜἪᾚἮᾞἩᾙἭᾝἫᾛἯᾟ]",
"[ίὶῖἰἴἲἶἱἵἳἷϊΐῒῗῑῐἸἼἺἾἹἽἻἿῙῘ]",
"[όὸὀὄὂὁὅὃὈὌὊὉὍὋ]",
"[ύὺῦὐὔὒὖὑὕὓὗϋΰῢῧῡῠὙὝὛὟῩῨ]",
"[ῳώῴὼῲῶῷὠᾠὤᾤὢᾢὦᾦὡᾡὥᾥὣᾣὧᾧὨᾨὬᾬὪᾪὮᾮὩᾩὭᾭὫᾫὯᾯ]",
"[ῥῤῬ]",
"[ς]",
"[́͂]"
},
to = {
"α",
"ε",
"η",
"ι",
"ο",
"υ",
"ω",
"ρ",
"σ"
},
},
["en"] = {
from = {"[äàáâåā]", "[ëèéêē]", "[ïìíîī]", "[öòóôō]", "[üùúûū]", "æ" , "œ" , "[çč]", "ñ", "'"},
to = {"a", "e", "i", "o", "u", "ae", "oe", "c", "n"},
},
["fr"] = {
from = {"[áàâä]", "[éèêë]", "[íìîï]", "[óòôö]", "[úùûü]", "[ýỳŷÿ]", "ç", "æ", "œ", "'"},
to = {"a", "e", "i", "o", "u", "y", "c", "ae", "oe"},
},
["fy"] = {
from = {"[áàâä]", "[éèêë]", "[íìîï]", "[óòôö]", "[úùûü]", "[ýỳŷÿ]", "æ", "'"},
to = {"a", "e", "i", "o", "u", "y", "ae"},
},
["grc"] = {
from = {
"[ᾳάᾴὰᾲᾶᾷἀᾀἄᾄἂᾂἆᾆἁᾁἅᾅἃᾃἇᾇᾱᾰἈᾈἌᾌἊᾊἎᾎἉᾉἍᾍἋᾋἏᾏᾹᾸ]", --uppercase characters are included due to this bug: https://bugs.php.net/bug.php?id=69267
"[έὲἐἔἒἑἕἓἘἜἚἙἝἛ]",
"[ῃήῄὴῂῆῇἠᾐἤᾔἢᾒἦᾖἡᾑἥᾕἣᾓἧᾗἨᾘἬᾜἪᾚἮᾞἩᾙἭᾝἫᾛἯᾟ]",
"[ίὶῖἰἴἲἶἱἵἳἷϊΐῒῗῑῐἸἼἺἾἹἽἻἿῙῘ]",
"[όὸὀὄὂὁὅὃὈὌὊὉὍὋ]",
"[ύὺῦὐὔὒὖὑὕὓὗϋΰῢῧῡῠὙὝὛὟῩῨ]",
"[ῳώῴὼῲῶῷὠᾠὤᾤὢᾢὦᾦὡᾡὥᾥὣᾣὧᾧὨᾨὬᾬὪᾪὮᾮὩᾩὭᾭὫᾫὯᾯ]",
"[ῥῤῬ]",
"[ς]",
"[́͂]"
},
to = {
"α",
"ε",
"η",
"ι",
"ο",
"υ",
"ω",
"ρ",
"σ"
}
},
["he"] = {
allow_repeated_char = true,
from = {
"ם",
"ן",
"ך",
"ף",
"ץ",
"ﭏ",
"װ",
"ױ",
"ײ",
"[״׳־]",
},
to = {
"מ",
"נ",
"כ",
"פ",
"צ",
"אל",
"וו",
"וי",
"יי",
}
},
["hu"] = {
from = {"í", "ó", "ú", "ő", "ű", "ccs", "cs", "ggy", "gy", "lly", "ly", "nny", "ny", "ssz", "sz", "tty", "ty", "zzs", "zs", "ddzs", "dzs"},
to = {"i", "o", "u", "ö", "ü", "čč", "č", "ǰǰ", "ǰ", "ľľ", "ľ", "ňň", "ň", "šš", "š", "ťť", "ť", "žž", "ž", "ddž", "dž"},
},
["hy"] = {
from = {"ու", "եւ"},
to = {"ŭ", "և"},
},
["ja"] = {
allow_repeated_char = true,
from = {'が', 'ぎ', 'ぐ', 'げ', 'ご', 'ざ', 'じ', 'ず', 'ぜ', 'ぞ', 'だ', 'ぢ', 'づ', 'で', 'ど', 'ば', 'び', 'ぶ', 'べ', 'ぼ', 'ぱ', 'ぴ', 'ぷ', 'ぺ', 'ぽ', 'ゔ'},
to = {'か', 'き', 'く', 'け', 'こ', 'さ', 'し', 'す', 'せ', 'そ', 'た', 'ち', 'つ', 'て', 'と', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'は', 'ひ', 'ふ', 'へ', 'ほ', 'う'},
ignore = {"Latn"},
},
["la"] = {
from = {"v", "j"},
to = {"u", "i"}
},
["nl"] = {
from = {"[áàä]", "[éèë]", "[íìï]", "[óòö]", "[úùü]"},
to = {"a", "e", "i", "o", "u"},
},
["pl"] = {
from = {"ć", "ę", "ł", "ń", "ó", "ś", "[źż]"},
to = {"c", "e", "l", "n", "o", "s", "z"},
},
["ru"] = {
from = {"ё"},
to = {"е"},
},
["xcl"] = {
from = {"ու"},
to = {"ŭ"},
},
["yi"] = {
allow_repeated_char = true,
from = {
"ם",
"ן",
"ך",
"ף",
"ץ",
"ﭏ",
"װ",
"ױ",
"ײ",
"[״׳־]",
"[ִַָּֿׁׂ]",
},
to = {
"מ",
"נ",
"כ",
"פ",
"צ",
"אל",
"וו",
"וי",
"יי",
}
},
["zh"] = {
ignore = {"Latn"},
},
}
return data
lnfzz4yt7hlswzgb8pzp3idlrgkcnyk
मॉड्यूल:families
828
302161
487831
477815
2026-09-02T19:34:11Z
SM7
6218
updating...+local little more
487831
Scribunto
text/plain
local export = {}
local families_by_name_module = "Module:families/canonical names"
local families_data_module = "Module:families/data"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local languages_module = "Module:languages"
local load_module = "Module:load"
local table_module = "Module:table"
local get_by_code -- Defined below.
local gmatch = string.gmatch
local insert = table.insert
local ipairs = ipairs
local make_object -- Defined below.
local pairs = pairs
local require = require
local setmetatable = setmetatable
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function category_name_has_suffix(...)
category_name_has_suffix = require(language_like_module).categoryNameHasSuffix
return category_name_has_suffix(...)
end
local function category_name_to_code(...)
category_name_to_code = require(language_like_module).categoryNameToCode
return category_name_to_code(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_lang_object(...)
make_lang_object = require(languages_module).makeObject
return make_lang_object(...)
end
local function to_json(...)
to_json = require(json_module).toJSON
return to_json(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local families_by_name
local function get_families_by_name()
families_by_name, get_families_by_name = load_data(families_by_name_module), nil
return families_by_name
end
local families_data
local function get_families_data()
families_data, get_families_data = load_data(families_data_module), nil
return families_data
end
local families_suffixes
local function get_families_suffixes()
families_suffixes, get_families_suffixes = {
"भाषाएँ",
"लेक्ट"
}, nil
return families_suffixes
end
local Family = {}
Family.__index = Family
--[==[
Return the family code of the family, e.g. {"ine"} for the Indo-European languages.
]==]
function Family:getCode()
return self._code
end
--[==[
Return the canonical name of the family. This is the name used to represent that language family on Wiktionary,
and is guaranteed to be unique to that family alone. Example: {"Indo-European"} for the Indo-European languages.
]==]
function Family:getCanonicalName()
local name = self._name
if name == nil then
name = self._data[1]
self._name = name
end
return name
end
--[==[
Return the display form of the family. For families, this is usually the same as the value returned by
{getCategoryName("nocap")}, i.e. it reads <code>"<var>name</var> languages"</code> (e.g.
{"Indo-Iranian languages"}). For full and etymology-only languages, this is the same as the canonical name, and
for scripts, it reads <code>"<var>name</var> script"</code> (e.g. {"Arabic script"}). The displayed text used in
{makeCategoryLink()} is always the same as the display form.
]==]
function Family:getDisplayForm()
local name = self._data[1]
if category_name_has_suffix(name, families_suffixes or get_families_suffixes()) then
name = name .. " भाषाएँ"
end
return name
end
function Family:getAliases()
Family.getAliases = require(language_like_module).getAliases
return self:getAliases()
end
function Family:getVarieties(flatten)
Family.getVarieties = require(language_like_module).getVarieties
return self:getVarieties(flatten)
end
function Family:getOtherNames()
Family.getOtherNames = require(language_like_module).getOtherNames
return self:getOtherNames()
end
function Family:getAllNames()
Family.getAllNames = require(language_like_module).getAllNames
return self:getAllNames()
end
--[==[Returns a table of types as a lookup table (with the types as keys).
The possible types are
* {family}: This object is a family.
* {full}: This object is a "full" family. This includes all families but a couple of etymology-only
families for Old and Middle Iranian languages.
* {etymology-only}: This object is an etymology-only family, similar to etymology-only languages. There
are currently only two such families, for Old Iranian languages and Middle Iranian
languages (which do not represent proper clades and have no proto-languages, hence
cannot be full families).
]==]
function Family:getTypes()
local types = self._types
if types == nil then
types = {family = true}
if self:getFullCode() == self:getCode() then
types.full = true
else
types["etymology-only"] = true
end
local rawtypes = self._data.type
if rawtypes then
for t in gmatch(rawtypes, "[^,]+") do
types[t] = true
end
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the family has all of them.]==]
function Family:hasType(...)
Family.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[Returns a {Family} object for the superfamily that the family belongs to.]==]
function Family:getFamily()
if self._familyObject == nil then
local familyCode = self:getFamilyCode()
if familyCode then
self._familyObject = get_by_code(familyCode)
else
self._familyObject = false
end
end
return self._familyObject or nil
end
--[==[Returns the code of the family's superfamily.]==]
function Family:getFamilyCode()
if not self._familyCode then
self._familyCode = self._data[3]
end
return self._familyCode
end
--[==[Returns the canonical name of the family's superfamily.]==]
function Family:getFamilyName()
if self._familyName == nil then
local family = self:getFamily()
if family then
self._familyName = family:getCanonicalName()
else
self._familyName = false
end
end
return self._familyName or nil
end
--[==[Check whether the family belongs to {superfamily} (which can be a family code or object), and returns a boolean. If more than one is given, returns {true} if the family belongs to any of them. A family is '''not''' considered to belong to itself.]==]
function Family:inFamily(...)
for _, superfamily in ipairs{...} do
if type(superfamily) == "table" then
superfamily = superfamily:getCode()
end
local family, code = self:getFamily()
while family do
code = family:getCode()
if code == superfamily then
return true
end
family = family:getFamily()
-- If family is parent to itself, return false.
if family and family:getCode() == code then
return false
end
end
return false
end
end
function Family:getParent()
if self._parentObject == nil then
local parentCode = self:getParentCode()
if parentCode then
self._parentObject = get_lang(parentCode, nil, true, true)
else
self._parentObject = false
end
end
return self._parentObject or nil
end
function Family:getParentCode()
if not self._parentCode then
self._parentCode = self._data.parent
end
return self._parentCode
end
function Family:getParentName()
if self._parentName == nil then
local parent = self:getParent()
if parent then
self._parentName = parent:getCanonicalName()
else
self._parentName = false
end
end
return self._parentName or nil
end
function Family:getParentChain()
if not self._parentChain then
self._parentChain = {}
local parent = self:getParent()
while parent do
insert(self._parentChain, parent)
parent = parent:getParent()
end
end
return self._parentChain
end
function Family:hasParent(...)
--checkObject("family", nil, ...)
for _, other_family in ipairs{...} do
for _, parent in ipairs(self:getParentChain()) do
if type(other_family) == "string" then
if other_family == parent:getCode() then return true end
else
if other_family:getCode() == parent:getCode() then return true end
end
end
end
return false
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding object is returned. If the family is a full family, then it simply returns itself.
]==]
function Family:getFull()
if not self._fullObject then
local fullCode = self:getFullCode()
if fullCode ~= self:getCode() then
self._fullObject = get_lang(fullCode, nil, nil, true)
else
self._fullObject = self
end
end
return self._fullObject
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding code is returned. If the family is a full family, then it simply returns the family code.
]==]
function Family:getFullCode()
return self._fullCode or self:getCode()
end
--[==[
If the family is etymology-only, this iterates through its parents until a full family is found, and the
corresponding canonical name is returned. If the family is a full family, then it simply returns the canonical name
of the family.
]==]
function Family:getFullName()
if self._fullName == nil then
local full = self:getFull()
if full then
self._fullName = full:getCanonicalName()
else
self._fullName = false
end
end
return self._fullName or nil
end
--[==[
Return a {Language} object (see [[Module:languages]]) for the proto-language of this family, if one exists.
Otherwise, return {nil}.
]==]
function Family:getProtoLanguage()
if self._protoLanguageObject == nil then
self._protoLanguageObject = get_lang(self._data.protoLanguage or self:getCode() .. "-pro", nil, true) or false
end
return self._protoLanguageObject or nil
end
function Family:getProtoLanguageCode()
if self._protoLanguageCode == nil then
local protoLanguage = self:getProtoLanguage()
self._protoLanguageCode = protoLanguage and protoLanguage:getCode() or false
end
return self._protoLanguageCode or nil
end
function Family:getProtoLanguageName()
if not self._protoLanguageName then
self._protoLanguageName = self:getProtoLanguage():getCanonicalName()
end
return self._protoLanguageName
end
function Family:hasAncestor(...)
-- Go up the family tree until a protolanguage is found.
local family = self
local protolang = family:getProtoLanguage()
while not protolang do
family = family:getFamily()
protolang = family:getProtoLanguage()
-- Return false if the family is its own family, to avoid an infinite loop.
if family:getFamilyCode() == family:getCode() then
return false
end
end
-- If the protolanguage is not in the family, it must therefore be ancestral to it. Check if it is a match.
for _, otherlang in ipairs{...} do
if (
type(otherlang) == "string" and protolang:getCode() == otherlang or
type(otherlang) == "table" and protolang:getCode() == otherlang:getCode()
) and not protolang:inFamily(self) then
return true
end
end
-- If not, check the protolanguage's ancestry.
return protolang:hasAncestor(...)
end
local function fetch_descendants(self, format)
local languages = require("Module:languages/code to canonical name")
local etymology_languages = require("Module:etymology languages/code to canonical name")
local families = require("Module:families/code to canonical name")
local descendants = {}
-- Iterate over all three datasets.
for _, data in ipairs{languages, etymology_languages, families} do
for code in pairs(data) do
local lang = get_lang(code, nil, true, true)
if lang:inFamily(self) then
if format == "object" then
insert(descendants, lang)
elseif format == "code" then
insert(descendants, code)
elseif format == "name" then
insert(descendants, lang:getCanonicalName())
end
end
end
end
return descendants
end
function Family:getDescendants()
if not self._descendantObjects then
self._descendantObjects = fetch_descendants(self, "object")
end
return self._descendantObjects
end
function Family:getDescendantCodes()
if not self._descendantCodes then
self._descendantCodes = fetch_descendants(self, "code")
end
return self._descendantCodes
end
function Family:getDescendantNames()
if not self._descendantNames then
self._descendantNames = fetch_descendants(self, "name")
end
return self._descendantNames
end
function Family:hasDescendant(...)
for _, lang in ipairs{...} do
if type(lang) == "string" then
lang = get_lang(lang, nil, true)
end
if lang:inFamily(self) then
return true
end
end
return false
end
--[==[
Return the name of the main category of that family. Example: {"Germanic languages"} for the Germanic languages,
whose category is at [[:Category:Germanic languages]].
Unless optional argument `nocap` is given, the family name at the beginning of the returned value will be
capitalized. This capitalization is correct for category names, but not if the family name is lowercase and
the returned value of this function is used in the middle of a sentence. (For example, the pseudo-family with
the code {qfa-mix} has the name {"mixed"}, which should remain lowercase when used as part of the category name
[[:Category:Terms derived from mixed languages]] but should be capitalized in [[:Category:Mixed languages]].)
If you are considering using {getCategoryName("nocap")}, use {getDisplayForm()} instead.
]==]
function Family:getCategoryName(nocap)
local name = self._data.categoryName or self:getDisplayForm()
if not nocap then
name = mw.getContentLanguage():ucfirst(name)
end
return name
end
function Family:makeCategoryLink()
return "[[:श्रेणी:" .. self:getCategoryName() .. "|" .. self:getDisplayForm() .. "]]"
end
--[==[Returns the Wikidata item id for the family or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Family:getWikidataItem()
Family.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[
Returns the name of the Wikipedia article for the family. `project` specifies the language and project to retrieve
the article from, defaulting to {"enwiki"} for the English Wikipedia. Normally if specified it should be the project
code for a specific-language Wikipedia e.g. "zhwiki" for the Chinese Wikipedia, but it can be any project, including
non-Wikipedia ones. If the project is the English Wikipedia and the property {wikipedia_article} is present in the data
module it will be used first. In all other cases, a sitelink will be generated from {:getWikidataItem} (if set). The
resulting value (or lack of value) is cached so that subsequent calls are fast. If no value could be determined, and
`noCategoryFallback` is {false}, {:getCategoryName} is used as fallback; otherwise, {nil} is returned. Note that if
`noCategoryFallback` is {nil} or omitted, it defaults to {false} if the project is the English Wikipedia, otherwise
to {true}. In other words, under normal circumstances, if the English Wikipedia article couldn't be retrieved, the
return value will fall back to a link to the family's category, but this won't normally happen for any other project.
]==]
function Family:getWikipediaArticle(noCategoryFallback, project)
Family.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
function Family:makeWikipediaLink()
return "[[w:" .. self:getWikipediaArticle() .. "|" .. self:getCanonicalName() .. "]]"
end
--[==[Returns the name of the Wikimedia Commons category page for the family.]==]
function Family:getCommonsCategory()
Family.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
function Family:toJSON(opts)
local ret = {
canonicalName = self:getCanonicalName(),
categoryName = self:getCategoryName("nocap"),
code = self:getCode(),
parent = self:getParentCode(),
full = self:getFullCode(),
family = self:getFamilyCode(),
protoLanguage = self:getProtoLanguageCode(),
aliases = self:getAliases(),
varieties = self:getVarieties(),
otherNames = self:getOtherNames(),
type = keys_to_list(self:getTypes()),
wikidataItem = self:getWikidataItem(),
wikipediaArticle = self:getWikipediaArticle(true),
}
-- Use `deep_copy` when returning a table, so that there are no editing restrictions imposed by `mw.loadData`.
return opts and opts.lua_table and deep_copy(ret) or to_json(ret, opts)
end
function Family:getData()
return self._data
end
function export.makeObject(code, data)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
return setmetatable({_data = data, _code = code, _fullCode = code}, Family)
end
make_object = export.makeObject
--[==[
Finds the family whose code matches the one provided. If it exists, it returns a {Family} object representing the
family. Otherwise, it returns {nil}.]==]
function export.getByCode(code)
local data = (families_data or get_families_data())[code]
if data == nil then
return nil
elseif data.parent == nil then
return make_object(code, data)
end
return make_lang_object(code, data)
end
get_by_code = export.getByCode
--[==[
Look for the family whose canonical name (the name used to represent that family on Wiktionary) matches the one
provided. If it exists, it returns a {Family} object representing the family. Otherwise, it returns {nil}. The
canonical name of families should always be unique (it is an error for two families on Wiktionary to share the same
canonical name), so this is guaranteed to give at most one result.]==]
function export.getByCanonicalName(name)
if name == nil then
return nil
end
local code = (families_by_name or get_families_by_name())[name]
if code == nil then
return nil
end
return get_by_code(code)
end
--[==[
Look for the family whose category name (the name used in categories for that family) matches the one provided.
If it exists, it returns a {Family} object representing the family. Otherwise, it returns {nil}. In almost all cases,
the category name for a family is its canonical name plus the word "languages", e.g. "Indo-European" has the category
name "Indo-European languages". Where a canonical name ends with "languages" or "lects", the category name is identical
to the canonical name.]==]
function export.getByCategoryName(name)
if name == nil then
return nil
end
local code = category_name_to_code(
name,
" भाषाएँ",
families_by_name or get_families_by_name(),
families_suffixes or get_families_suffixes()
)
if code == nil then
return nil
end
return get_by_code(code)
end
return export
b0ika04i5fpin9ozyr0zdyuju3asr99
मॉड्यूल:qualifier
828
302212
487761
465280
2026-09-02T16:00:40Z
SM7
6218
updating...
487761
Scribunto
text/plain
local export = {}
local concat = table.concat
--[==[
Wrap text in one or more CSS classes. `classes` should be a string; separate multiple classes with a space.
]==]
function export.wrap_css(text, classes)
return ("<span class=\"%s\">%s</span>"):format(classes, text)
end
--[==[
Wrap text in one or more qualifier CSS classes. `suffix` is the suffix describing the type of content, e.g. `brac`
for parens, `content` for content, `comma` for commas. CSS classes <code>ib-<var>suffix</var></code> and
i<code>qualifier-<var>suffix</var></code> are added.
]==]
function export.wrap_qualifier_css(text, suffix)
local css_classes = ("ib-%s qualifier-%s"):format(suffix, suffix)
return export.wrap_css(text, css_classes)
end
--[==[
Format one or more qualifiers. `data` is an object with the following fields:
* `qualifiers`: A single qualifier or a list or qualifiers.
* `open`: Override the open paren displayed before the qualifiers. If `false` or an empty string, no paren is displayed.
* `close`: Override the close paren displayed before the qualifiers. If `false` or an empty string, no paren is
displayed.
* `opencontent`: Content to display before the qualifiers, after the open paren.
* `closecontent`: Content to display after the qualifiers, before the close paren.
* `no_ib_content`: Suppress wrapping the content with classes `ib-content` and `qualifier-content`. Parens and commas
will still be wrapped in CSS.
* `raw`: Suppress all CSS wrapping.
]==]
function export.format_qualifiers(data)
local qualifiers, open, close = data.qualifiers, data.open, data.close
if type(qualifiers) ~= "table" then
qualifiers = {qualifiers}
end
if not qualifiers[1] then
return ""
end
local parts = {}
local function ins(text)
table.insert(parts, text)
end
local function wrap_qualifier_css(text, suffix)
if data.raw then
return text
end
return export.wrap_qualifier_css(text, suffix)
end
if open ~= false and open ~= ""then
ins(wrap_qualifier_css(open or "(", "brac"))
end
if data.opencontent then
ins(data.opencontent)
end
local content = concat(qualifiers, wrap_qualifier_css(",", "comma") .. " ")
if not data.no_ib_content then
content = wrap_qualifier_css(content, "content")
end
ins(content)
if data.closecontent then
ins(data.closecontent)
end
if close ~= false and close ~= "" then
ins(wrap_qualifier_css(close or ")", "brac"))
end
return concat(parts)
end
--[==[
An older interface onto `format_qualifiers`. Eventually code should be converted to use the new entry point.
]==]
function export.format_qualifier(qualifiers, open, close, opencontent, closecontent, no_ib_content)
return export.format_qualifiers {
qualifiers = qualifiers,
open = open,
close = close,
opencontent = opencontent,
closecontent = closecontent,
no_ib_content = no_ib_content,
}
end
local function format_qualifiers_with_clarification(qualifiers, clarification, openquote, closequote)
local opencontent = export.wrap_css(clarification, "qualifier-clarification") ..
export.wrap_css(openquote or "“", "qualifier-clarification qualifier-quote")
local closecontent = export.wrap_css(closequote or "”", "qualifier-clarification qualifier-quote")
return export.format_qualifiers {
qualifiers = qualifiers,
open = "(",
close = ")",
opencontent = opencontent,
closecontent = closecontent,
}
end
--[==[
Internal implementation of {{tl|sense}}.
]==]
function export.sense(qualifiers)
return export.format_qualifiers {
qualifiers = qualifiers
}.. export.wrap_css(":", "ib-colon sense-qualifier-colon")
end
--[==[
Internal implementation of {{tl|antsense}}.
]==]
function export.antsense(qualifiers)
return format_qualifiers_with_clarification(qualifiers, "antonym(s) of ") ..
export.wrap_css(":", "ib-colon sense-qualifier-colon")
end
return export
tc3tigewud11x9n9900h1tvmhjpvcah
मॉड्यूल:labels
828
302248
487747
477417
2026-09-02T14:56:12Z
SM7
6218
updating...
487747
Scribunto
text/plain
local export = {}
export.lang_specific_data_list_module = "Module:labels/data/lang"
export.lang_specific_data_modules_prefix = "Module:labels/data/lang/"
local load_module = "Module:load"
local parse_utilities_module = "Module:parse utilities"
local string_utilities_module = "Module:string utilities"
local utilities_module = "Module:utilities"
local insert = table.insert
local require_when_needed = require("Module:require when needed")
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local dump = mw.dumpObject
local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module)
local m_table = require_when_needed("Module:table")
--[==[ intro:
Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the
final (formatted) label displayed to the user. The following terminology will help keep things straight:
* The "raw label" is the label specified in the Wikicode.
* The "non-canonical label" is the label extracted from the raw label, used for looking up in the label modules in order
to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same
as the raw label, but it will be different if the raw label is of the form `!<var>label</var>` (e.g. `!Australian`)
`<var>label</var>!<var>display</var>` (e.g. `Southern US!Southern`). The former syntax indicates that the label
should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter
syntax indicates that the label should display in the form specified after the exclamation point.
* The "canonical label" is the result of applying alias resolution to the non-canonical label. Normally, the
canonical label rather than the non-canonical label is what is shown to the user.
* The "display form of the label" is what is shown to the user, not considering links and HTML that may wrap the
display form to get the formatted form of the label. The display form comes from the `.display` field of the module
label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if
the display override exists (see below), it takes precedence over the `.display` field or canonical label when
determining the display form of the label.
* The "display override", if specified, overrides all other means of determining the display form of the label. It is
specified in two circumstances, i.e. in the `!<var>label</var>` and `<var>label</var>!<var>display</var>` raw label
formats (i.e. in the same cirumstances where the raw label and non-canonical label are different).
* The "formatted form of the label" is the final form of the label shown directly to the user. It generally appears to
the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a
link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an
HTML span with a "deprecated" CSS class attached, causing the label to display differently (to indicate that it is
deprecated).
]==]
-- for testing
local force_cat = false
local m_headword_data = mw.loadData("Module:headword/data")
local SUBPAGENAME = m_headword_data.pagename
-- Disable tracking on heavy pages to save time.
local pages_where_tracking_is_disabled = m_headword_data.large_pages
-- Add tracking category for PAGE. The tracking category linked to is [[Wiktionary:Tracking/labels/PAGE]].
-- We also add to [[Wiktionary:Tracking/labels/PAGE/LANGCODE]] and [[Wiktionary:Tracking/labels/PAGE/MODE]] if
-- LANGCODE and/or MODE given.
local function track(page, langcode, mode)
if pages_where_tracking_is_disabled[SUBPAGENAME] then
return true
end
-- avoid including links in pages (may cause error)
page = page:gsub("%[", "("):gsub("%]", ")"):gsub("|", "!")
require("Module:debug/track")("labels/" .. page)
if langcode then
require("Module:debug/track")("labels/" .. page .. "/" .. langcode)
end
if mode then
require("Module:debug/track")("labels/" .. page .. "/" .. mode)
end
-- We don't currently add a tracking label for both langcode and mode to reduce the total number of labels, to
-- save some memory.
return true
end
local function ucfirst(txt)
return mw.getContentLanguage():ucfirst(txt)
end
local mode_to_outer_class = {
["label"] = "usage-label-sense",
["term-label"] = "usage-label-term",
["accent"] = "usage-label-accent",
["form-of"] = "usage-label-form-of",
}
local mode_to_property_prefix = {
["label"] = false,
["term-label"] = false, -- handled specially
["accent"] = "accent_",
["form-of"] = "form_of_",
}
local function validate_mode(mode)
mode = mode or "label"
if not mode_to_outer_class[mode] then
local allowed_values = {}
for key, _ in pairs(mode_to_outer_class) do
insert(allowed_values, "'" .. key .. "'")
end
table.sort(allowed_values)
error(("Invalid value '%s' for `mode`; should be one of %s"):format(mode, table.concat(allowed_values, ", ")))
end
return mode
end
local function getprop(labdata, mode, prop)
local mode_prefix = mode_to_property_prefix[mode]
return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop]
end
local function check_type(label, lang, prop, value, expected_types)
if value == nil or expected_types == nil then
return value
end
if type(expected_types) ~= "table" then
expected_types = {expected_types}
end
local valtype = type(value)
local matches = false
for _, expected_type in ipairs(expected_types) do
if type(expected_type) == "string" then
if valtype == expected_type then
matches = true
break
end
elseif value == expected_type then
matches = true
break
end
end
if not matches then
local function join_untagged_or(elements)
return m_table.serialCommaJoin(elements, {conj = "or", dontTag = true})
end
local quoted_types = {}
local quoted_values = {}
for _, expected_type in ipairs(expected_types) do
if type(expected_type) == "string" then
insert(quoted_types, "'" .. expected_type .. "'")
else
insert(quoted_values, "'" .. dump(expected_type) .. "'")
end
end
local possible_matches = {}
if quoted_types[1] then
insert(possible_matches, ("be of type%s %s"):format(
quoted_types[2] and "s" or "", join_untagged_or(quoted_types)))
end
if quoted_values[1] then
insert(possible_matches, ("have the value%s %s"):format(
quoted_values[2] and "s" or "", join_untagged_or(quoted_values)))
end
error(("Internal error: For label '%s', langcode '%s', property '%s' should %s but is of type '%s' with value %s"):format(
label, lang and lang:getCode() or "UNKNOWN", prop, join_untagged_or(possible_matches), valtype, dump(value)))
end
end
-- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate
-- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not
-- have English articles for them, like many Chinese lects).
local families_to_wikipedia_languages = {
{"zhx", "zh"},
{"sem-arb", "ar"},
}
--[==[
Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check
when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language
code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`'s Wiktionary code), followed
by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese
and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the
list. This is exported because it's also used by [[Module:category tree/poscatboiler/data/language varieties]].
]==]
function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
local wikipedia_langs = {}
insert(wikipedia_langs, "en")
if lang then
local article_lang = lang
while article_lang do
if article_lang:hasType("language") then
local wmcodes = article_lang:getWikimediaLanguageCodes()
for _, wmcode in ipairs(wmcodes) do
insert(wikipedia_langs, wmcode)
end
end
article_lang = article_lang:getParent()
end
for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do
local family, wp_lang = unpack(family_to_wp_lang)
if lang:inFamily(family) then
insert(wikipedia_langs, wp_lang)
end
end
end
return wikipedia_langs
end
--[==[
Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang`
has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode`
specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the
actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a
documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion;
otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types
as keys and {true} as values), and only categories of the specified types will be returned.
]==]
function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types)
local categories = {}
mode = validate_mode(mode)
local langcode, canonical_name
if lang then
langcode = lang:getFullCode()
canonical_name = lang:getFullName()
elseif for_doc then
langcode = "<var>[langcode]</var>"
canonical_name = "<var>[language name]</var>"
else
error("Internal error: Must specify `lang` unless `for_doc` is given")
end
local function labprop(prop, expected_types)
local retval = getprop(labdata, mode, prop)
check_type(canon_label, lang, prop, retval, expected_types)
return retval
end
local empty_list = {}
local function get_cats(cat_type)
if category_types and not category_types[cat_type] then
return empty_list
end
local cats = labprop(cat_type)
if not cats then
return empty_list
end
if type(cats) ~= "table" then
return {cats}
end
return cats
end
local topical_categories = get_cats("topical_categories")
local sense_categories = get_cats("sense_categories")
local pos_categories = get_cats("pos_categories")
local regional_categories = get_cats("regional_categories")
local plain_categories = get_cats("plain_categories")
local function insert_cat(cat, sense_cat)
if for_doc then
cat = "<code>" .. cat .. "</code>"
if sense_cat then
if mode == "term-label" then
cat = cat .. " (using {{tl|tlb}})"
else
cat = cat .. " (using {{tl|lb}} or form-of template)"
end
cat = mw.getCurrentFrame():preprocess(cat)
end
end
insert(categories, cat)
end
for _, cat in ipairs(topical_categories) do
insert_cat(langcode .. ":" .. (cat == true and ucfirst(canon_label) or cat))
end
for _, cat in ipairs(sense_categories) do
if cat == true then
cat = canon_label
end
cat = mode == "term-label" and cat .. " terms" or "terms with " .. cat .. " senses"
insert_cat(canonical_name .. " " .. cat, true)
end
for _, cat in ipairs(pos_categories) do
insert_cat(canonical_name .. " " .. (cat == true and canon_label or cat))
end
for _, cat in ipairs(regional_categories) do
insert_cat((cat == true and ucfirst(canon_label) or cat) .. " " .. canonical_name)
end
for _, cat in ipairs(plain_categories) do
insert_cat(cat == true and ucfirst(canon_label) or cat)
end
return categories
end
--[==[
Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of
module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list,
the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules.
]==]
function export.get_submodules(lang)
local submodules = {
"Module:labels/data",
"Module:labels/data/qualifiers",
"Module:labels/data/regional",
"Module:labels/data/topical",
}
if not lang then
return submodules
end
-- get language-specific labels from data module
local langcode = lang:getFullCode()
if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then
-- prefer per-language label in order to pick subvariety labels over regional ones
insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode)
end
return submodules
end
--[==[
Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top),
given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the
language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the
deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the
label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical
label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the
formatted label form and a boolean indicating whether the label is deprecated.
'''NOTE: Under normal circumstances, do not use this.''' Instead, use {get_label_info()}, which searches all the data
modules for a given label and handles other complications.
]==]
function export.format_label(label, labdata, lang, deprecated, override_display, mode)
local formatted_label
mode = validate_mode(mode)
local function labprop(prop, expected_types)
local retval = getprop(labdata, mode, prop)
check_type(label, lang, prop, retval, expected_types)
return retval
end
deprecated = deprecated or labprop("deprecated")
if not override_display and labprop("special_display") then
local function add_language_name(str)
if str == "canonical_name" then
if lang then
return lang:getFullName()
else
return "<code><var>[language name]</var></code>"
end
else
return ""
end
end
formatted_label = labprop("special_display", "string"):gsub("<(.-)>", add_language_name)
else
--[=[
We proceed as follows:
1. The display form comes from either (a) the `override_display` variable if set (this happens when
the user uses a label like '!British'); (b) the `display` property, if set; or (c) the label iself.
2. If the display form contains a link, use it directly and ignore the other display-related settings.
(NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the
category tree code.)
3. Otherwise, use one of the other display-related settings, in the following order:
`glossary` > `Wiktionary` > `Wikipedia` > `Wikidata`. Specifically:
a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of
the canonical label.
b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]].
c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a
separate Appendix entry).
d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in
this case, we select the first one, but the category tree uses all of them).
e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from,
or a list of such items (in this case, we select the first one, but the category tree uses all of
them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the
`wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia
article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s)
corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of.
Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == "accent",
`form_display` for `mode` == "form") are checked before the bare equivalent (e.g. `display`).
]=]
local display = override_display or labprop("display", "string") or label
-- There are several 'Foo spelling' labels specially designed for use in the |from= param in
-- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word
-- "spelling" at the end (e.g. if it's defaulted), which is useful when the label is used with {{tl|lb}} or
-- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word "form",
-- "spelling", "standard spelling", etc. after the label.
if mode == "form-of" then
display = display:gsub(" spelling$", "")
end
if display:find("%[%[") then
formatted_label = display
else
local glossary = labprop("glossary", {"string", true})
local Wiktionary = labprop("Wiktionary", {"string", true})
local Wikipedia = labprop("Wikipedia", {"string", true, "table"})
local Wikidata = labprop("Wikidata", {"string", true, "table"})
if glossary then
local glossary_entry = glossary == true and label or glossary
formatted_label = "[[Appendix:Glossary#" .. glossary_entry .. "|" .. display .. "]]"
elseif Wiktionary then
local Wiktionary_entry = Wiktionary == true and label or Wiktionary
if Wiktionary == display then
formatted_label = "[[" .. display .. "]]"
else
formatted_label = "[[" .. Wiktionary_entry .. "|" .. display .. "]]"
end
elseif Wikipedia then
if type(Wikipedia) == "table" then
Wikipedia = Wikipedia[1]
end
local Wikipedia_entry = Wikipedia == true and label or Wikipedia
formatted_label = "[[w:" .. Wikipedia_entry .. "|" .. display .. "]]"
elseif Wikidata then
if not mw.wikibase then
error(("Unable to retrieve data from Wikidata ID for label '%s'; `mw.wikibase` not defined"
):format(label))
end
local function make_formatted_label(wmcode, id)
local article = mw.wikibase.sitelink(id, wmcode .. "wiki")
if article then
local link = wmcode == "en" and "w:" .. article or "w:" .. wmcode .. ":" .. article
return ("[[%s|%s]]"):format(link, display)
else
return nil
end
end
if type(Wikidata) == "table" then
Wikidata = Wikidata[1]
end
local wmcode, id = Wikidata:match("^(.*):(.*)$")
if wmcode then
formatted_label = make_formatted_label(wmcode, id)
else
local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
for _, wmcode in ipairs(langs_to_check) do
formatted_label = make_formatted_label(wmcode, Wikidata)
if formatted_label then
break
end
end
end
formatted_label = formatted_label or display
else
formatted_label = display
end
end
end
if deprecated then
formatted_label = '<span class="deprecated-label">' .. formatted_label .. '</span>'
end
return formatted_label, deprecated
end
--[==[
Return information on a label. On input `data` is an object with the following fields:
* `label`: The raw label to return information on.
* `lang`: The language of the label. Must be specified unless `for_doc` is given.
* `mode`: How the label was invoked. One of the following:
** {nil} or {"label"}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g.
{{tl|alt}}, {{tl|quote}} or {{tl|syn}};
** {"term-label"}: invoked through {{tl|tlb}};
** {"accent"}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates,
such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}};
** {"form-of"}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template.
This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.)
* `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in
`categories` to be formatted for documentation display.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
The return value is an object with the following fields:
* `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs
when double angle bracket (<<...>>) notation is used. {get_label_info()} does not currently return objects with this
field set, but {process_raw_labels()} does. The value is {"begin"} (this is the first raw text portion derived from
a double angle bracket spec, provided there are at least two raw text portions); {"end"} (this is the last raw text
portion derived from a double angle bracket spec, provided there are at least two portions); {"middle"} (this is
neither the first nor the last raw text portion); or {"only"} (this is a raw text portion standing by itself). The
particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is
specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list)
are set; all other fields are {nil}.
* `raw_label`: The raw label that was passed in.
* `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`,
but if the raw label was preceded by an exclamation point (meaning "display the raw label as-is"), this field will
contain the label stripped of the exclamation point, and if the raw label is of the form
`<var>label</var>!<var>display</var>` (meaning "display the label in the specified form"), this field will contain the
label before the exclamation point.
* `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it
will be {nil}.
* `override_display`: If specified, this contains a string that overrides the normal display form of the label. The
display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical
form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in
`label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an
HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the
normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to
indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form
`<var>label</var>!<var>display</var>` (meaning "display the label in the specified `<var>display</var>` form").
* `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized
(found in some module), this will typically be in the form of a link.
* `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified.
* `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified,
or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is
one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn't specified.
* `deprecated`: True if the label is deprecated.
* `recognized`: If true, the label was found in some module.
* `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will
be an empty object.
]==]
function export.get_label_info(data)
if not data.label then
error("`data` must now be an object containing the params")
end
local mode = validate_mode(data.mode)
local ret = {categories = {}}
local label = data.label
local raw_label = label
ret.raw_label = raw_label
local override_display
if label:find("^!") then
label = label:gsub("^!", "")
override_display = label
elseif label:find("![^%s]") then
label, override_display = label:match("^(.-)!([^%s].*)$")
if not label then
error(("Internal error: This Lua pattern should never fail to match for label '%s'"):format(raw_label))
end
end
local non_canonical = label
ret.non_canonical = non_canonical
local deprecated = false
local labdata
local submodule
local data_langcode = data.lang and data.lang:getCode() or nil
local submodules_to_check = export.get_submodules(data.lang)
for _, submodule_to_check in ipairs(submodules_to_check) do
submodule = mw.loadData(submodule_to_check)
local this_labdata = submodule[label]
local resolved_label
if type(this_labdata) == "string" then
resolved_label = this_labdata
this_labdata = submodule[this_labdata]
if not this_labdata then
error(("Internal error: Label alias '%s' points to '%s', which is undefined in module [[%s]]"):format(
label, resolved_label, submodule_to_check))
end
if type(this_labdata) == "string" then
error(("Internal error: Label alias '%s' points to '%s', which is also an alias (of '%s') in module [[%s]]"):format(
label, resolved_label, this_labdata, submodule_to_check))
end
end
if this_labdata then
-- Make sure either there's no lang restriction, or we're processing lang-independent, or our language
-- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a
-- lang-appropriate version of the label in another label data module).
local lablangs = getprop(this_labdata, mode, "langs")
if not lablangs or not data_langcode then
labdata = this_labdata
label = resolved_label or label
break
end
local lang_in_list = false
for _, langcode in ipairs(lablangs) do
if langcode == data_langcode then
lang_in_list = true
break
end
end
if lang_in_list then
labdata = this_labdata
label = resolved_label or label
break
elseif not data.notrack then
-- Track use of a label that fails the lang restriction.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LANGCODE]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL/LANGCODE]]
track("wrong-lang-label", data_langcode)
track("wrong-lang-label/" .. label, data_langcode)
if resolved_label then
track("wrong-lang-label/" .. resolved_label, data_langcode)
end
end
end
end
if labdata then
ret.recognized = true
else
labdata = {}
ret.recognized = false
end
local function labprop(prop)
return getprop(labdata, mode, prop)
end
if labprop("deprecated") then
deprecated = true
end
if label ~= non_canonical then
-- Note that this is an alias and store the canonical version.
ret.canonical = label
end
if not data.notrack then -- labprop("track") then -- track all labels now
-- Track label (after converting aliases to canonical form; but also track raw label (alias) if different
-- from canonical label).
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/LANGCODE]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/MODE]]
track("label/" .. label, data_langcode, mode)
if label ~= non_canonical then
track("label/" .. non_canonical, data_langcode, mode)
end
end
local formatted_label
formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode)
ret.deprecated = deprecated
if deprecated then
if not data.nocat then
local depcat = "Entries with deprecated labels"
if data.for_doc then
depcat = "<code>" .. depcat .. "</code>"
end
insert(ret.categories, depcat)
end
end
local label_for_already_seen =
(labprop("topical_categories") or labprop("regional_categories")
or labprop("plain_categories") or labprop("pos_categories")
or labprop("sense_categories")) and formatted_label
or nil
-- Track label text. If label text was previously used, don't show it, but include the categories.
-- For an example, see [[hypocretin]].
if data.already_seen and data.already_seen[label_for_already_seen] then
ret.label = ""
else
if formatted_label:find("{") then
formatted_label = mw.getCurrentFrame():preprocess(formatted_label)
end
ret.label = formatted_label
end
if data.nocat then
-- do nothing
else
local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc)
for _, cat in ipairs(cats) do
insert(ret.categories, cat)
end
if not ret.categories[1] or data.for_doc then
-- Don't try to format categories if we're doing this for documentation ({{label/doc}}), because there
-- will be HTML in the categories.
-- do nothing
else
ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang,
data.sort, nil, force_cat or data.force_cat)
end
end
ret.data = labdata
if label_for_already_seen and data.already_seen then
data.already_seen[label_for_already_seen] = true
end
return ret
end
--[==[
Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma
followed by whitespace, and it will not split inside of matched <...> or [...]. The code is written to be efficient, so
that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily.
]==]
function export.split_labels_on_comma(term)
if term:find("[%[<]") then
-- Do it the "hard way". We don't want to split anything inside of <...> or <<...>> even if there are commas
-- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced
-- segment runs involving either [...] or <...>. Then we split alternating runs on comma (but not on
-- comma+whitespace). Then we rejoin the split runs. For example, given the following:
-- "regional,older <<non-rhotic,and,non-hoarse-horse>> speakers", the first call to
-- parse_multi_delimiter_balanced_segment_run() produces
--
-- {"regional,older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}
--
-- After calling split_alternating_runs_on_comma(), we get the following:
--
-- {{"regional"}, {"older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}}
--
-- After rejoining each group, we get:
--
-- {"regional", "older <<non-rhotic,and,non-hoarse-horse>> speakers"}
--
-- which is the desired output. When processing the second "label" string, the code in process_raw_labels()
-- will do a similar process to this to pull out the labels inside of the <<...>> notation.
local put = require(parse_utilities_module)
local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{"<", ">"}, {"[", "]"}})
-- This won't split on comma+whitespace.
local comma_separated_groups = put.split_alternating_runs_on_comma(segments)
for i, group in ipairs(comma_separated_groups) do
comma_separated_groups[i] = table.concat(group)
end
return comma_separated_groups
elseif term:find(",%s") then
-- This won't split on comma+whitespace.
return require(parse_utilities_module).split_on_comma(term)
elseif term:find(",") then
return require(string_utilities_module).split(term, ",")
else
return {term}
end
end
--[==[
Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by
{get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also
correctly handles embedded double angle bracket specs <<...>> found in the labels. (In such a case, there will be more
objects returned than raw labels passed in.) On input, `data` is an object with the following fields:
* `labels`: The list of labels to process.
* `lang`: The language of the labels. Must be specified.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
]==]
function export.process_raw_labels(data)
local label_infos = {}
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
local function get_info_and_insert(label)
-- Reuse this structure to save memory.
data.label = label
insert(label_infos, export.get_label_info(data))
end
for _, label in ipairs(data.labels) do
if label:find("<<") then
local segments = require(string_utilities_module).split(label, "<<(.-)>>")
for i, segment in ipairs(segments) do
if i % 2 == 1 then
local raw_text_type = i == 1 and "begin" or i == #segments and "end" or "middle"
insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}})
else
local segment_labels = export.split_labels_on_comma(segment)
for _, segment_label in ipairs(segment_labels) do
get_info_and_insert(segment_label)
end
end
end
else
get_info_and_insert(label)
end
end
return label_infos
end
--[==[
Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to
{format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to
calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following
fields:
* `labels`: The string containing the raw comma-separated labels.
* `lang`: The language of the labels. Must be specified.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
]==]
function export.split_and_process_raw_labels(data)
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
data.labels = export.split_labels_on_comma(data.labels)
return export.process_raw_labels(data)
end
--[==[
Format one or more already-processed labels for display and categorization. "Already-processed" means that
{get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing
information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is
meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]]
that support displaying labels along with some other information.
On input `data` is an object with the following fields:
* `labels`: List of the label objects to format, in the format returned by {get_label_info()}.
* `lang`: The language of the labels.
* `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the
{"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no open bracket is displayed.
* `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the
{"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no close bracket is displayed.
* `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the
{"ib-content"} and {"label-content"} CSS classes. Specify this to suppress this wrapping.
* `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which
are normally wrapped in {"ib-comma"} and {"label-comma"} CSS classes).
* `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be
destructively modified in the process of this function running.
* `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are strings f the form suitable
for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the
categories are returned as a pre-formatted concatenated string.
The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels,
optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences,
but this may be suppressed for certain labels. If `nocat` wasn't given to {get_label_info()} or {process_raw_labels()},
and `split_output` wasn't given, the label objects will contain formatted categories in them, which will be inserted
into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text
inside of the open/close brackets is normally wrapped in the {"ib-content"} CSS class, but this can be suppressed, as
mentioned above.
]==]
function export.format_processed_labels(data)
if not data.labels then
error("`data` must now be an object containing the params")
end
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.labels = m_table.deepCopy(data.labels)
data.ok_to_destructively_modify = true
end
local labels = data.labels
if not labels[1] then
error("You must specify at least one label.")
end
-- Show the labels
local omit_preComma = false
local omit_postComma = true
local omit_preSpace = false
local omit_postSpace = true
for _, label in ipairs(labels) do
omit_preComma = omit_postComma
omit_preSpace = omit_postSpace
local raw_text_omit_before = label.raw_text == "middle" or label.raw_text == "end"
local raw_text_omit_after = label.raw_text == "middle" or label.raw_text == "begin"
label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before
omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after
label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before
omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after
end
if data.lang then
local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. "/functions"
local m_lang_functions = require(load_module).safe_require(lang_functions_module)
if m_lang_functions and m_lang_functions.postprocess_handlers then
for _, handler in ipairs(m_lang_functions.postprocess_handlers) do
handler(data)
end
end
end
local function wrap_css(txt, suffix)
if data.raw then
return txt
end
return ("<span class=\"ib-%s label-%s\">%s</span>"):format(suffix, suffix, txt)
end
local categories = nil
local formatted_categories = split_output and split_output ~= "raw" and {} or nil
for i, labelinfo in ipairs(labels) do
local label
-- Need to check for 'not raw_text' here because blank labels may legitimately occur as raw text if a double
-- angle bracket spec occurs at the beginning of a label. In this case we've already taken into account the
-- context and don't want to leave out a preceding comma and space e.g. in a case like
-- {{lb|en|rare|<<dialect>> or <<eye dialect>>}}. FIXME: We should reconsider whether we need this special case
-- at all.
if labelinfo.label == "" and not labelinfo.raw_text then
label = ""
else
label = (labelinfo.omit_comma and "" or wrap_css(",", "comma")) ..
(labelinfo.omit_space and "" or " ") ..
labelinfo.label
end
if split_output then
labels[i] = label
if split_output == "raw" then
if labelinfo.categories and labelinfo.categories[1] then
if categories then
m_table.extend(categories, labelinfo.categories)
else
categories = labelinfo.categories
end
end
elseif labelinfo.formatted_categories then
insert(formatted_categories, labelinfo.formatted_categories)
end
else
labels[i] = label .. (labelinfo.formatted_categories or "")
end
end
local function wrap_open_close(val)
if val then
return wrap_css(val, "brac")
else
return ""
end
end
local concatenated_labels = table.concat(labels, "")
if not data.no_ib_content then
concatenated_labels = wrap_css(concatenated_labels, "content")
end
local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close)
if split_output == "raw" then
return ret_labels, categories
elseif split_output then
return ret_labels, concat(formatted_categories)
else
return ret_labels
end
end
--[==[
Format one or more labels for display and categorization. This provides the implementation of the
{{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a
module. The return value is a string to be inserted into the generated page, including the display and categories. On
input `data` is an object with the following fields:
* `labels`: List of the labels to format.
* `lang`: The language of the labels.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the labels to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for these labels.
* `sort`: Sort key for categorization.
* `no_track_already_seen`: Don't track already-seen labels. If not specified, already-seen labels are not displayed
again, but still categorize. See the documentation of {get_label_info()}.
* `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open
parenthesis. Set to {false} to disable.
* `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close
parenthesis. Set to {false} to disable.
* `no_ib_content`: As in `format_processed_labels()`.
* `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS
class (see below).
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
Compared with {format_processed_labels()}, this function has the following differences:
# The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects.
# The open and close brackets default to parentheses ("round brackets") rather than not being displayed by default.
# Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`.
# The entire formatted result is wrapped in a {"usage-label-<var>type</var>"} CSS class (depending on the value of
`mode`), unless `raw` is given.
]==]
function export.show_labels(data)
if not data.labels then
error("`data` must now be an object containing the params")
end
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
local labels = data.labels
if not labels[1] then
error("You must specify at least one label.")
end
local mode = validate_mode(data.mode)
if not data.no_track_already_seen then
data.already_seen = {}
end
data.labels = export.process_raw_labels(data)
if data.open == nil then
data.open = "("
end
if data.close == nil then
data.close = ")"
end
local formatted = export.format_processed_labels(data)
if data.raw then
return formatted
else
return "<span class=\"" .. mode_to_outer_class[mode] .. "\">" .. formatted .. "</span>"
end
end
--[==[Helper function for the data modules.]==]
function export.alias(labels, key, aliases)
m_table.alias(labels, key, aliases)
end
--[==[
Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a
two-part link, `link` is the first part and `display` is the second part. If the display form consists of a
single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an
embedded link), `link` is the same as the passed-in `label` and `display` is nil.
]==]
function export.split_display_form(label)
if not label:find("%[%[") then
return label, nil
end
local link, display = label:match("^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$")
if link then
return link, display
end
link = label:match("^%[%[([^%[%]|])+%]%]$")
if link then
return link, link
end
return label, nil
end
--[==[
Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}.
If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed
depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string,
the return value is a blank string rather than a malformed link.)
]==]
function export.combine_display_form_parts(link, display)
if not display then
return link
end
if link == display then
if link == "" then
return ""
else
return ("[[%s]]"):format(link)
end
end
return ("[[%s|%s]]"):format(link, display)
end
--[==[Used to finalize the data into the form that is actually returned.]==]
function export.finalize_data(labels)
local shallow_copy = m_table.shallowCopy
local aliases = {}
for label, data in pairs(labels) do
if type(data) == "table" then
if data.aliases then
for _, alias in ipairs(data.aliases) do
aliases[alias] = label
end
data.aliases = nil
end
if data.deprecated_aliases then
local data2 = shallow_copy(data)
data2.deprecated = true
data2.canonical = label
for _, alias in ipairs(data2.deprecated_aliases) do
aliases[alias] = data2
end
data.deprecated_aliases = nil
data2.deprecated_aliases = nil
end
end
end
for label, data in pairs(aliases) do
labels[label] = data
end
return labels
end
return export
suogoty75rc7wpvghtef20qg65xtsmn
487748
487747
2026-09-02T15:02:31Z
SM7
6218
local
487748
Scribunto
text/plain
local export = {}
export.lang_specific_data_list_module = "Module:labels/data/lang"
export.lang_specific_data_modules_prefix = "Module:labels/data/lang/"
local load_module = "Module:load"
local parse_utilities_module = "Module:parse utilities"
local string_utilities_module = "Module:string utilities"
local utilities_module = "Module:utilities"
local insert = table.insert
local require_when_needed = require("Module:require when needed")
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local dump = mw.dumpObject
local m_lang_specific_data = mw.loadData(export.lang_specific_data_list_module)
local m_table = require_when_needed("Module:table")
--[==[ intro:
Labels go through several stages of processing to get from the original (raw) label specified in the Wikicode to the
final (formatted) label displayed to the user. The following terminology will help keep things straight:
* The "raw label" is the label specified in the Wikicode.
* The "non-canonical label" is the label extracted from the raw label, used for looking up in the label modules in order
to fetch the associated label data structure and determine the canonical form of the label. Normally this is the same
as the raw label, but it will be different if the raw label is of the form `!<var>label</var>` (e.g. `!Australian`)
`<var>label</var>!<var>display</var>` (e.g. `Southern US!Southern`). The former syntax indicates that the label
should display as-is instead of in its canonical form (which in the example given is `Australia`), and the latter
syntax indicates that the label should display in the form specified after the exclamation point.
* The "canonical label" is the result of applying alias resolution to the non-canonical label. Normally, the
canonical label rather than the non-canonical label is what is shown to the user.
* The "display form of the label" is what is shown to the user, not considering links and HTML that may wrap the
display form to get the formatted form of the label. The display form comes from the `.display` field of the module
label data for the label; if no such field exists in the label data, it is normally the canonical label. However, if
the display override exists (see below), it takes precedence over the `.display` field or canonical label when
determining the display form of the label.
* The "display override", if specified, overrides all other means of determining the display form of the label. It is
specified in two circumstances, i.e. in the `!<var>label</var>` and `<var>label</var>!<var>display</var>` raw label
formats (i.e. in the same cirumstances where the raw label and non-canonical label are different).
* The "formatted form of the label" is the final form of the label shown directly to the user. It generally appears to
the user as the display form of the label, but in the Wikicode, the formatted form may wrap the display form with a
link to Wikipedia, the Wiktionary glossary or another Wiktionary entry, and that link in turn may be wrapped in an
HTML span with a "deprecated" CSS class attached, causing the label to display differently (to indicate that it is
deprecated).
]==]
-- for testing
local force_cat = false
local m_headword_data = mw.loadData("Module:headword/data")
local SUBPAGENAME = m_headword_data.pagename
-- Disable tracking on heavy pages to save time.
local pages_where_tracking_is_disabled = m_headword_data.large_pages
-- Add tracking category for PAGE. The tracking category linked to is [[Wiktionary:Tracking/labels/PAGE]].
-- We also add to [[Wiktionary:Tracking/labels/PAGE/LANGCODE]] and [[Wiktionary:Tracking/labels/PAGE/MODE]] if
-- LANGCODE and/or MODE given.
local function track(page, langcode, mode)
if pages_where_tracking_is_disabled[SUBPAGENAME] then
return true
end
-- avoid including links in pages (may cause error)
page = page:gsub("%[", "("):gsub("%]", ")"):gsub("|", "!")
require("Module:debug/track")("labels/" .. page)
if langcode then
require("Module:debug/track")("labels/" .. page .. "/" .. langcode)
end
if mode then
require("Module:debug/track")("labels/" .. page .. "/" .. mode)
end
-- We don't currently add a tracking label for both langcode and mode to reduce the total number of labels, to
-- save some memory.
return true
end
local function ucfirst(txt)
return mw.getContentLanguage():ucfirst(txt)
end
local mode_to_outer_class = {
["label"] = "usage-label-sense",
["term-label"] = "usage-label-term",
["accent"] = "usage-label-accent",
["form-of"] = "usage-label-form-of",
}
local mode_to_property_prefix = {
["label"] = false,
["term-label"] = false, -- handled specially
["accent"] = "accent_",
["form-of"] = "form_of_",
}
local function validate_mode(mode)
mode = mode or "label"
if not mode_to_outer_class[mode] then
local allowed_values = {}
for key, _ in pairs(mode_to_outer_class) do
insert(allowed_values, "'" .. key .. "'")
end
table.sort(allowed_values)
error(("Invalid value '%s' for `mode`; should be one of %s"):format(mode, table.concat(allowed_values, ", ")))
end
return mode
end
local function getprop(labdata, mode, prop)
local mode_prefix = mode_to_property_prefix[mode]
return mode_prefix and labdata[mode_prefix .. prop] or labdata[prop]
end
local function check_type(label, lang, prop, value, expected_types)
if value == nil or expected_types == nil then
return value
end
if type(expected_types) ~= "table" then
expected_types = {expected_types}
end
local valtype = type(value)
local matches = false
for _, expected_type in ipairs(expected_types) do
if type(expected_type) == "string" then
if valtype == expected_type then
matches = true
break
end
elseif value == expected_type then
matches = true
break
end
end
if not matches then
local function join_untagged_or(elements)
return m_table.serialCommaJoin(elements, {conj = "or", dontTag = true})
end
local quoted_types = {}
local quoted_values = {}
for _, expected_type in ipairs(expected_types) do
if type(expected_type) == "string" then
insert(quoted_types, "'" .. expected_type .. "'")
else
insert(quoted_values, "'" .. dump(expected_type) .. "'")
end
end
local possible_matches = {}
if quoted_types[1] then
insert(possible_matches, ("be of type%s %s"):format(
quoted_types[2] and "s" or "", join_untagged_or(quoted_types)))
end
if quoted_values[1] then
insert(possible_matches, ("have the value%s %s"):format(
quoted_values[2] and "s" or "", join_untagged_or(quoted_values)))
end
error(("Internal error: For label '%s', langcode '%s', property '%s' should %s but is of type '%s' with value %s"):format(
label, lang and lang:getCode() or "UNKNOWN", prop, join_untagged_or(possible_matches), valtype, dump(value)))
end
end
-- HACK! For languages in any of the given families, check the specified-language Wikipedia for appropriate
-- Wikipedia articles for the language in question (esp. useful for obscure etymology-only languages that may not
-- have English articles for them, like many Chinese lects).
local families_to_wikipedia_languages = {
{"zhx", "zh"},
{"sem-arb", "ar"},
}
--[==[
Given language `lang` (a full language, etymology-language or family), fetch a list of Wikimedia languages to check
when converting a Wikidata item to a Wikipedia article. English is always first, followed by the Wikimedia language
code(s) of `lang` if `lang` is a language (which may or may not be the same as `lang`'s Wiktionary code), followed
by the macrolanguage of `lang` for certain languages and families (currently, only languages and families in the Chinese
and Arabic families). If `lang` is nil, only return English. Note that the same code may occur more than once in the
list. This is exported because it's also used by [[Module:category tree/poscatboiler/data/language varieties]].
]==]
function export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
local wikipedia_langs = {}
insert(wikipedia_langs, "hi")
if lang then
local article_lang = lang
while article_lang do
if article_lang:hasType("language") then
local wmcodes = article_lang:getWikimediaLanguageCodes()
for _, wmcode in ipairs(wmcodes) do
insert(wikipedia_langs, wmcode)
end
end
article_lang = article_lang:getParent()
end
for _, family_to_wp_lang in ipairs(families_to_wikipedia_languages) do
local family, wp_lang = unpack(family_to_wp_lang)
if lang:inFamily(family) then
insert(wikipedia_langs, wp_lang)
end
end
end
return wikipedia_langs
end
--[==[
Fetch the categories to add to a page, given that the label whose canonical form is `canon_label` with language `lang`
has been seen. `labdata` is the label data structure for `label`, fetched from the appropriate submodule. `mode`
specifies how the label was invoked (see {get_label_info()} for more information). The return value is a list of the
actual categories, unless `for_doc` is specified, in which case the categories returned are marked up for display on a
documentation page. If `for_doc` is given, `lang` may be nil to format the categories in a language-independent fashion;
otherwise, it must be specified. If `category_types` is specified, it should be a set object (i.e. with category types
as keys and {true} as values), and only categories of the specified types will be returned.
]==]
function export.fetch_categories(canon_label, labdata, lang, mode, for_doc, category_types)
local categories = {}
mode = validate_mode(mode)
local langcode, canonical_name
if lang then
langcode = lang:getFullCode()
canonical_name = lang:getFullName()
elseif for_doc then
langcode = "<var>[langcode]</var>"
canonical_name = "<var>[language name]</var>"
else
error("Internal error: Must specify `lang` unless `for_doc` is given")
end
local function labprop(prop, expected_types)
local retval = getprop(labdata, mode, prop)
check_type(canon_label, lang, prop, retval, expected_types)
return retval
end
local empty_list = {}
local function get_cats(cat_type)
if category_types and not category_types[cat_type] then
return empty_list
end
local cats = labprop(cat_type)
if not cats then
return empty_list
end
if type(cats) ~= "table" then
return {cats}
end
return cats
end
local topical_categories = get_cats("topical_categories")
local sense_categories = get_cats("sense_categories")
local pos_categories = get_cats("pos_categories")
local regional_categories = get_cats("regional_categories")
local plain_categories = get_cats("plain_categories")
local function insert_cat(cat, sense_cat)
if for_doc then
cat = "<code>" .. cat .. "</code>"
if sense_cat then
if mode == "term-label" then
cat = cat .. " (using {{tl|tlb}})"
else
cat = cat .. " (using {{tl|lb}} or form-of template)"
end
cat = mw.getCurrentFrame():preprocess(cat)
end
end
insert(categories, cat)
end
for _, cat in ipairs(topical_categories) do
insert_cat(langcode .. ":" .. (cat == true and ucfirst(canon_label) or cat))
end
for _, cat in ipairs(sense_categories) do
if cat == true then
cat = canon_label
end
cat = mode == "term-label" and cat .. " टर्म" or "टर्म " .. cat .. " सेंस के साथ"
insert_cat(canonical_name .. " " .. cat, true)
end
for _, cat in ipairs(pos_categories) do
insert_cat(canonical_name .. " " .. (cat == true and canon_label or cat))
end
for _, cat in ipairs(regional_categories) do
insert_cat((cat == true and ucfirst(canon_label) or cat) .. " " .. canonical_name)
end
for _, cat in ipairs(plain_categories) do
insert_cat(cat == true and ucfirst(canon_label) or cat)
end
return categories
end
--[==[
Return the list of all labels data modules for a label whose language is `lang`. The return value is a list of
module names, with overriding modules earlier in the list (that is, if a label occurs in two modules in the list,
the earlier-listed module takes precedence). If `lang` is nil, only return non-language-specific submodules.
]==]
function export.get_submodules(lang)
local submodules = {
"Module:labels/data",
"Module:labels/data/qualifiers",
"Module:labels/data/regional",
"Module:labels/data/topical",
}
if not lang then
return submodules
end
-- get language-specific labels from data module
local langcode = lang:getFullCode()
if m_lang_specific_data.langs_with_lang_specific_modules[langcode] then
-- prefer per-language label in order to pick subvariety labels over regional ones
insert(submodules, 1, export.lang_specific_data_modules_prefix .. langcode)
end
return submodules
end
--[==[
Return the formatted form of a label `label` (which should be the canonical form of the label; see comment at top),
given (a) the label data structure `labdata` from one of the data modules; (b) the language object `lang` of the
language being processed, or nil for no language; (c) `deprecated` (true if the label is deprecated, otherwise the
deprecation information is taken from `labdata`); (d) `override_display` (if specified, override the display form of the
label with the specified string, instead of any value in `labdata.display` or `labdata.special_display` or the canonical
label in `label` itself); (e) `mode` (same as `data.mode` passed to {get_label_info()}). Returns two values: the
formatted label form and a boolean indicating whether the label is deprecated.
'''NOTE: Under normal circumstances, do not use this.''' Instead, use {get_label_info()}, which searches all the data
modules for a given label and handles other complications.
]==]
function export.format_label(label, labdata, lang, deprecated, override_display, mode)
local formatted_label
mode = validate_mode(mode)
local function labprop(prop, expected_types)
local retval = getprop(labdata, mode, prop)
check_type(label, lang, prop, retval, expected_types)
return retval
end
deprecated = deprecated or labprop("deprecated")
if not override_display and labprop("special_display") then
local function add_language_name(str)
if str == "canonical_name" then
if lang then
return lang:getFullName()
else
return "<code><var>[language name]</var></code>"
end
else
return ""
end
end
formatted_label = labprop("special_display", "string"):gsub("<(.-)>", add_language_name)
else
--[=[
We proceed as follows:
1. The display form comes from either (a) the `override_display` variable if set (this happens when
the user uses a label like '!British'); (b) the `display` property, if set; or (c) the label iself.
2. If the display form contains a link, use it directly and ignore the other display-related settings.
(NOTE: Settings `Wikipedia` and `Wikidata` may still be used on the category page itself, by the
category tree code.)
3. Otherwise, use one of the other display-related settings, in the following order:
`glossary` > `Wiktionary` > `Wikipedia` > `Wikidata`. Specifically:
a. If any of the values is equal to `true`, that is equivalent to specifying a string consisting of
the canonical label.
b. If `glossary` is set, it specifies the anchor in [[Appendix:Glossary]].
c. If `Wiktionary` is set, it specifies an arbitrary Wiktionary page or page + anchor (e.g. a
separate Appendix entry).
d. If `Wikipedia` is set, it specifies an arbitrary Wikipedia article, or a list of such items (in
this case, we select the first one, but the category tree uses all of them).
e. If `Wikidata` is set, it specifies an arbitrary Wikidata item to retrieve a Wikipedia article from,
or a list of such items (in this case, we select the first one, but the category tree uses all of
them). If the item is of the form `wmcode:id`, the Wikipedia article corresponding to `id` in the
`wmcode`-language Wikipedia is fetched if available. Otherwise, the English-language Wikipedia
article corresponding to `id` is retrieved if available, falling back to the Wikimedia language(s)
corresponding to `lang` and then (in certain cases) to the macrolanguage that `lang` is part of.
Note that if `mode` is specified, prefixed properties (e.g. `accent_display` for `mode` == "accent",
`form_display` for `mode` == "form") are checked before the bare equivalent (e.g. `display`).
]=]
local display = override_display or labprop("display", "string") or label
-- There are several 'Foo spelling' labels specially designed for use in the |from= param in
-- {{alternative form of}}, {{standard spelling of}} and the like. Often the display includes the word
-- "spelling" at the end (e.g. if it's defaulted), which is useful when the label is used with {{tl|lb}} or
-- {{tl|tlb}}; but it causes redundancy when used with the form-of templates, which add the word "form",
-- "spelling", "standard spelling", etc. after the label.
if mode == "form-of" then
display = display:gsub(" spelling$", "")
end
if display:find("%[%[") then
formatted_label = display
else
local glossary = labprop("glossary", {"string", true})
local Wiktionary = labprop("Wiktionary", {"string", true})
local Wikipedia = labprop("Wikipedia", {"string", true, "table"})
local Wikidata = labprop("Wikidata", {"string", true, "table"})
if glossary then
local glossary_entry = glossary == true and label or glossary
formatted_label = "[[विक्षनरी:शब्दावली#" .. glossary_entry .. "|" .. display .. "]]"
elseif Wiktionary then
local Wiktionary_entry = Wiktionary == true and label or Wiktionary
if Wiktionary == display then
formatted_label = "[[" .. display .. "]]"
else
formatted_label = "[[" .. Wiktionary_entry .. "|" .. display .. "]]"
end
elseif Wikipedia then
if type(Wikipedia) == "table" then
Wikipedia = Wikipedia[1]
end
local Wikipedia_entry = Wikipedia == true and label or Wikipedia
formatted_label = "[[w:" .. Wikipedia_entry .. "|" .. display .. "]]"
elseif Wikidata then
if not mw.wikibase then
error(("Unable to retrieve data from Wikidata ID for label '%s'; `mw.wikibase` not defined"
):format(label))
end
local function make_formatted_label(wmcode, id)
local article = mw.wikibase.sitelink(id, wmcode .. "wiki")
if article then
local link = wmcode == "hi" and "w:" .. article or "w:" .. wmcode .. ":" .. article
return ("[[%s|%s]]"):format(link, display)
else
return nil
end
end
if type(Wikidata) == "table" then
Wikidata = Wikidata[1]
end
local wmcode, id = Wikidata:match("^(.*):(.*)$")
if wmcode then
formatted_label = make_formatted_label(wmcode, id)
else
local langs_to_check = export.get_langs_to_extract_wikipedia_articles_from_wikidata(lang)
for _, wmcode in ipairs(langs_to_check) do
formatted_label = make_formatted_label(wmcode, Wikidata)
if formatted_label then
break
end
end
end
formatted_label = formatted_label or display
else
formatted_label = display
end
end
end
if deprecated then
formatted_label = '<span class="deprecated-label">' .. formatted_label .. '</span>'
end
return formatted_label, deprecated
end
--[==[
Return information on a label. On input `data` is an object with the following fields:
* `label`: The raw label to return information on.
* `lang`: The language of the label. Must be specified unless `for_doc` is given.
* `mode`: How the label was invoked. One of the following:
** {nil} or {"label"}: invoked through {{tl|lb}} or another template whose labels in the same fashion, e.g.
{{tl|alt}}, {{tl|quote}} or {{tl|syn}};
** {"term-label"}: invoked through {{tl|tlb}};
** {"accent"}: invoked through {{tl|a}} or the {{para|a}} or {{para|aa}} parameters of other pronunciation templates,
such as {{tl|IPA}}, {{tl|rhymes}} or {{tl|homophones}};
** {"form-of"}: invoked through {{tl|alt form}}, {{tl|standard spelling of}} or other form-of template.
This changes the display and/or categorization of a minority of labels. (The majority work the same for all modes.)
* `for_doc`: Data is being fetched for documentation purposes. This causes the raw categories returned in
`categories` to be formatted for documentation display.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
The return value is an object with the following fields:
* `raw_text`: If specified, the object does not describe a label but simply raw text surrounding labels. This occurs
when double angle bracket (<<...>>) notation is used. {get_label_info()} does not currently return objects with this
field set, but {process_raw_labels()} does. The value is {"begin"} (this is the first raw text portion derived from
a double angle bracket spec, provided there are at least two raw text portions); {"end"} (this is the last raw text
portion derived from a double angle bracket spec, provided there are at least two portions); {"middle"} (this is
neither the first nor the last raw text portion); or {"only"} (this is a raw text portion standing by itself). The
particular value determines the handling of commas and spaces on one or both sides of the raw text. If this field is
specified, only the `label` field (containing the actual raw text) and the `category` field (containing an empty list)
are set; all other fields are {nil}.
* `raw_label`: The raw label that was passed in.
* `non_canonical`: The label prior to canonicalization (i.e. alias resolution). Usually this is the same as `raw_label`,
but if the raw label was preceded by an exclamation point (meaning "display the raw label as-is"), this field will
contain the label stripped of the exclamation point, and if the raw label is of the form
`<var>label</var>!<var>display</var>` (meaning "display the label in the specified form"), this field will contain the
label before the exclamation point.
* `canonical`: If the label in `non_canonical` is an alias, this contains the canonical name of the label; otherwise it
will be {nil}.
* `override_display`: If specified, this contains a string that overrides the normal display form of the label. The
display form of a label is the `.display` field of the label data if present, and otherwise is normally the canonical
form of the label (i.e. after alias resolution). (This is not the same as the formatted form of the label, found in
`label`, which is the final form shown to the user and includes links to Wikipedia, the glossary, etc. as well as an
HTML wrapper if the label is deprecated.) If `override_display` is specified, however, this is used in place of the
normal display form of the label. This currently happens in two circumstances: (1) the label was preceded by ! to
indicate that the raw label should be displayed rather than the canonical form; (2) the label was given in the form
`<var>label</var>!<var>display</var>` (meaning "display the label in the specified `<var>display</var>` form").
* `label`: The formatted form of the label. This is what is actually shown to the user. If the label is recognized
(found in some module), this will typically be in the form of a link.
* `categories`: A list of the categories to add the label to; an empty list if `nocat` was specified.
* `formatted_categories`: A string containing the formatted categories; {nil} if `nocat` or `for_doc` was specified,
or if `categories` is empty. Currently will be an empty string if there are categories to format but the namespace is
one that normally excludes categories (e.g. userspace and discussion pages), and `force_cat` isn't specified.
* `deprecated`: True if the label is deprecated.
* `recognized`: If true, the label was found in some module.
* `data`: The data structure for the label, as fetched from the label modules. For unrecognized labels, this will
be an empty object.
]==]
function export.get_label_info(data)
if not data.label then
error("`data` must now be an object containing the params")
end
local mode = validate_mode(data.mode)
local ret = {categories = {}}
local label = data.label
local raw_label = label
ret.raw_label = raw_label
local override_display
if label:find("^!") then
label = label:gsub("^!", "")
override_display = label
elseif label:find("![^%s]") then
label, override_display = label:match("^(.-)!([^%s].*)$")
if not label then
error(("Internal error: This Lua pattern should never fail to match for label '%s'"):format(raw_label))
end
end
local non_canonical = label
ret.non_canonical = non_canonical
local deprecated = false
local labdata
local submodule
local data_langcode = data.lang and data.lang:getCode() or nil
local submodules_to_check = export.get_submodules(data.lang)
for _, submodule_to_check in ipairs(submodules_to_check) do
submodule = mw.loadData(submodule_to_check)
local this_labdata = submodule[label]
local resolved_label
if type(this_labdata) == "string" then
resolved_label = this_labdata
this_labdata = submodule[this_labdata]
if not this_labdata then
error(("Internal error: Label alias '%s' points to '%s', which is undefined in module [[%s]]"):format(
label, resolved_label, submodule_to_check))
end
if type(this_labdata) == "string" then
error(("Internal error: Label alias '%s' points to '%s', which is also an alias (of '%s') in module [[%s]]"):format(
label, resolved_label, this_labdata, submodule_to_check))
end
end
if this_labdata then
-- Make sure either there's no lang restriction, or we're processing lang-independent, or our language
-- is among the listed languages. Otherwise, continue processing (which could conceivably pick up a
-- lang-appropriate version of the label in another label data module).
local lablangs = getprop(this_labdata, mode, "langs")
if not lablangs or not data_langcode then
labdata = this_labdata
label = resolved_label or label
break
end
local lang_in_list = false
for _, langcode in ipairs(lablangs) do
if langcode == data_langcode then
lang_in_list = true
break
end
end
if lang_in_list then
labdata = this_labdata
label = resolved_label or label
break
elseif not data.notrack then
-- Track use of a label that fails the lang restriction.
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LANGCODE]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/wrong-lang-label/LABEL/LANGCODE]]
track("wrong-lang-label", data_langcode)
track("wrong-lang-label/" .. label, data_langcode)
if resolved_label then
track("wrong-lang-label/" .. resolved_label, data_langcode)
end
end
end
end
if labdata then
ret.recognized = true
else
labdata = {}
ret.recognized = false
end
local function labprop(prop)
return getprop(labdata, mode, prop)
end
if labprop("deprecated") then
deprecated = true
end
if label ~= non_canonical then
-- Note that this is an alias and store the canonical version.
ret.canonical = label
end
if not data.notrack then -- labprop("track") then -- track all labels now
-- Track label (after converting aliases to canonical form; but also track raw label (alias) if different
-- from canonical label).
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/LANGCODE]]
-- [[Special:WhatLinksHere/Wiktionary:Tracking/labels/label/LABEL/MODE]]
track("label/" .. label, data_langcode, mode)
if label ~= non_canonical then
track("label/" .. non_canonical, data_langcode, mode)
end
end
local formatted_label
formatted_label, deprecated = export.format_label(label, labdata, data.lang, deprecated, override_display, mode)
ret.deprecated = deprecated
if deprecated then
if not data.nocat then
local depcat = "Entries with deprecated labels"
if data.for_doc then
depcat = "<code>" .. depcat .. "</code>"
end
insert(ret.categories, depcat)
end
end
local label_for_already_seen =
(labprop("topical_categories") or labprop("regional_categories")
or labprop("plain_categories") or labprop("pos_categories")
or labprop("sense_categories")) and formatted_label
or nil
-- Track label text. If label text was previously used, don't show it, but include the categories.
-- For an example, see [[hypocretin]].
if data.already_seen and data.already_seen[label_for_already_seen] then
ret.label = ""
else
if formatted_label:find("{") then
formatted_label = mw.getCurrentFrame():preprocess(formatted_label)
end
ret.label = formatted_label
end
if data.nocat then
-- do nothing
else
local cats = export.fetch_categories(label, labdata, data.lang, mode, data.for_doc)
for _, cat in ipairs(cats) do
insert(ret.categories, cat)
end
if not ret.categories[1] or data.for_doc then
-- Don't try to format categories if we're doing this for documentation ({{label/doc}}), because there
-- will be HTML in the categories.
-- do nothing
else
ret.formatted_categories = require(utilities_module).format_categories(ret.categories, data.lang,
data.sort, nil, force_cat or data.force_cat)
end
end
ret.data = labdata
if label_for_already_seen and data.already_seen then
data.already_seen[label_for_already_seen] = true
end
return ret
end
--[==[
Split a string containing comma-separated raw labels into the individual labels. This will not split on a comma
followed by whitespace, and it will not split inside of matched <...> or [...]. The code is written to be efficient, so
that it does not load modules (e.g. [[Module:parse utilities]]) unnecessarily.
]==]
function export.split_labels_on_comma(term)
if term:find("[%[<]") then
-- Do it the "hard way". We don't want to split anything inside of <...> or <<...>> even if there are commas
-- inside of the angle brackets. For good measure we do the same for [...] and [[...]]. We first parse balanced
-- segment runs involving either [...] or <...>. Then we split alternating runs on comma (but not on
-- comma+whitespace). Then we rejoin the split runs. For example, given the following:
-- "regional,older <<non-rhotic,and,non-hoarse-horse>> speakers", the first call to
-- parse_multi_delimiter_balanced_segment_run() produces
--
-- {"regional,older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}
--
-- After calling split_alternating_runs_on_comma(), we get the following:
--
-- {{"regional"}, {"older ", "<<non-rhotic,and,non-hoarse-horse>>", " speakers"}}
--
-- After rejoining each group, we get:
--
-- {"regional", "older <<non-rhotic,and,non-hoarse-horse>> speakers"}
--
-- which is the desired output. When processing the second "label" string, the code in process_raw_labels()
-- will do a similar process to this to pull out the labels inside of the <<...>> notation.
local put = require(parse_utilities_module)
local segments = put.parse_multi_delimiter_balanced_segment_run(term, {{"<", ">"}, {"[", "]"}})
-- This won't split on comma+whitespace.
local comma_separated_groups = put.split_alternating_runs_on_comma(segments)
for i, group in ipairs(comma_separated_groups) do
comma_separated_groups[i] = table.concat(group)
end
return comma_separated_groups
elseif term:find(",%s") then
-- This won't split on comma+whitespace.
return require(parse_utilities_module).split_on_comma(term)
elseif term:find(",") then
return require(string_utilities_module).split(term, ",")
else
return {term}
end
end
--[==[
Return a list of objects corresponding to a set of raw labels. Each object returned is of the format returned by
{get_label_info()}. This is similar to looping over the labels and calling {get_label_info()} on each one, but it also
correctly handles embedded double angle bracket specs <<...>> found in the labels. (In such a case, there will be more
objects returned than raw labels passed in.) On input, `data` is an object with the following fields:
* `labels`: The list of labels to process.
* `lang`: The language of the labels. Must be specified.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
]==]
function export.process_raw_labels(data)
local label_infos = {}
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
local function get_info_and_insert(label)
-- Reuse this structure to save memory.
data.label = label
insert(label_infos, export.get_label_info(data))
end
for _, label in ipairs(data.labels) do
if label:find("<<") then
local segments = require(string_utilities_module).split(label, "<<(.-)>>")
for i, segment in ipairs(segments) do
if i % 2 == 1 then
local raw_text_type = i == 1 and "begin" or i == #segments and "end" or "middle"
insert(label_infos, {raw_text = raw_text_type, label = segment, categories = {}})
else
local segment_labels = export.split_labels_on_comma(segment)
for _, segment_label in ipairs(segment_labels) do
get_info_and_insert(segment_label)
end
end
end
else
get_info_and_insert(label)
end
end
return label_infos
end
--[==[
Split a comma-separated string of raw labels and process each label to get a list of objects suitable for passing to
{format_processed_labels()}. Each object returned is of the format returned by {get_label_info()}. This is equivalent to
calling {split_labels_on_comma()} followed by {process_raw_labels()}. On input, `data` is an object with the following
fields:
* `labels`: The string containing the raw comma-separated labels.
* `lang`: The language of the labels. Must be specified.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the label to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for this label.
* `sort`: Sort key for categorization.
* `already_seen`: An object used to track labels already seen, so they aren't displayed twice. Tracking is according
to the display form of the label, so if two labels have the same display form, the second one won't be displayed
(but its categories will still be added). If `already_seen` is {nil}, this tracking doesn't happen.
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
]==]
function export.split_and_process_raw_labels(data)
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
data.labels = export.split_labels_on_comma(data.labels)
return export.process_raw_labels(data)
end
--[==[
Format one or more already-processed labels for display and categorization. "Already-processed" means that
{get_label_info()} or {process_raw_labels()} has been called on the raw labels to convert them into objects containing
information on how to display and categorize the labels. This is a lower-level alternative to {show_labels()} and is
meant for modules such as [[Module:alternative forms]], [[Module:quote]] and [[Module:etymology/templates/descendant]]
that support displaying labels along with some other information.
On input `data` is an object with the following fields:
* `labels`: List of the label objects to format, in the format returned by {get_label_info()}.
* `lang`: The language of the labels.
* `open`: Open bracket or parenthesis to display before the concatenated labels. If specified, it is wrapped in the
{"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no open bracket is displayed.
* `close`: Close bracket or parenthesis to display after the concatenated labels. If specified, it is wrapped in the
{"ib-brac"} and {"label-brac"} CSS classes. If {nil} or {false}, no close bracket is displayed.
* `no_ib_content`: By default, the concatenated formatted labels inside of the open/close brackets are wrapped in the
{"ib-content"} and {"label-content"} CSS classes. Specify this to suppress this wrapping.
* `raw`: Suppress all CSS wrapping of content, including open/close parentheses, content and comma delimiters (which
are normally wrapped in {"ib-comma"} and {"label-comma"} CSS classes).
* `ok_to_destructively_modify`: If set, the `data` structure, and the `data.labels` table inside of it, will be
destructively modified in the process of this function running.
* `split_output`: If not given, the return value is a concatenation of the formatted concatenated labels and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are strings f the form suitable
for passing to {format_categories()} in [[Module:utilities]]. If `split_output` is any other value besides {nil}, the
categories are returned as a pre-formatted concatenated string.
The return value (or the first return value, if `split_output` is given) is a string containing the contenated labels,
optionally surrounded by open/close brackets or parentheses. Normally, labels are separated by comma-space sequences,
but this may be suppressed for certain labels. If `nocat` wasn't given to {get_label_info()} or {process_raw_labels()},
and `split_output` wasn't given, the label objects will contain formatted categories in them, which will be inserted
into the returned text. (Use `split_output` if you need the categories returned separately.) The concatenated text
inside of the open/close brackets is normally wrapped in the {"ib-content"} CSS class, but this can be suppressed, as
mentioned above.
]==]
function export.format_processed_labels(data)
if not data.labels then
error("`data` must now be an object containing the params")
end
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.labels = m_table.deepCopy(data.labels)
data.ok_to_destructively_modify = true
end
local labels = data.labels
if not labels[1] then
error("You must specify at least one label.")
end
-- Show the labels
local omit_preComma = false
local omit_postComma = true
local omit_preSpace = false
local omit_postSpace = true
for _, label in ipairs(labels) do
omit_preComma = omit_postComma
omit_preSpace = omit_postSpace
local raw_text_omit_before = label.raw_text == "middle" or label.raw_text == "end"
local raw_text_omit_after = label.raw_text == "middle" or label.raw_text == "begin"
label.omit_comma = omit_preComma or (label.data and label.data.omit_preComma) or raw_text_omit_before
omit_postComma = (label.data and label.data.omit_postComma) or raw_text_omit_after
label.omit_space = omit_preSpace or (label.data and label.data.omit_preSpace) or raw_text_omit_before
omit_postSpace = (label.data and label.data.omit_postSpace) or raw_text_omit_after
end
if data.lang then
local lang_functions_module = export.lang_specific_data_modules_prefix .. data.lang:getCode() .. "/functions"
local m_lang_functions = require(load_module).safe_require(lang_functions_module)
if m_lang_functions and m_lang_functions.postprocess_handlers then
for _, handler in ipairs(m_lang_functions.postprocess_handlers) do
handler(data)
end
end
end
local function wrap_css(txt, suffix)
if data.raw then
return txt
end
return ("<span class=\"ib-%s label-%s\">%s</span>"):format(suffix, suffix, txt)
end
local categories = nil
local formatted_categories = split_output and split_output ~= "raw" and {} or nil
for i, labelinfo in ipairs(labels) do
local label
-- Need to check for 'not raw_text' here because blank labels may legitimately occur as raw text if a double
-- angle bracket spec occurs at the beginning of a label. In this case we've already taken into account the
-- context and don't want to leave out a preceding comma and space e.g. in a case like
-- {{lb|en|rare|<<dialect>> or <<eye dialect>>}}. FIXME: We should reconsider whether we need this special case
-- at all.
if labelinfo.label == "" and not labelinfo.raw_text then
label = ""
else
label = (labelinfo.omit_comma and "" or wrap_css(",", "comma")) ..
(labelinfo.omit_space and "" or " ") ..
labelinfo.label
end
if split_output then
labels[i] = label
if split_output == "raw" then
if labelinfo.categories and labelinfo.categories[1] then
if categories then
m_table.extend(categories, labelinfo.categories)
else
categories = labelinfo.categories
end
end
elseif labelinfo.formatted_categories then
insert(formatted_categories, labelinfo.formatted_categories)
end
else
labels[i] = label .. (labelinfo.formatted_categories or "")
end
end
local function wrap_open_close(val)
if val then
return wrap_css(val, "brac")
else
return ""
end
end
local concatenated_labels = table.concat(labels, "")
if not data.no_ib_content then
concatenated_labels = wrap_css(concatenated_labels, "content")
end
local ret_labels = wrap_open_close(data.open) .. concatenated_labels .. wrap_open_close(data.close)
if split_output == "raw" then
return ret_labels, categories
elseif split_output then
return ret_labels, concat(formatted_categories)
else
return ret_labels
end
end
--[==[
Format one or more labels for display and categorization. This provides the implementation of the
{{tl|label}}/{{tl|lb}}, {{tl|term label}}/{{tl|tlb}} and {{tl|accent}}/{{tl|a}} templates, and can also be called from a
module. The return value is a string to be inserted into the generated page, including the display and categories. On
input `data` is an object with the following fields:
* `labels`: List of the labels to format.
* `lang`: The language of the labels.
* `mode`: How the label was invoked; see {get_label_info()} for more information.
* `nocat`: If true, don't add the labels to any categories.
* `force_cat`: Force adding categories even in namespaces that normally exclude them (e.g. userspace and discussion
pages).
* `notrack`: Disable all tracking for these labels.
* `sort`: Sort key for categorization.
* `no_track_already_seen`: Don't track already-seen labels. If not specified, already-seen labels are not displayed
again, but still categorize. See the documentation of {get_label_info()}.
* `open`: Open bracket or parenthesis to display before the concatenated labels. If {nil}, defaults to an open
parenthesis. Set to {false} to disable.
* `close`: Close bracket or parenthesis to display after the concatenated labels. If {nil}, defaults to a close
parenthesis. Set to {false} to disable.
* `no_ib_content`: As in `format_processed_labels()`.
* `raw`: As in `format_processed_labels()`. Also suppress wrapping the entire formatted result in a usage label CSS
class (see below).
* `ok_to_destructively_modify`: If set, the `data` structure will be destructively modified in the process of this
function running.
Compared with {format_processed_labels()}, this function has the following differences:
# The labels specified in `labels` are raw labels (i.e. strings) rather than formatted objects.
# The open and close brackets default to parentheses ("round brackets") rather than not being displayed by default.
# Tracking of already-seen labels is enabled unless explicitly turned off using `no_track_already_seen`.
# The entire formatted result is wrapped in a {"usage-label-<var>type</var>"} CSS class (depending on the value of
`mode`), unless `raw` is given.
]==]
function export.show_labels(data)
if not data.labels then
error("`data` must now be an object containing the params")
end
if not data.ok_to_destructively_modify then
data = m_table.shallowCopy(data)
data.ok_to_destructively_modify = true
end
local labels = data.labels
if not labels[1] then
error("You must specify at least one label.")
end
local mode = validate_mode(data.mode)
if not data.no_track_already_seen then
data.already_seen = {}
end
data.labels = export.process_raw_labels(data)
if data.open == nil then
data.open = "("
end
if data.close == nil then
data.close = ")"
end
local formatted = export.format_processed_labels(data)
if data.raw then
return formatted
else
return "<span class=\"" .. mode_to_outer_class[mode] .. "\">" .. formatted .. "</span>"
end
end
--[==[Helper function for the data modules.]==]
function export.alias(labels, key, aliases)
m_table.alias(labels, key, aliases)
end
--[==[
Split the display form of a label. Returns two values: `link` and `display`. If the display form consists of a
two-part link, `link` is the first part and `display` is the second part. If the display form consists of a
single-part link, `link` and `display` are the same. Otherwise (the display form is not a link or contains an
embedded link), `link` is the same as the passed-in `label` and `display` is nil.
]==]
function export.split_display_form(label)
if not label:find("%[%[") then
return label, nil
end
local link, display = label:match("^%[%[([^%[%]|]+)|([^%[%]|]+)%]%]$")
if link then
return link, display
end
link = label:match("^%[%[([^%[%]|])+%]%]$")
if link then
return link, link
end
return label, nil
end
--[==[
Combine the `link` and `display` parts of the display form of a label as returned by {split_display_form()}.
If `display` is nil, `link` is returned directly. Otherwise, a one-part or two-part link is constructed
depending on whether `link` and `display` are the same. (As a special case, if both consist of a blank string,
the return value is a blank string rather than a malformed link.)
]==]
function export.combine_display_form_parts(link, display)
if not display then
return link
end
if link == display then
if link == "" then
return ""
else
return ("[[%s]]"):format(link)
end
end
return ("[[%s|%s]]"):format(link, display)
end
--[==[Used to finalize the data into the form that is actually returned.]==]
function export.finalize_data(labels)
local shallow_copy = m_table.shallowCopy
local aliases = {}
for label, data in pairs(labels) do
if type(data) == "table" then
if data.aliases then
for _, alias in ipairs(data.aliases) do
aliases[alias] = label
end
data.aliases = nil
end
if data.deprecated_aliases then
local data2 = shallow_copy(data)
data2.deprecated = true
data2.canonical = label
for _, alias in ipairs(data2.deprecated_aliases) do
aliases[alias] = data2
end
data.deprecated_aliases = nil
data2.deprecated_aliases = nil
end
end
end
for label, data in pairs(aliases) do
labels[label] = data
end
return labels
end
return export
8y4w3lzzgvhvzvuw0dmsn1oub3ws07b
मॉड्यूल:labels/data
828
302252
487766
479150
2026-09-02T16:33:34Z
SM7
6218
updating...
487766
Scribunto
text/plain
local labels = {}
-- Grammatical labels
labels["abbreviation"] = {
aliases = {"abbreviations", "abbreviated"},
glossary = true,
pos_categories = "abbreviations",
}
labels["abstract noun"] = {
display = "abstract",
glossary = true,
pos_categories = "abstract nouns",
}
labels["abstract verb"] = {
display = "abstract",
glossary = true,
pos_categories = "abstract verbs",
}
labels["acronym"] = {
glossary = true,
pos_categories = "acronyms",
}
labels["active voice"] = {
aliases = {"active", "in active", "in the active", "in active voice", "in the active voice"},
glossary = true,
}
labels["ambitransitive"] = {
aliases = {"ambitransitively"},
glossary = true,
pos_categories = {"transitive verbs", "intransitive verbs"},
}
labels["angry register"] = {
aliases = {"angry", "anger", "said in anger"},
glossary = true,
pos_categories = "angry register terms",
}
labels["animate"] = {
glossary = true,
}
labels["indicative"] = {
aliases = {"in the indicative", "indicative mood"},
glossary = "indicative mood",
}
labels["subjunctive"] = {
aliases = {"in the subjunctive", "subjunctive mood"},
glossary = "subjunctive mood",
}
labels["imperative"] = {
aliases = {"in the imperative", "imperative mood"},
glossary = "imperative mood",
}
labels["jussive"] = {
aliases = {"in the jussive", "jussive mood"},
glossary = "jussive mood",
}
labels["atelic"] = {
glossary = true,
}
labels["attenuative"] = {
pos_categories = "attenuative verbs",
}
labels["attributive"] = {
glossary = true,
}
labels["attributively"] = {
glossary = "attributive",
}
labels["auxiliary"] = {
glossary = true,
pos_categories = "auxiliary verbs",
}
labels["cardinal"] = {
aliases = {"cardinal number", "cardinal numeral"},
display = "[[cardinal number]]",
pos_categories = "cardinal numbers",
}
labels["catenative"] = {
glossary = "catenative verb",
}
labels["causative"] = {
glossary = true,
}
labels["causative verb"] = {
display = "causative",
glossary = true,
pos_categories = "causative verbs",
}
labels["cognate object"] = {
aliases = {"with cognate object"},
display = "with [[w:Cognate object|cognate object]]",
pos_categories = "verbs used with cognate objects",
}
labels["collective"] = {
glossary = true,
display = "collective",
pos_categories = "collective nouns",
}
labels["collectively"] = {
glossary = "collective",
display = "collectively",
pos_categories = "collective nouns",
}
labels["collective number"] = {
aliases = {"collective numeral"},
display = "[[collective number]]",
pos_categories = "collective numbers",
}
labels["common"] = {
glossary = true,
}
labels["comparable"] = {
glossary = true,
}
labels["completive"] = {
pos_categories = "completive verbs",
}
labels["concrete verb"] = {
display = "concrete",
Wiktionary = true,
pos_categories = "concrete verbs",
}
labels["contraction"] = {
aliases = {"contractions", "contracted"},
glossary = true,
pos_categories = "contractions",
}
labels["control verb"] = {
aliases = {"control"},
Wikipedia = true,
pos_categories = "control verbs",
}
labels["copulative"] = {
aliases = {"copular"},
glossary = true,
pos_categories = "copulative verbs",
}
labels["countable"] = {
glossary = true,
pos_categories = "countable nouns",
}
labels["cumulative"] = {
pos_categories = "cumulative verbs",
}
labels["defective adjective"] = {
aliases = {"defective a", "defective adj", "defective adjectives"},
display = "defective",
glossary = true,
pos_categories = "defective adjectives",
}
labels["defective noun"] = {
aliases = {"defective n", "defective nouns"},
display = "defective",
glossary = true,
pos_categories = "defective nouns",
}
labels["defective verb"] = {
aliases = {"defective v", "defective vb", "defective verbs"},
display = "defective",
glossary = true,
pos_categories = "defective verbs",
}
labels["definite"] = {
aliases = {"def"},
glossary = true,
}
labels["deliberate misspelling"] = {
deprecated_aliases = {"deliberate mispelling"},
display = "deliberate [[misspelling]]",
}
labels["delimitative"] = {
pos_categories = "delimitative verbs",
}
labels["deponent"] = {
glossary = true,
pos_categories = "deponent verbs",
}
labels["distributive"] = {
pos_categories = "distributive verbs",
}
labels["distributive number"] = {
aliases = {"distributive numeral"},
display = "[[distributive number]]",
pos_categories = "distributive numbers",
}
labels["ditransitive"] = {
aliases = {"ditransitively"},
glossary = true,
pos_categories = "ditransitive verbs",
}
labels["dual only"] = {
aliases = {"dual-only", "dualonly", "duale tantum"},
display = "[[dual]] only",
pos_categories = "dualia tantum",
}
labels["dysphemistic"] = {
aliases = {"dysphemism"},
glossary = "dysphemism",
pos_categories = "dysphemisms",
}
labels["by ellipsis"] = {
aliases = {"ellipsis"},
glossary = "ellipsis",
pos_categories = "ellipses",
}
labels["elongated"] = {
aliases = {"elongation"},
glossary = true,
pos_categories = "elongated forms",
}
labels["emphatic"] = {
glossary = true,
}
labels["ergative"] = {
glossary = true,
pos_categories = "ergative verbs",
}
labels["expressive"] = {
glossary = true,
pos_categories = "expressive terms",
}
labels["by extension"] = {
aliases = {"hence"},
}
labels["feminine"] = {
glossary = true,
}
labels["focus"] = {
glossary = true,
pos_categories = "focus adverbs",
}
labels["fractional"] = {
aliases = {"fractional number", "fractional numeral"},
display = "[[fractional number]]",
pos_categories = "fractional numbers",
}
labels["frequentative"] = {
glossary = true,
pos_categories = "frequentative verbs",
}
labels["hedge"] = {
aliases = {"hedges"},
glossary = true,
pos_categories = "hedges",
}
labels["ideophonic"] = {
aliases = {"ideophone"},
glossary = true,
}
labels["idiomatic"] = {
aliases = {"idiom", "idiomatically"},
glossary = true,
pos_categories = "idioms",
}
labels["imperfect"] = {
glossary = true,
}
labels["imperfective"] = {
glossary = true,
pos_categories = "imperfective verbs",
}
labels["impersonal"] = {
glossary = "impersonal verb",
pos_categories = "impersonal verbs",
}
labels["in the singular"] = {
aliases = {"in singular"},
display = "in the [[singular]]",
}
labels["in the dual"] = {
aliases = {"in dual"},
display = "in the [[dual]]",
}
labels["in the plural"] = {
aliases = {"in plural"},
display = "in the [[Appendix:Glossary#plural|plural]]",
}
labels["inanimate"] = {
aliases = {"not animate"},
glossary = true,
}
labels["inchoative"] = {
glossary = true,
pos_categories = "inchoative verbs",
}
labels["indefinite"] = {
aliases = {"indef", "not definite"},
glossary = true,
}
labels["initialism"] = {
glossary = true,
pos_categories = "initialisms",
}
labels["intensive verb"] = {
display = "intensive",
pos_categories = "intensive verbs",
}
labels["intransitive"] = {
aliases = {"not transitive", "intransitively", "not transitively"},
glossary = true,
pos_categories = "intransitive verbs",
}
labels["IPA"] = {
aliases = {"International Phonetic Alphabet"},
Wikipedia = "International Phonetic Alphabet",
plain_categories = "IPA symbols",
}
labels["iterative"] = {
glossary = true,
pos_categories = "iterative verbs",
}
labels["litotes"] = {
aliases = {"litote", "litotic", "litotical"},
glossary = true,
pos_categories = true,
}
labels["masculine"] = {
glossary = true,
}
labels["mediopassive voice"] = {
aliases = {"mediopassive", "middle passive", "middle-passive", "in mediopassive", "in middle passive", "in middle-passive", "in the mediopassive", "in the middle passive", "in the middle-passive", "in mediopassive voice", "in middle passive voice", "in middle-passive voice", "in the mediopassive voice", "in the middle passive voice", "in the middle-passive voice"},
glossary = true,
}
labels["meiosis"] = {
aliases = {"meioses", "meiotic"},
glossary = true,
pos_categories = "meioses",
}
labels["middle voice"] = {
aliases = {"middle", "in middle", "in the middle", "in middle voice", "in the middle voice"},
glossary = true,
}
labels["वर्तनी त्रुटि"] = {
deprecated_aliases = {"वर्तनी त्रुटि"},
display = "[[वर्तनी त्रुटि]]",
}
labels["mnemonic"] = {
display = "[[mnemonic]]",
pos_categories = "mnemonics",
}
labels["modal"] = {
Wikipedia = "Modality (linguistics)",
}
labels["modal adverb"] = {
aliases = {"modal adverbs"},
display = "modal",
Wikipedia = "Modality (linguistics)",
pos_categories = "modal adverbs",
}
labels["modal verb"] = {
aliases = {"modal verbs"},
display = "modal",
Wikipedia = "Modality (linguistics)",
pos_categories = "modal verbs",
}
labels["NAPA"] = {
aliases = {"Americanist_phonetic_notation"},
Wikipedia = "Americanist_phonetic_notation",
plain_categories = "NAPA symbols",
}
labels["always in the negative"] = {
display = "always in the [[Appendix:Glossary#negative polarity item|negative]]",
pos_categories = "negative polarity items",
}
labels["chiefly in the negative"] = {
aliases = {"chiefly used in the negative", "negative polarity", "negative polarity item", "usually in the negative", "usually used in the negative"},
display = "chiefly in the [[Appendix:Glossary#negative polarity item|negative]]",
pos_categories = "negative polarity items",
}
labels["chiefly in the negative plural"] = {
aliases = {"chiefly used in the negative plural", "negative polarity plural", "negative polarity plural item", "usually in the negative plural", "usually used in the negative plural"},
display = "chiefly in the [[Appendix:Glossary#negative polarity item|negative]] [[Appendix:Glossary#plural|plural]]",
pos_categories = "negative polarity items",
}
labels["always in the positive"] = {
display = "always in the [[Appendix:Glossary#positive polarity item|positive]]",
-- pos_categories = {"positive polarity items"},
}
labels["chiefly in the positive"] = {
aliases = {"chiefly used in the positive", "positive polarity", "positive polarity item", "usually in the positive", "usually used in the positive"},
display = "chiefly in the [[Appendix:Glossary#positive polarity item|positive]]",
-- pos_categories = {"positive polarity items"},
}
labels["chiefly in the positive plural"] = {
aliases = {"chiefly used in the positive plural", "positive polarity plural", "positive polarity plural item", "usually in the positive plural", "usually used in the positive plural"},
display = "chiefly in the [[Appendix:Glossary#positive polarity item|positive]] [[Appendix:Glossary#plural|plural]]",
-- pos_categories = "positive polarity items",
}
labels["neuter"] = {
glossary = true,
}
-- British English ("ise")
labels["nominalised"] = {
aliases = {"nominalisation", "substantivised", "substantivisation"},
glossary = "nominalization",
pos_categories = "nominalized adjectives",
}
-- American English ("ize")
labels["nominalized"] = {
aliases = {"nominalization", "substantivized", "substantivization"},
glossary = "nominalization",
pos_categories = "nominalized adjectives",
}
labels["not comparable"] = {
aliases = {"notcomp", "incomparable", "uncomparable"},
glossary = "uncomparable",
}
labels["onomatopoeia"] = {
glossary = true,
pos_categories = "onomatopoeias",
}
labels["ordinal"] = {
aliases = {"ordinal number", "ordinal numeral"},
display = "[[ordinal number]]",
pos_categories = "ordinal numbers",
}
labels["partitive verb"] = {
display = "[[Appendix:Glossary#transitive|transitive]], usually [[Appendix:Finnic telic and atelic verbs|atelic]]",
pos_categories = "transitive verbs", -- = "partitive verbs",
}
labels["perfect"] = {
glossary = true,
}
labels["participle"] = {
glossary = true,
}
labels["passive voice"] = {
aliases = {"passive", "in passive", "in the passive", "in passive voice", "in the passive voice"},
glossary = true,
}
labels["perfect"] = {
glossary = true,
}
labels["perfective"] = {
glossary = true,
pos_categories = "perfective verbs",
}
labels["plural only"] = {
aliases = {"plural-only", "pluralonly", "plurale tantum"},
display = "[[Appendix:Glossary#plural|plural]] only",
pos_categories = "pluralia tantum",
}
labels["possessional adjective"] = {
aliases = {"possessional", "possessional adjectives"},
display = "possessional",
glossary = true,
pos_categories = "possessional adjectives",
}
labels["possessive pronoun"] = {
aliases = {"possessive determiner"},
display = "possessive",
glossary = "possessive determiner",
pos_categories = "possessive pronouns",
}
labels["postpositive"] = {
glossary = true,
}
labels["predicative"] = {
glossary = true,
}
labels["predicatively"] = {
glossary = "predicative",
}
labels["prepositive"] = {
glossary = true,
}
labels["prescriptive"] = {
aliases = {"normative", "prescribed"},
glossary = true,
}
labels["privative"] = {
pos_categories = "privative verbs",
}
labels["procedure word"] = {
display = "[[procedure word]]",
}
labels["productive"] = {
glossary = true,
}
-- TODO: This label is probably inappropriate for many languages
labels["pronominal"] = {
glossary = "pronominal verb",
}
labels["pronunciation spelling"] = {
glossary = true,
}
labels["pro-verb"] = {
Wikipedia = true,
}
labels["reciprocal"] = {
glossary = true,
pos_categories = "reciprocal verbs",
}
labels["reflexive"] = {
glossary = true,
pos_categories = "reflexive verbs",
}
labels["reflexive pronoun"] = {
glossary = "reflexive",
pos_categories = "reflexive pronouns",
}
labels["relational"] = {
glossary = true,
pos_categories = "relational adjectives",
}
labels["repetitive"] = {
pos_categories = "repetitive verbs",
}
labels["respelling"] = {
glossary = true,
}
labels["reversative"] = {
pos_categories = "reversative verbs",
}
labels["rhetorical question"] = {
glossary = true,
pos_categories = "rhetorical questions",
}
labels["rhotic"] = {
glossary = true,
}
labels["saturative"] = {
aliases = {"sative"},
pos_categories = "saturative verbs",
}
labels["semelfactive"] = {
glossary = true,
pos_categories = "semelfactive verbs",
}
labels["sentence adverb"] = {
glossary = true,
pos_categories = "sentence adverbs",
}
labels["set phrase"] = {
display = "[[set phrase]]",
}
labels["simile"] = {
glossary = true,
pos_categories = "similes",
}
labels["singular only"] = {
aliases = {"singular-only", "singulare tantum", "no plural"},
display = "singular only",
pos_categories = "singularia tantum",
}
labels["snowclone"] = {
glossary = true,
pos_categories = "snowclones",
}
labels["stative"] = {
aliases = {"stative verb"},
glossary = true,
pos_categories = "stative verbs",
}
labels["strictly"] = {
aliases = {"strict", "narrowly", "narrow"},
glossary = true,
}
labels["substantive"] = {
glossary = true,
track = true,
}
labels["terminative"] = {
pos_categories = "terminative verbs",
}
labels["transitive"] = {
aliases = {"transitively"},
glossary = true,
pos_categories = "transitive verbs",
}
labels["transmission error"] = {
Wiktionary = true,
}
labels["unaccusative"] = {
aliases = {"not accusative"},
Wikipedia = "Unaccusative verb",
}
labels["uncountable"] = {
aliases = {"not countable"},
glossary = true,
pos_categories = "uncountable nouns",
}
labels["unergative"] = {
aliases = {"not ergative"},
Wikipedia = "Unergative verb",
}
labels["UPA"] = {
aliases = {"Uralic Phonetic Alphabet"},
Wikipedia = "Uralic Phonetic Alphabet",
plain_categories = "UPA symbols",
}
labels["usually plural"] = {
aliases = {"usually in the plural", "usually in plural"},
display = "usually in the [[Appendix:Glossary#plural|plural]]",
deprecated = true,
}
-- Usage labels
labels["4chan"] = {
aliases = {"4chan slang"},
display = "[[w:4chan|4chan]] {{glossary|slang}}",
pos_categories = "4chan slang",
}
labels["4chan lgbt"] = {
aliases = {"tttt"},
display = "[[w:4chan|4chan]] /lgbt/ {{glossary|slang}}",
pos_categories = "4chan /lgbt/ slang",
}
labels["ACG"] = {
display = "[[ACG]]",
-- see also "fandom slang"
pos_categories = "fandom slang",
}
labels["endearing"] = {
aliases = {"affectionate"},
display = "[[endearing]]",
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "endearing terms",
}
labels["endearing form"] = {
aliases = {"affectionate form"},
display = "[[endearing]]",
pos_categories = "endearing forms",
}
labels["pre-classical"] = {
aliases = {"Pre-classical", "pre-Classical", "Pre-Classical", "Preclassical", "preclassical", "ante-classical", "Ante-classical", "ante-Classical", "Ante-Classical", "Anteclassical", "anteclassical"},
display = "pre-Classical",
regional_categories = true,
}
labels["anti-LGBTQ slur"] = {
-- don't add aliases "homophobia" or "transphobia" because these could be topical categories
aliases = {"homophobic", "transphobic"},
display = "anti-[[LGBTQ]] [[slur]]",
pos_categories = "anti-LGBTQ slurs",
}
labels["archaic"] = {
aliases = {"antiquated"},
glossary = true,
sense_categories = true,
}
labels["archaic form"] = {
glossary = "archaic",
display = "archaic",
pos_categories = "archaic forms",
}
labels["Australian slang"] = {
display = "[[Australian]] {{glossary|slang}}",
regional_categories = "Australian",
plain_categories = true,
}
labels["avoidance"] = {
glossary = true,
}
labels["back slang"] = {
aliases = {"backslang", "back-slang"},
glossary = "backslang",
pos_categories = true,
}
labels["Bargoens"] = {
Wikipedia = true,
plain_categories = true,
}
labels["Braille"] = {
Wikipedia = true,
}
labels["British slang"] = {
aliases = {"UK slang"},
display = "[[British]] {{glossary|slang}}",
plain_categories = true,
}
labels["Cambridge University slang"] = {
aliases = {"University of Cambridge slang", "Cantab slang"},
display = "[[w:University of Cambridge|Cambridge University]] {{glossary|slang}}",
topical_categories = "Universities",
plain_categories = true,
}
labels["cant"] = {
aliases = {"argot", "cryptolect"},
display = "[[cant]]",
pos_categories = true,
}
labels["capitalized"] = {
aliases = {"capitalised"},
display = "[[capitalisation|capitalized]]",
}
labels["Castilianism"] = {
aliases = {"Hispanicism"},
display = "[[Castilianism]]",
}
labels["childish"] = {
aliases = {"baby talk", "child language", "infantile", "puerile"},
display = "[[childish]]",
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
pos_categories = "childish terms",
}
labels["chu Nom"] = {
display = "[[Vietnamese]] [[chữ Nôm]]",
plain_categories = "Vietnamese Han tu",
}
labels["Cockney rhyming slang"] = {
display = "[[Cockney rhyming slang]]",
plain_categories = true,
}
labels["colloquial"] = {
aliases = {"colloquially"},
glossary = true,
pos_categories = "colloquialisms",
}
-- FIXME! The following two are apparently for Persian but probably don't belong in this file.
labels["colloquial-um"] = {
glossary = "colloquial",
pos_categories = "colloquialisms containing sequence um",
}
labels["colloquial-un"] = {
glossary = "colloquial",
pos_categories = "colloquialisms containing sequence un",
}
labels["corporate jargon"] = {
aliases = {"business jargon", "corporatese", "businessese", "corporate speak", "business speak"},
display = "[[corporate]] [[jargon]]",
pos_categories = true,
}
labels["costermongers"] = {
aliases = {"coster", "costers", "costermonger", "costermongers back slang", "costermongers' back slang"},
display = "[[Appendix:Costermongers' back slang|costermongers]]",
plain_categories = "Costermongers' back slang",
}
labels["criminal slang"] = {
aliases = {"thieves' cant", "Thieves' Cant", "thieves cant", "thieves'", "thieves", "thieves' cant"}, -- Thieves' Cant is English-only, so defined in the English submodule; if other languages try to use it, it's just criminal slang
display = "[[criminal]] {{glossary|slang}}",
topical_categories = "Crime",
pos_categories = true,
}
labels["dated"] = {
aliases = {"old-fashioned"},
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "dated terms",
}
labels["dated form"] = {
aliases = {"old-fashioned form"},
glossary = "dated",
display = "dated",
pos_categories = "dated forms",
}
-- combine with previous?
labels["dated sense"] = {
glossary = "dated",
sense_categories = "dated",
}
labels["derogatory"] = {
aliases = {"pejorative", "derogative", "disparaging"},
display = "[[derogatory]]",
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "derogatory terms",
}
labels["derogatory form"] = {
aliases = {"pejorative form", "derogative form", "disparaging form"},
display = "[[derogatory]]",
pos_categories = "derogatory forms",
}
labels["dialect"] = {-- separated from "dialectal" so e.g. "obsolete|outside|the|_|dialect|of..." displays right
glossary = "dialectal",
pos_categories = "dialectal terms",
}
labels["dialectal"] = {
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "dialectal terms",
}
labels["dialectal form"] = {
glossary = "dialectal",
display = "dialectal",
pos_categories = "dialectal forms",
}
labels["dialects"] = {-- separated from "dialectal" so e.g. "obsolete|outside|dialects" displays right
glossary = "dialectal",
pos_categories = "dialectal terms",
}
labels["dis legomenon"] = {
display = "[[dis legomenon]]",
pos_categories = "dis legomena",
}
labels["dismissal"] = {
display = "[[dismissal]]",
pos_categories = "dismissals",
}
labels["drag slang"] = {
aliases = {"Drag Race slang"},
display = "[[drag]] {{glossary|slang}}",
pos_categories = "drag slang",
}
labels["ecclesiastical"] = {
display = "[[ecclesiastical#Adjective|ecclesiastical]]",
pos_categories = "ecclesiastical terms",
}
labels["ethnic slur"] = {
aliases = {"racial slur"},
display = "[[ethnic]] [[slur]]",
pos_categories = "ethnic slurs",
}
labels["euphemistic"] = {
aliases = {"euphemism"},
glossary = "euphemism",
pos_categories = "euphemisms",
}
labels["eye dialect"] = {
display = "[[eye dialect]]",
pos_categories = true,
}
labels["familiar"] = {
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
pos_categories = "familiar terms",
}
labels["fandom slang"] = {
aliases = {"fandom"},
display = "[[fandom]] {{glossary|slang}}",
pos_categories = true,
}
labels["figurative"] = {
aliases = {"metaphorical", "metaphoric", "metaphor"},
glossary = "figurative",
}
labels["figuratively"] = {
aliases = {"metaphorically"},
glossary = "figurative",
}
labels["folk songs"] = {
aliases = {"folksongs", "used in folk songs", "used in folksongs"},
pos_categories = "folk poetic terms",
display = "used in [[folk song]]s",
}
labels["folk tales"] = {
aliases = {"folktales", "used in folk tales", "used in folktales"},
pos_categories = "folk poetic terms",
display = "used in [[folk tale]]s",
}
labels["folk poetic"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "folk poetic terms",
}
labels["formal"] = {
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
pos_categories = "formal terms",
}
labels["formal form"] = {
glossary = "formal",
display = "formal",
pos_categories = "formal forms",
}
labels["gay slang"] = {
display = "[[gay]] {{glossary|slang}}",
pos_categories = true,
}
labels["gender critical slang"] = {
aliases = {"gender-critical slang", "GC slang", "TERF slang"},
display = "[[gender-critical]] {{glossary|slang}}",
pos_categories = "gender-critical slang",
}
labels["gender-neutral"] = {
glossary = "gender-neutral",
pos_categories = "gender-neutral terms",
}
labels["graffiti slang"] = {
display = "[[graffiti#Noun|graffiti]] {{glossary|slang}}",
pos_categories = true,
}
labels["genericized trademark"] = {
aliases = {"genericised trademark", "generic trademark", "proprietary eponym", "gentrade"},
display = "[[genericized trademark]]",
pos_categories = "genericized trademarks",
}
labels["ghost word"] = {
aliases = {"ghost"},
display = "ghost word",
glossary = true,
pos_categories = "ghost words",
}
labels["hapax legomenon"] = {
aliases = {"hapax"},
display = "hapax legomenon",
glossary = true,
pos_categories = "hapax legomena",
}
labels["higher register"] = {
aliases = {"high register", "elevated register", "elevated"},
glossary = "higher register",
pos_categories = "higher register terms",
}
labels["historical"] = {
aliases = {"historic"},
glossary = true,
sense_categories = true,
}
labels["non-native speakers"] = {-- language-agnostic version
aliases = {"NNS"},
display = "[[non-native speaker]]s", -- so preceded by "used by", "error by children and", etc? or reword?
regional_categories = {"Non-native speakers'"},
}
-- used exclusively by languages that use the "Jpan" script code
labels["historical hiragana"] = {
pos_categories = true,
}
-- used exclusively by languages that use the "Jpan" script code
labels["historical katakana"] = {
pos_categories = true,
}
-- applies to Japanese and Korean, etc., please do not confuse with "polite"
labels["honorific"] = {
Wikipedia = "Honorifics (linguistics)",
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
pos_categories = "honorific terms",
}
-- for Ancient Greek
labels["Homeric epithet"] = {
display = "[[Homeric Greek|Homeric]] [[w:Epithets in Homer|epithet]]",
omit_postComma = true,
plain_categories = "Epic Greek",
}
-- applies to Japanese and Korean, etc.
labels["humble"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
display = "[[humble]]",
pos_categories = "humble terms",
}
-- for Akkadian
labels["in hendiadys"] = {
aliases = {"hendiadys"},
display = "in {{w|hendiadys}}",
pos_categories = "terms used in hendiadys",
}
labels["humorous"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp; NB and cf a similar "jocular" label further up on this page
aliases = {"humorously", "jocular"},
glossary = true,
pos_categories = "humorous terms",
}
labels["hyperbolic"] = {
aliases = {"hyperbole"},
glossary = true,
pos_categories = "hyperboles",
}
labels["hypercorrect"] = {
glossary = true,
pos_categories = "hypercorrections",
}
labels["hyperforeign"] = {
glossary = true,
pos_categories = "hyperforeign terms",
}
labels["imperial"] = {
aliases = {"emperor", "empress"},
pos_categories = "royal terms",
}
labels["incel slang"] = {
display = "[[incel]] {{glossary|slang}}",
pos_categories = true,
}
labels["informal"] = {
aliases = {"informally", "not formal"},
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "informal terms",
}
labels["informal form"] = {
glossary = "informal",
display = "informal",
pos_categories = "informal forms",
}
labels["Internet slang"] = {
aliases = {"internet slang"},
display = "[[Internet]] {{glossary|slang}}",
pos_categories = "internet slang",
}
labels["IRC"] = {
display = "[[IRC]]",
pos_categories = "internet slang",
}
labels["ironic"] = {
display = "[[irony|ironic]]",
}
-- Not the same as "journalism", which maps to a topical category (e.g. [[:Category:en:Journalism]], instead of [[:Category:English journalistic terms]]).
labels["journalistic"] = {
aliases = {"journalese"},
display = "[[journalistic]]",
pos_categories = "journalistic terms",
}
labels["leet"] = {
aliases = {"leetspeak"},
display = "[[leetspeak]]",
pos_categories = "leetspeak",
}
labels["LGBTQ slang"] = {
aliases = {"LGBT slang"},
display = "[[LGBTQ]] {{glossary|slang}}",
pos_categories = true,
}
labels["literal"] = {
glossary = "literally",
}
labels["literally"] = {
glossary = "literally",
}
labels["literary"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp
aliases = {"bookish"},
glossary = true,
pos_categories = "literary terms",
}
labels["literary form"] = {
aliases = {"bookish form"},
glossary = "literary",
display = "literary",
pos_categories = "literary forms",
}
--see also "short scale"
labels["long scale"] = {
display = "[[w:Long and short scales|long scale]]"
}
labels["loosely"] = {
aliases = {"loose", "broadly", "broad"},
glossary = true,
}
labels["Lubunyaca"] = {
display = "[[Lubunyaca]]",
pos_categories = true,
}
labels["medical slang"] = {
display = "[[medical]] {{glossary|slang}}",
pos_categories = true,
}
-- for Awetí, Karajá, etc., where men and women use different words
labels["men's speech"] = {
aliases = {"male speech"},
glossary = "men's speech",
pos_categories = "men's speech terms",
}
labels["metonymic"] = {
aliases = {"metonymically", "metonymy", "metonym"},
glossary = true,
pos_categories = "metonyms",
}
labels["military slang"] = {
display = "[[military]] {{glossary|slang}}",
pos_categories = true,
}
labels["minced oath"] = {
display = "[[minced oath]]",
pos_categories = "minced oaths",
}
labels["multiplicative"] = {
aliases = {"multiplicative number", "multiplicative numeral"},
display = "[[multiplicative number]]",
pos_categories = "multiplicative numbers",
}
labels["multiplicity slang"] = {
display = "{{l|en|multiplicity|id=multiple personalities}} {{glossary|slang}}",
pos_categories = true,
}
labels["naval slang"] = {
aliases = {"navy slang"},
display = "[[naval]] {{glossary|slang}}",
pos_categories = true,
}
labels["neologism"] = {
aliases = {"neologistic"},
glossary = true,
pos_categories = "neologisms",
}
labels["neopronoun"] = {
display = "[[neopronoun]]",
-- pos_categories = {"neopronouns"},
}
labels["no longer productive"] = {
aliases = {"non-productive"},
display = "no longer [[Appendix:Glossary#productive|productive]]",
}
labels["nonce word"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
aliases = {"nonce"},
glossary = true,
pos_categories = "nonce terms",
}
labels["nonstandard"] = {
aliases = {"non-standard", "substandard", "sub-standard"},
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "nonstandard terms",
}
labels["nonstandard form"] = {
aliases = {"non-standard form", "substandard form", "sub-standard form"},
glossary = "nonstandard",
display = "nonstandard",
pos_categories = "nonstandard forms",
}
labels["numismatic slang"] = {
display = "[[numismatic]] {{glossary|slang}}",
pos_categories = true,
}
labels["obsolete"] = {
glossary = true,
sense_categories = true,
}
labels["obsolete form"] = {
glossary = "obsolete",
display = "obsolete",
pos_categories = "obsolete forms",
}
labels["obsolete term"] = {
glossary = "obsolete",
-- combine with previous two, q.v.
pos_categories = "obsolete terms",
}
labels["offensive"] = {
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp
pos_categories = "offensive terms",
}
labels["officialese"] = {
aliases = {"bureaucratic"},
display = "[[officialese]]",
pos_categories = "officialese terms",
}
labels["Oxbridge slang"] = {
display = "[[w:Oxbridge|Oxbridge]] {{glossary|slang}}",
topical_categories = "Universities",
plain_categories = {"Cambridge University slang", "Oxford University slang"},
}
labels["Oxford University slang"] = {
aliases = {"University of Oxford slang", "Oxon slang"},
display = "[[w:University of Oxford|Oxford University]] {{glossary|slang}}",
topical_categories = "Universities",
plain_categories = true,
}
labels["poetic"] = {
aliases = {"poi"}, -- Only used in Ancient Greek as a holdover from [[Module:grc:Dialects]].
-- should be "terms with X senses", leaving "X terms" to the term-context temp
glossary = true,
pos_categories = "poetic terms",
}
labels["poetic form"] = {
glossary = "poetic",
display = "poetic",
pos_categories = "poetic forms",
}
labels["polite"] = {
glossary = true,
pos_categories = "polite terms",
}
labels["post-classical"] = {
aliases = {"Post-classical", "post-Classical", "Post-Classical", "Postclassical", "postclassical"},
display = "post-Classical",
regional_categories = true,
}
labels["prison slang"] = {
display = "[[prison]] {{glossary|slang}}",
pos_categories = true,
}
labels["proscribed"] = {
glossary = true,
pos_categories = "proscribed terms",
}
labels["puristic"] = {
aliases = {"purism"},
Wikipedia = "Linguistic purism",
pos_categories = "puristic terms",
}
labels["radio slang"] = {
display = "[[radio]] {{glossary|slang}}",
pos_categories = true,
}
labels["Reddit slang"] = {
display = "[[Reddit]] {{glossary|slang}}",
pos_categories = true,
}
labels["rare"] = {
aliases = {"rare sense"},
glossary = true,
sense_categories = true,
}
labels["rare form"] = {
glossary = "rare",
display = "rare",
pos_categories = "rare forms",
}
labels["rare term"] = {
display = "rare",
-- see comments about "obsolete"
pos_categories = "rare terms",
}
-- cf Cockney rhyming slang
labels["rhyming slang"] = {
display = "[[rhyming slang]]",
pos_categories = true,
}
labels["religious slur"] = {
aliases = {"sectarian slur"},
display = "[[religious]] [[slur]]",
pos_categories = "religious slurs",
}
labels["retronym"] = {
glossary = true,
pos_categories = "retronyms",
}
labels["reverential"] = {
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
display = "[[reverential]]",
pos_categories = "reverential terms",
}
labels["royal"] = {
aliases = {"regal"},
pos_categories = "royal terms",
}
labels["rustic"] = {
glossary = true,
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
aliases = {"rural"},
pos_categories = "rustic terms",
}
labels["sarcastic"] = {
display = "[[sarcastic]]",
pos_categories = "sarcastic terms",
}
labels["school slang"] = {
aliases = {"public school slang"},
display = "[[school]] {{glossary|slang}}",
pos_categories = true,
}
labels["self-deprecatory"] = {
aliases = {"self-deprecating"},
display = "[[self-deprecatory]]",
-- should be "terms with X senses", leaving "X terms" to the term-context temp?
pos_categories = "self-deprecatory terms",
}
-- Swahili Sheng cant / argot
-- should this be in a language-specific module?
labels["Sheng"] = {
Wikipedia = "Sheng slang",
plain_categories = true,
}
labels["siglum"] = {
aliases = {"sigla"},
glossary = true,
pos_categories = "sigla",
}
--see also "long scale"
labels["short scale"] = {
display = "[[w:Long and short scales|short scale]]"
}
labels["slang"] = {
glossary = true,
pos_categories = true,
}
labels["solemn"] = {
glossary = true,
pos_categories = "solemn terms",
}
labels["Stenoscript"] = {
aliases = {"stenoscript"},
display = "[[Stenoscript]]",
pos_categories = "Stenoscript abbreviations",
}
labels["superseded"] = {
glossary = true
}
labels["swear word"] = {
aliases = {"profanity", "expletive"},
pos_categories = "swear words",
}
labels["syncopated"] = {
aliases = {"syncope", "syncopic", "syncopation"},
glossary = true,
pos_categories = "syncopic forms",
}
labels["synecdochic"] = {
aliases = {"synecdochically", "synecdochical", "synecdoche"},
glossary = true,
pos_categories = "synecdoches",
}
labels["technical"] = {
display = "[[technical]]",
pos_categories = "technical terms",
}
labels["telic"] = {
glossary = true,
}
labels["text messaging"] = {
aliases = {"texting"},
display = "[[text messaging]]",
pos_categories = "text messaging slang",
}
labels["tone indicator"] = {
display = "[[tone indicator]]",
pos_categories = "tone indicators",
}
labels["trademark"] = {
display = "[[trademark]]",
pos_categories = "trademarks",
}
labels["transferred sense"] = {
glossary = true,
pos_categories = "terms with transferred senses",
}
labels["transferred senses"] = {
display = "[[transferred sense#English|transferred senses]]",
pos_categories = "terms with transferred senses",
}
labels["transgender slang"] = {
aliases = {"trans slang"},
display = "[[transgender]] {{glossary|slang}}",
pos_categories = true,
}
labels["Twitch-speak"] = {
display = "[[Twitch-speak]]",
pos_categories = true,
}
labels["uds."] = {
display = "[[Appendix:Spanish pronouns#Ustedes and vosotros|used formally in Spain]]",
}
labels["uncommon"] = {
glossary = true,
sense_categories = true,
}
labels["uncommon form"] = {
glossary = "uncommon",
display = "uncommon",
pos_categories = "uncommon forms",
}
labels["university slang"] = {
aliases = {"college slang", "student slang"},
display = "[[university]] {{glossary|slang}}",
topical_categories = "Universities",
pos_categories = "student slang",
}
labels["verlan"] = {
glossary = true,
plain_categories = true,
}
labels["very rare"] = {
display = "very [[Appendix:Glossary#rare|rare]]",
sense_categories = "rare",
}
labels["vulgar"] = {
aliases = {"coarse", "obscene", "profane"},
glossary = true,
pos_categories = "vulgarities",
}
labels["vesre"] = {
Wikipedia = true,
plain_categories = true,
}
labels["youth slang"] = {
display = "[[youth]] {{glossary|slang}}",
pos_categories = "slang",
}
labels["2channel slang"] = {
aliases = {"2channel", "2ch slang"},
display ="[[w:2channel|2channel]] {{glossary|slang}}",
pos_categories = {"internet slang" , "2channel slang"},
}
-- for Awetí, Karajá, etc., where men & women use different words
labels["women's speech"] = {
aliases = {"female speech"},
glossary = "women's speech",
pos_categories = "women's speech terms",
}
-- terms applying to Old Norse skaldic poetry
labels["kenning"] = {
aliases = {"Kenning"},
Wikipedia = "Kenning",
pos_categories = "kennings",
}
labels["heiti"] = {
aliases = {"Heiti"},
Wikipedia = "Heiti",
pos_categories = true,
}
return require("Module:labels").finalize_data(labels)
kvqy5ztc6qbizxdczxt5y4jvmz9lbhd
मॉड्यूल:labels/data/regional
828
302254
487759
479148
2026-09-02T15:58:10Z
SM7
6218
updating...
487759
Scribunto
text/plain
local labels = {}
------------------------------------------ Generic ------------------------------------------
--not sure where to put this
labels["Classical"] = {
aliases = {"classical"},
-- "ar", ca", "fa", "id", la", "zh" handled in lang-specific module
langs = {"az", "ja", "jv", "kum", "ms", "quc", "sa", "tl"},
special_display = "[[Classical <canonical_name>]]",
regional_categories = true,
}
labels["Epigraphic"] = {
langs = {"grc", "pgd", "pra", "sa"},
special_display = "[[w:Epigraphy|Epigraphic <canonical_name>]]",
regional_categories = true,
}
labels["regional"] = {
aliases = {"regionally"},
display = "[[regional#English|regional]]",
regional_categories = true,
}
------------------------------------------ Places ------------------------------------------
labels["Anatri"] = {
aliases = {"Lower Chuvash"},
langs = {"cv"}, -- e.g. вот "fire" vs the Upper Chuvash / literary standard вут
Wikipedia = true,
regional_categories = true,
}
labels["Australia"] = {
aliases = {"AU", "Australian"},
-- "de", "en", "mt", "zh" handled in lang-specific modules
langs = {"el", "it", "ko", "ru"},
Wikipedia = true,
regional_categories = "Australian",
}
labels["Black Isle"] = {
langs = {"sco"}, -- conceivably also en, gd, perhaps enm, but -sche could only find sco
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Bogor"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Brazil"] = {
aliases = {"Brazilian"},
-- "pt" handled in lang-specific module
langs = {"ja", "mch", "vec", "yi"},
Wikipedia = true,
regional_categories = "Brazilian",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Brebes"] = {
aliases = {"Brebian"},
langs = {},
Wikipedia = "Brebes Regency",
regional_categories = true,
}
labels["Bukovina"] = {
aliases = {"Bucovina", "Bukovinian", "Bukowina"},
langs = {"pl", "ro"},
Wikipedia = true,
regional_categories = "Bukovinian",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Burundi"] = {
aliases = {"Burundian"},
langs = {},
Wikipedia = true,
regional_categories = "Burundian",
}
labels["Canada"] = {
aliases = {"Canadian"},
-- "en", "fr", "zh" handled in lang-specific module
langs = {"gd", "haa", "is", "ko", "ru", "tli", "vi"},
Wikipedia = true,
regional_categories = "Canadian",
}
labels["China"] = {
-- "en", "ko" handled in lang-specific module
langs = {"ja", "khb", "kk", "mhx", "mn", "ug"},
Wikipedia = true,
regional_categories = "Chinese",
}
labels["Cisalpine"] = {
aliases = {"xcg"},
langs = {"cel-gau"},
Wikipedia = "Cisalpine Gaulish",
regional_categories = "Cisalpine",
}
labels["Congo"] = {
aliases = {"Democratic Republic of the Congo", "Democratic Republic of Congo", "DR Congo", "Congo-Kinshasa", "Republic of the Congo", "Republic of Congo", "Congo-Brazzaville", "Congolese"}, -- these could be split if need be
-- "fr" handled in lang-specific module
langs = {"avu", "yom"},
Wikipedia = true,
regional_categories = "Congolese",
}
labels["Cyprus"] = {
aliases = {"cypriot", "Cypriot"},
-- "ar", tr" handled in lang-specific module
langs = {"el"},
Wikipedia = true,
regional_categories = "Cypriot",
}
labels["Dobruja"] = {
aliases = {"Dobrogea", "Dobrujan"},
langs = {"crh", "ro"},
Wikipedia = true,
regional_categories = "Dobrujan",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Durban"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Europe"] = {
-- "en", "es", "fr", "pt" handled in lang-specific module
langs = {"ur"},
Wikipedia = true,
regional_categories = "European",
}
labels["France"] = {
aliases = {"French"},
-- "fr", "zh" handled in lang-specific module
langs = {"la", "lad", "nrf", "vi", "yi"},
Wikipedia = true,
regional_categories = "French",
}
labels["India"] = {
aliases = {"Indian"},
-- "en", "pa", "pt" handled in lang-specific module
langs = {"bn", "dv", "fa", "ml", "ta", "ur"},
Wikipedia = true,
regional_categories = "Indian",
}
labels["Indonesia"] = {
aliases = {"Indonesian"},
-- "en", "zh" handled in lang-specific module
langs = {"id", "jv", "ms", "nl"},
Wikipedia = true,
regional_categories = "Indonesian",
}
labels["Israel"] = {
aliases = {"Israeli"},
-- "ar", en" handled in lang-specific module
langs = {"ajp", "he", "ru", "yi"},
Wikipedia = true,
regional_categories = "Israeli",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Kalix"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
-- FIXME: Move to Uyghur label data module
labels["Kazakhstan"] = {
aliases = {"Kazakhstani", "Kazakh"},
langs = {"ug"},
Wikipedia = true,
regional_categories = "Kazakhstani",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Kemaliye"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Kitti"] = {
langs = {},
Wikipedia = "Kitti, Federated States of Micronesia",
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Kukkuzi"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Lucknow"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Luleå"] = {
aliases = {"Lulea"},
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Lviv"] = {
aliases = {"Lvov", "Lwow", "Lwów"},
langs = {"pl"},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Muş"] = {
aliases = {"Mush"},
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Myanmar"] = {
aliases = {"Myanmarese", "Burma", "Burmese"},
-- "en", "my", "zh" handled in lang-specific module; FIXME: move ksw and mnw to lang-specific modules
langs = {"ksw", "mnw"},
Wikipedia = true,
regional_categories = true,
}
labels["Nigeria"] = {
aliases = {"Nigerian"},
-- "ar", en" handled in lang-specific module
langs = {"ff", "guw", "ha", "yo"},
Wikipedia = true,
regional_categories = "Nigerian",
}
labels["Palestine"] = {
aliases = {"Palestinian"},
-- "ar", "en" handled in lang-specific module
langs = {"ajp", "arc"},
Wikipedia = true,
regional_categories = "Palestinian",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Priangan"] = {
langs = {},
Wikipedia = "Parahyangan",
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Rome"] = {
aliases = {"Roma", "Romano"},
langs = {},
Wikipedia = true,
regional_categories = "Roman",
}
labels["Scania"] = {
aliases = {"Scanian", "Skanian", "Skåne"},
langs = {"gmq-oda", "sv"},
Wikipedia = true,
regional_categories = "Scanian",
}
-- Silesia German, Silesia Polish; for differentiation between sli "Silesian East Central German"
-- don't add Silesian as alias
labels["Silesia"] = {
langs = {"de", "pl"},
Wikipedia = true,
}
labels["South Africa"] = {
aliases = {"South African"},
-- "de", "en", "pt" handled in lang-specific module
langs = {"af", "nl", "st", "te", "yi", "zu"},
Wikipedia = true,
regional_categories = "South African",
}
labels["Spain"] = {
aliases = {"Spanish", "ES"},
-- "ca", "es" handled in lang-specific module
langs = {"la"},
Wikipedia = true,
regional_categories = "Spanish",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Surati"] = {
langs = {},
Wikipedia = "Surat district",
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Surgut"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Suriname"] = {
aliases = {"Surinamese"},
langs = {"car", "hns", "jv", "nl"},
Wikipedia = true,
regional_categories = "Surinamese",
}
labels["Thailand"] = {
aliases = {"Thai"},
-- "en", "zh" handled in lang-specific module
langs = {"khb", "mnw", "th"},
Wikipedia = true,
regional_categories = "Thai",
}
labels["Transalpine"] = {
aliases = {"xtg"},
langs = {"cel-gau"},
Wikipedia = "Transalpine Gaulish",
regional_categories = "Transalpine",
}
labels["UK"] = {
aliases = {"United Kingdom", "Britain", "Brit", "British", "Great Britain"},
-- "en", "zh" handled in lang-specific module
langs = {"bn", "ur", "vi"},
Wikipedia = "United Kingdom",
regional_categories = "British",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Old Ukrainian"] = {
langs = {},
Wikipedia = true,
plain_categories = true,
}
labels["US"] = {
aliases = {"U.S.", "United States", "United States of America", "USA", "America", "American"}, -- America/American: should these be aliases of 'North America'?
-- DO NOT include "es" here, otherwise {{lb|es|American}} will categorize in [[:Category:American Spanish]]; see [[:Category:United States Spanish]].
-- "de", "en", "pt", "zh" handled in lang-specific module
langs = {"hi", "is", "it", "ja", "ko", "nl", "ru", "tli", "ur", "vi", "yi"},
Wikipedia = "United States",
regional_categories = "American",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Vilhelmina"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
labels["Viryal"] = {
aliases = {"Upper Chuvash"},
langs = {"cv"},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Wallonia"] = {
aliases = {"Wallonian"},
langs = {},
Wikipedia = true,
regional_categories = "Wallonian",
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Special Region of Yogyakarta"] = {
aliases = {"SR Yogyakarta"},
langs = {},
Wikipedia = true,
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Zakarpattia"] = {
langs = {},
Wikipedia = "Zakarpattia Oblast",
regional_categories = true,
}
-- WARNING: No existing languages or categories associated with label; add to `langs` as needed
labels["Zululand"] = {
langs = {},
Wikipedia = true,
regional_categories = true,
}
------------------------------------------ Chinese romanizations ------------------------------------------
labels["Hanyu Pinyin"] = {
aliases = {"Hanyu pinyin", "Pinyin", "pinyin"},
Wikidata = "Q42222",
plain_categories = true,
}
labels["Postal Romanization"] = {
aliases = {"Postal romanization", "postal romanization"},
Wikidata = "Q151868",
plain_categories = true,
}
labels["Tongyong Pinyin"] = {
aliases = {"Tongyong pinyin"},
Wikidata = "Q700739",
plain_categories = true,
}
labels["Wade–Giles"] = {
aliases = {"Wade-Giles"},
Wikidata = "Q208442",
plain_categories = true,
}
return require("Module:labels").finalize_data(labels)
473c6skcpxp1apfry68vrgkn72k2wlr
मॉड्यूल:labels/data/topical
828
302256
487758
479147
2026-09-02T15:57:01Z
SM7
6218
updating...
487758
Scribunto
text/plain
local labels = {}
-- To sort these, you first have to convert each label section into a single line, and then sort the lines, and undo
-- the single-line conversion. This can be done using Vim commands, something like this:
-- 1. Mark the first line to be changed using `ma`.
-- 2. Go to the last line and use `'a,.s/\n/\\n/g` to convert newlines to \n sequences.
-- 3. Use `'a,.s/\\n\\n/\r/g` to convert sequences of two \n's (marking section divisions) back to newlines.
-- 4. Go to the last line again and use `'a,.!sort -f -d` to sort. The `-f` makes it case-insensitive and the `-d`
-- selects "dictionary order", which is needed to get 'yoga' to sort before 'yoga pose' instead of the other way
-- around.
-- 5. Go to the last line again and use `'a,.s/\\n/\r/g` to convert \n sequences back to newlines.
-- 6. Go to the last line again and use `'a,.s/^labels/\rlabels/` to put an extra newline before each section.
labels["3D printing"] = {
aliases = {"3D printer", "3D printers"},
Wiktionary = "3D printing#Noun",
Wikipedia = true,
Wikidata = "Q229367",
topical_categories = true,
}
labels["ABDL"] = {
aliases = {"AB/DL"},
Wiktionary = true,
Wikipedia = true,
topical_categories = true,
}
labels["Abrahamism"] = {
Wiktionary = "Abrahamism#Noun",
topical_categories = true,
}
labels["accounting"] = {
Wiktionary = "accounting#Noun",
topical_categories = true,
}
labels["acoustics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["acting"] = {
Wiktionary = "acting#Noun",
topical_categories = true,
}
labels["advertising"] = {
Wiktionary = "advertising#Noun",
topical_categories = true,
}
labels["aeronautics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["aerospace"] = {
Wiktionary = true,
topical_categories = true,
}
labels["aesthetic"] = {
aliases = {"aesthetics"},
Wiktionary = true,
topical_categories = "Aesthetics",
}
labels["age regression"] = {
aliases = {"agere", "agereg"},
Wiktionary = true,
topical_categories = "Age regression"
}
labels["ageplay"] = {
aliases = {"age play"},
Wiktionary = true,
topical_categories = true,
}
labels["agriculture"] = {
aliases = {"farming"},
Wiktionary = true,
topical_categories = true,
}
labels["Ahmadiyya"] = {
aliases = {"Ahmadiyyat", "Ahmadi"},
Wiktionary = true,
topical_categories = true,
}
labels["aircraft"] = {
Wiktionary = true,
topical_categories = true,
}
labels["alchemy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["alcoholic beverages"] = {
aliases = {"alcohol"},
display = "[[alcoholic#Adjective|alcoholic]] [[beverage]]s",
topical_categories = true,
}
labels["alcoholism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["algebra"] = {
Wiktionary = true,
topical_categories = true,
}
labels["algebraic geometry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["algebraic topology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["alternative history"] = {
aliases = {"alt hist", "alternate history"},
Wikidata = "Q224989",
topical_categories = true,
}
labels["alternative medicine"] = {
Wiktionary = true,
topical_categories = true,
}
labels["alt-right"] = {
aliases = {"altright", "Alt-right", "Altright"},
Wiktionary = true,
topical_categories = true,
}
labels["amateur radio"] = {
aliases = {"ham radio"},
Wiktionary = true,
topical_categories = true,
}
labels["American football"] = {
Wiktionary = true,
topical_categories = "Football (American)",
}
labels["amino acid"] = {
display = "[[biochemistry]]",
topical_categories = "Amino acids",
}
labels["analytic geometry"] = {
Wiktionary = true,
topical_categories = "Geometry",
}
labels["analytical chemistry"] = {
display = "[[analytical]] [[chemistry]]",
topical_categories = true,
}
labels["anarchism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["anatomy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Ancient Greece"] = {
aliases = {"ancient Greece"},
Wiktionary = true,
topical_categories = true,
}
labels["Ancient Rome"] = {
aliases = {"ancient Rome"},
Wiktionary = true,
topical_categories = true,
}
labels["Anglicanism"] = {
aliases = {"Anglican", "Anglicanist", "Anglican Church"},
Wiktionary = true,
topical_categories = true,
}
labels["animation"] = {
Wiktionary = true,
topical_categories = true,
}
labels["anime"] = {
Wiktionary = true,
topical_categories = "Japanese fiction",
}
labels["anthropology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Arabian god"] = {
display = "[[Arabian]] [[mythology]]",
topical_categories = "Arabian deities",
}
labels["arachnology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["archaeological culture"] = {
aliases = {"archeological culture", "archaeological cultures", "archeological cultures"},
display = "[[archaeology]]",
topical_categories = "Archaeological cultures",
}
labels["archaeology"] = {
aliases = {"archeology"},
Wiktionary = true,
topical_categories = true,
}
labels["archery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["architectural element"] = {
aliases = {"architectural elements"},
display = "[[architecture]]",
topical_categories = "Architectural elements",
}
labels["architecture"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Argentine politics"] = {
aliases = {"Argentina politics", "Argentinian politics"},
Wikipedia = "Politics of Argentina",
topical_categories = true,
}
labels["arithmetic"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Armenian mythology"] = {
display = "[[Armenian]] [[mythology]]",
topical_categories = true,
}
labels["art"] = {
aliases = {"arts"},
Wiktionary = "art#Noun",
topical_categories = true,
}
labels["Arthurian legend"] = {
aliases = {"Arthurian mythology"},
Wikipedia = "Matter_of_Britain#Arthurian_legend",
topical_categories = "Arthurian mythology",
}
labels["artificial intelligence"] = {
aliases = {"AI"},
Wiktionary = true,
topical_categories = true,
}
labels["artillery"] = {
display = "[[weaponry]]",
topical_categories = true,
}
labels["artistic work"] = {
display = "[[art#Noun|art]]",
topical_categories = "Artistic works",
}
labels["asterism"] = {
display = "[[uranography]]",
topical_categories = "Asterisms",
}
labels["asteroid"] = {
display = "[[astronomy]]",
topical_categories = {"Asteroids", "Astronomy"}
}
labels["astrology"] = {
aliases = {"horoscope", "zodiac"},
Wiktionary = true,
topical_categories = true,
}
labels["astronautics"] = {
aliases = {"rocketry"},
Wiktionary = true,
topical_categories = true,
}
labels["astronomy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["astrophysics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Asturian mythology"] = {
display = "[[Asturian]] [[mythology]]",
topical_categories = true,
}
labels["athletics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Australian Aboriginal mythology"] = {
Wikipedia = true,
topical_categories = true,
}
labels["Australian politics"] = {
Wikipedia = "Politics of Australia",
topical_categories = true,
}
labels["Australian rules football"] = {
aliases = {"Australian Rules football"},
Wiktionary = true,
topical_categories = true,
}
labels["autism"] = {
Wiktionary = true,
Wikipedia = true,
topical_categories = true,
}
labels["auto parts"] = {
display = "[[automotive]]",
topical_categories = true,
}
labels["automotive"] = {
aliases = {"automotives"},
Wiktionary = true,
topical_categories = true,
}
labels["automotive parts"] = {
display = "[[automotive]]",
topical_categories = true,
}
labels["aviation"] = {
aliases = {"air transport"},
Wiktionary = true,
topical_categories = true,
}
labels["backgammon"] = {
Wiktionary = true,
topical_categories = true,
}
labels["bacteria"] = {
display = "[[bacteriology]]",
topical_categories = true,
}
labels["bacteriology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["badminton"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Baháʼí Faith"] = {
aliases = {"Baháʼí", "Bahaʼi", "Bahá'í", "Baha'i", "Bahai", "Bahaʼi Faith", "Bahá'í Faith", "Baha'i Faith", "Bahai Faith"},
Wiktionary = true,
topical_categories = true,
}
labels["baking"] = {
Wiktionary = "baking#Noun",
topical_categories = true,
}
labels["ball games"] = {
aliases = {"ball sports"},
display = "[[ball game]]s",
topical_categories = true,
}
labels["ballet"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ballistics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Bangladeshi politics"] = {
Wikipedia = "Politics of Bangladesh",
topical_categories = true,
}
labels["banking"] = {
Wiktionary = "banking#Noun",
topical_categories = true,
}
labels["baseball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["basketball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["BDSM"] = {
Wiktionary = true,
topical_categories = true,
}
labels["beekeeping"] = {
aliases = {"melittology", "apiology", "apidology"}, -- could potentially be split out
Wiktionary = true,
topical_categories = true,
}
labels["beer"] = {
Wiktionary = true,
topical_categories = true,
}
labels["betting"] = {
aliases = {"bet", "bets"},
display = "[[gambling#Noun|gambling]]",
topical_categories = true,
}
labels["biblical"] = {
aliases = {"Bible", "bible", "Biblical"},
Wiktionary = "Bible",
topical_categories = "Bible",
}
labels["biblical character"] = {
aliases = {"Biblical character", "biblical figure", "Biblical figure"},
display = "[[Bible|biblical]]",
topical_categories = "Biblical characters",
}
labels["bibliography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["bicycle parts"] = {
aliases = {"bicycle part"},
display = "[[w:List of bicycle parts|cycling]]",
topical_categories = true,
}
labels["billiards"] = {
aliases = {"cue sports"},
Wiktionary = true,
topical_categories = true,
}
labels["bingo"] = {
Wiktionary = true,
topical_categories = true,
}
labels["biochemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["biology"] = {
aliases = {"biological"},
Wiktionary = true,
topical_categories = true,
}
labels["biotechnology"] = {
aliases = {"biotechnological"},
Wiktionary = true,
topical_categories = true,
}
labels["birdwatching"] = {
aliases = {"birding"},
Wiktionary = "birdwatching#Noun",
topical_categories = true,
}
labels["blacksmithing"] = {
aliases = {"blacksmith"},
Wiktionary = true,
topical_categories = true,
}
labels["blogging"] = {
aliases = {"blog"},
Wiktionary = "blogging#Noun",
topical_categories = "Internet",
}
labels["board games"] = {
aliases = {"board game"},
display = "[[board game]]s",
topical_categories = true,
}
labels["board sports"] = {
Wiktionary = "boardsport",
topical_categories = true,
}
labels["bodybuilding"] = {
Wiktionary = "bodybuilding#Noun",
topical_categories = true,
}
labels["book of the Bible"] = {
aliases = {"book of the bible", "books of the Bible", "books of the bible", "Biblical book", "biblical book"},
display = "[[Bible|biblical]]",
topical_categories = "Books of the Bible",
}
labels["bookbinding"] = {
Wiktionary = true,
topical_categories = true,
}
labels["botany"] = {
Wiktionary = true,
topical_categories = true,
}
labels["bowling"] = {
Wiktionary = "bowling#Noun",
topical_categories = true,
}
labels["bowls"] = {
aliases = {"lawn bowls", "crown green bowls"},
Wiktionary = true,
topical_categories = "Bowls (game)",
}
labels["boxing"] = {
Wiktionary = "boxing#Noun",
topical_categories = true,
}
labels["brass instruments"] = {
aliases = {"brass instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["Brazilian politics"] = {
Wikipedia = "Politics of Brazil",
topical_categories = true,
}
labels["brewing"] = {
Wiktionary = "brewing#Noun",
topical_categories = true,
}
labels["bridge"] = {
Wiktionary = "bridge#English:_game",
topical_categories = true,
}
labels["broadcasting"] = {
Wiktionary = "broadcasting#Noun",
topical_categories = true,
}
labels["bryology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Buddhism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Buddhist deity"] = {
aliases = {"Buddhist god", "Buddhist goddess"},
display = "[[Buddhism]]",
topical_categories = "Buddhist deities",
}
labels["Bulgarian politics"] = {
Wikipedia = "Politics of Bulgaria",
topical_categories = true,
}
labels["bullfighting"] = {
aliases = {"bullfight"},
Wiktionary = true,
topical_categories = true,
}
labels["business"] = {
aliases = {"professional"},
Wiktionary = true,
topical_categories = true,
}
labels["Byzantine Empire"] = {
aliases = {"Byzantine"},
Wiktionary = true,
topical_categories = true,
}
labels["calculus"] = {
Wiktionary = true,
topical_categories = true,
}
labels["calligraphy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Calvinism"] = {
aliases = {"Calvinist", "Reformed Christianity", "Calvinist Church", "Reformed Church"},
Wikipedia = true,
topical_categories = true,
}
labels["Canadian football"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Canadian politics"] = {
Wikipedia = "Politics of Canada",
topical_categories = true,
}
labels["Candomblé"] = {
aliases = {"candomblé"},
Wiktionary = true,
topical_categories = true,
}
labels["canid"] = {
display = "[[zoology]]",
topical_categories = "Canids",
}
labels["canoeing"] = {
aliases = {"canoe"},
Wiktionary = "canoeing#Noun",
topical_categories = "Water sports",
}
labels["capitalism"] = {
aliases = {"capitalist"},
Wiktionary = true,
topical_categories = true,
}
labels["carbohydrate"] = {
aliases = {"carbohydrates"},
display = "[[biochemistry]]",
topical_categories = "Carbohydrates",
}
labels["carboxylic acid"] = {
aliases = {"carboxylic acids"},
display = "[[organic chemistry]]",
topical_categories = "Carboxylic acids",
}
labels["card games"] = {
aliases = {"cards", "card game", "playing card"},
display = "[[card game]]s",
topical_categories = true,
}
labels["cardiology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["carpentry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cartography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cartomancy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["castells"] = {
Wiktionary = true,
topical_categories = true,
}
labels["category theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Catholicism"] = {
aliases = {"catholicism", "Catholic", "catholic"},
Wiktionary = true,
topical_categories = true,
}
labels["caving"] = {
Wiktionary = "caving#Noun",
topical_categories = true,
}
labels["cellular automata"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Celtic mythology"] = {
display = "[[Celtic]] [[mythology]]",
topical_categories = true,
}
labels["ceramics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cheerleading"] = {
Wiktionary = "cheerleading#Noun",
topical_categories = true,
}
labels["chemical element"] = {
display = "[[chemistry]]",
topical_categories = "Chemical elements",
}
labels["chemical element symbol"] = {
-- Compare "systematic chemical element symbol" and "obsolete chemical element symbol".
display = "[[chemistry]]",
plain_categories = "Chemical element symbols",
}
labels["chemical engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["chemistry"] = {
aliases = {"chemical"},
Wiktionary = true,
topical_categories = true,
}
labels["chess"] = {
Wiktionary = true,
topical_categories = true,
}
labels["children's games"] = {
aliases = {"children's game"},
display = "[[children|children's]] [[game]]s",
topical_categories = true,
}
labels["Chilean politics"] = {
Wikipedia = "Politics of Chile",
topical_categories = true,
}
labels["Chinese astronomy"] = {
display = "[[Chinese]] [[astronomy]]",
topical_categories = true,
}
labels["Chinese calligraphy"] = {
display = "[[Chinese]] [[calligraphy]]",
topical_categories = "Calligraphy",
}
labels["Chinese constellation"] = {
display = "[[Chinese]] [[astronomy]]",
topical_categories = "Constellations",
}
labels["Chinese folk religion"] = {
display = "[[Chinese]] [[folk religion]]",
topical_categories = "Religion",
}
labels["Chinese linguistics"] = {
display = "[[Chinese]] [[linguistics]]",
topical_categories = "Linguistics",
}
labels["Chinese mythology"] = {
display = "[[Chinese]] [[mythology]]",
topical_categories = true,
}
labels["Chinese philosophy"] = {
display = "[[Chinese]] [[philosophy]]",
topical_categories = true,
}
labels["Chinese phonetics"] = {
display = "[[Chinese]] [[phonetics]]",
topical_categories = true,
}
labels["Chinese religion"] = {
display = "[[Chinese]] [[religion]]",
topical_categories = "Religion",
}
labels["Chinese star"] = {
display = "[[Chinese]] [[astronomy]]",
topical_categories = "Stars",
}
labels["Christianity"] = {
aliases = {"christianity", "Christian", "christian"},
Wiktionary = true,
topical_categories = true,
}
labels["Church of England"] = {
aliases = {"C of E", "CofE"},
Wikipedia = true,
topical_categories = true,
}
labels["Church of the East"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cinematography"] = {
aliases = {"filmology"},
Wiktionary = true,
topical_categories = true,
}
labels["cladistics"] = {
Wiktionary = true,
topical_categories = "Taxonomy",
}
labels["classical mechanics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["classical studies"] = {
Wiktionary = true,
topical_categories = true,
}
labels["climate change"] = {
Wiktionary = true,
topical_categories = true,
}
labels["climatology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["climbing"] = {
aliases = {"rock climbing"},
Wiktionary = "climbing#Noun",
topical_categories = true,
}
labels["clinical psychology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["clothing"] = {
Wiktionary = "clothing#Noun",
topical_categories = true,
}
labels["cloud computing"] = {
Wiktionary = true,
topical_categories = "Computing",
}
labels["cockfighting"] = {
aliases = {"cockfight"},
Wiktionary = true,
topical_categories = true,
}
labels["codicology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["coenzyme"] = {
aliases = {"coenzymes"},
display = "[[biochemistry]]",
topical_categories = "Coenzymes",
}
labels["coins"] = { -- Do not merge with "numismatics", as the category is different.
aliases = {"coin"},
display = "[[numismatics]]",
topical_categories = true,
}
labels["collectible card games"] = {
aliases = {"trading card games", "collectible cards", "trading cards"},
Wikipedia = true,
topical_categories = true,
}
labels["combinatorics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["comedy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["comics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["commerce"] = {
Wiktionary = true,
topical_categories = true,
}
labels["commercial law"] = {
display = "[[commercial#Adjective|commercial]] [[law]]",
topical_categories = true,
}
labels["communication"] = {
aliases = {"communications"},
Wiktionary = true,
topical_categories = true,
}
labels["communism"] = {
aliases = {"Communism", "communist"},
Wiktionary = true,
topical_categories = true,
}
labels["compilation"] = {
aliases = {"compiler"},
display = "[[software]] [[compilation]]",
topical_categories = true,
}
labels["complex analysis"] = {
Wiktionary = true,
topical_categories = true,
}
labels["computational linguistics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["computer chess"] = {
Wiktionary = true,
topical_categories = true,
}
labels["computer games"] = {
aliases = {"computer game", "computer gaming"},
display = "[[computer game]]s",
topical_categories = "Video games",
}
labels["computer graphics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["computer hardware"] = {
display = "[[computer]] [[hardware]]",
topical_categories = true,
}
labels["computer languages"] = {
aliases = {"computer language", "programming language", "programming languages"},
display = "[[computer language]]s",
topical_categories = true,
}
labels["computer science"] = {
aliases = {"comp sci", "CompSci", "compsci"},
Wiktionary = true,
topical_categories = true,
}
labels["computer security"] = {
Wiktionary = true,
topical_categories = true,
}
labels["computing"] = {
aliases = {"computer", "computers"},
Wiktionary = "computing#Noun",
topical_categories = true,
}
labels["computing theory"] = {
aliases = {"comptheory", "computability theory"},
display = "[[computing#Noun|computing]] [[theory]]",
topical_categories = "Theory of computing",
}
labels["conchology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Confucianism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["conlanging"] = {
aliases = {"conlang", "conlanger", "constructed languages", "constructed language"},
Wiktionary = true,
topical_categories = true,
}
labels["conservatism"] = {
aliases = {"conservative"},
Wiktionary = true,
topical_categories = true,
}
labels["conspiracy theories"] = {
aliases = {"conspiracy theory", "conspiracy"},
Wiktionary = "conspiracy theory#Noun",
topical_categories = true,
}
labels["constellation"] = {
display = "[[astronomy]]",
topical_categories = "Constellations",
}
labels["construction"] = {
Wiktionary = true,
topical_categories = true,
}
labels["control theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cooking"] = {
aliases = {"culinary", "cuisine", "cookery", "gastronomy"},
Wiktionary = "cooking#Noun",
topical_categories = true,
}
labels["cookware"] = {
aliases = {"bakeware"},
display = "[[cooking#Noun|cooking]]",
topical_categories = "Cookware and bakeware",
}
labels["Coptic Orthodoxy"] = {
aliases = {"Coptic Orthodox", "Coptic Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["copyright"] = {
aliases = {"copyright law", "intellectual property", "intellectual property law", "IP law"},
display = "[[copyright]] [[law]]",
topical_categories = true,
}
labels["copyright license"] = {
aliases = {"copyright licenses", "license", "copyright licence", "copyright licences", "licence"},
display = "[[w:Copyright license|copyright law]]",
Wikipedia = true,
topical_categories = "Copyright licenses",
}
labels["cosmetics"] = {
aliases = {"cosmetology"},
Wiktionary = true,
topical_categories = true,
}
labels["cosmology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["creationism"] = {
aliases = {"baraminology"},
Wiktionary = "creationism#English",
topical_categories = true,
}
labels["cribbage"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cricket"] = {
Wiktionary = true,
topical_categories = true,
}
labels["crime"] = {
aliases = {"criminal"},
Wiktionary = true,
topical_categories = true,
}
labels["criminal law"] = {
Wiktionary = true,
topical_categories = true,
}
labels["criminology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["crochet"] = {
aliases = {"crocheting"},
Wiktionary = true,
topical_categories = true,
}
labels["croquet"] = {
Wiktionary = true,
topical_categories = true,
}
labels["crosswording"] = {
aliases = {"crosswords", "cruciverbalism", "cryptic crosswords", "crossword puzzles"},
Wiktionary = true,
topical_categories = true,
}
labels["cryptocurrencies"] = {
aliases = {"cryptocurrency", "crypto"},
Wiktionary = "cryptocurrency",
topical_categories = "Cryptocurrency",
}
labels["cryptography"] = {
aliases = {"cryptographic"},
Wiktionary = true,
topical_categories = true,
}
labels["cryptozoology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["crystallography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["cultural anthropology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["curling"] = {
Wiktionary = true,
topical_categories = true,
}
labels["currencies"] = { -- Do not merge with "numismatics", as the category is different.
aliases = {"currency"},
display = "[[numismatics]]",
topical_categories = true,
}
labels["cybernetics"] = {
aliases = {"cybernetic"},
Wiktionary = true,
topical_categories = true,
}
labels["cybersecurity"] = {
Wiktionary = true,
topical_categories = "Networking",
}
labels["cycle racing"] = {
aliases = {"cycle sport"},
Wikipedia = "cycle sport",
topical_categories = true,
}
labels["cycling"] = {
aliases = {"bicycling", "bicycle", "bike"},
Wiktionary = "cycling#Noun",
topical_categories = true,
}
labels["cytology"] = {
aliases = {"cell biology", "cellular biology"},
Wiktionary = true,
topical_categories = true,
}
labels["dance"] = {
aliases = {"dancing"},
Wiktionary = "dance#Noun",
topical_categories = true,
}
labels["dances"] = {
display = "[[dance#Noun|dance]]",
topical_categories = true,
}
labels["darts"] = {
Wiktionary = true,
topical_categories = true,
}
labels["data management"] = {
Wiktionary = true,
topical_categories = true,
}
labels["data modeling"] = {
Wiktionary = true,
topical_categories = true,
}
labels["databases"] = {
aliases = {"database"},
display = "[[database]]s",
topical_categories = true,
}
labels["decision theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["deltiology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["demography"] = {
aliases = {"demographics"},
Wiktionary = true,
topical_categories = true,
}
labels["demonym"] = {
aliases = {"demonyms"},
Wiktionary = true,
topical_categories = "Demonyms",
}
labels["demoscene"] = {
topical_categories = true,
}
labels["dentistry"] = {
aliases = {"dentist"},
Wiktionary = true,
topical_categories = true,
}
labels["dermatology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["design"] = {
Wiktionary = "design#Noun",
topical_categories = true,
}
labels["developmental psychology"] = {
Wiktionary = true,
topical_categories = "Psychology",
}
labels["dice games"] = {
aliases = {"dice"},
display = "[[dice game]]s",
topical_categories = true,
}
labels["dictation"] = {
Wiktionary = true,
topical_categories = true,
}
labels["differential geometry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["diplomacy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["disc golf"] = {
Wiktionary = true,
topical_categories = true,
}
labels["disease"] = {
aliases = {"diseases"},
display = "[[pathology]]",
topical_categories = "Diseases",
}
labels["divination"] = {
Wiktionary = true,
topical_categories = true,
}
labels["diving"] = {
Wiktionary = "diving#Noun",
topical_categories = true,
}
labels["dominoes"] = {
Wiktionary = true,
topical_categories = true,
}
labels["dou dizhu"] = {
Wikipedia = true,
topical_categories = true,
}
labels["drama"] = {
Wiktionary = true,
topical_categories = true,
}
labels["dressage"] = {
Wiktionary = true,
topical_categories = true,
}
labels["E number"] = {
display = "[[food]] [[manufacture]]",
plain_categories = "European food additive numbers",
}
labels["early Christianity"] = {
aliases = {"early christianity", "Early Christianity", "early Church", "early church", "Early Church", "the early Church", "the early church", "the Early Church"},
Wikipedia = true,
topical_categories = true,
}
labels["earth science"] = {
Wiktionary = true,
topical_categories = "Earth sciences",
}
labels["Eastern Catholicism"] = {
aliases = {"Eastern Catholic"},
Wikipedia = true,
topical_categories = true,
}
labels["Eastern Christianity"] = {
aliases = {"Eastern christianity", "Eastern Christian", "Eastern christian", "Eastern Church", "Eastern church"},
Wikipedia = true,
topical_categories = true,
}
labels["Eastern Orthodoxy"] = {
aliases = {"Eastern Orthodox", "Eastern Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["eating disorders"] = {
aliases = {"eating disorder"},
display = "[[eating disorder]]s",
topical_categories = true,
}
labels["ecology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["economics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["education"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Egyptian god"] = {
aliases = {"Egyptian goddess", "Egyptian deity"},
display = "[[Egyptian]] [[mythology]]",
topical_categories = "Egyptian deities",
}
labels["Egyptian mythology"] = {
display = "[[Egyptian]] [[mythology]]",
topical_categories = true,
}
labels["Egyptology"] = {
Wiktionary = true,
aliases = {"Ancient Egypt"},
topical_categories = "Ancient Egypt",
}
labels["electrencephalography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["electrical engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["electricity"] = {
aliases = {"electrical"},
Wiktionary = true,
topical_categories = true,
}
labels["electrochemistry"] = {
aliases = {"electrochemical"},
Wiktionary = true,
topical_categories = true,
}
labels["electrodynamics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["electromagnetism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["electronics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["embryology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["emergency medicine"] = {
Wiktionary = true,
topical_categories = true,
}
labels["emergency services"] = {
Wiktionary = true,
topical_categories = true,
}
labels["endocrinology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["engineering"] = {
Wiktionary = "engineering#Noun",
topical_categories = true,
}
labels["enterprise engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["entomology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["enzyme"] = {
aliases = {"enzymes"},
display = "[[biochemistry]]",
topical_categories = "Enzymes",
}
labels["epidemiology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["epigraphy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["epistemology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["equestrianism"] = {
aliases = {"equestrian", "horses", "horsemanship"},
Wiktionary = true,
topical_categories = true,
}
labels["espionage"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ethics"] = {
aliases = {"ethical"},
Wiktionary = true,
topical_categories = true,
}
labels["ethnography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ethology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["EU politics"] = {
aliases = {"European Union politics"},
Wikipedia = "Politics of the European Union",
topical_categories = true,
}
labels["European folklore"] = {
display = "[[European]] [[folklore]]",
topical_categories = true,
}
labels["European politics"] = {
Wikipedia = "Politics of Europe",
topical_categories = true,
}
labels["European Union"] = {
aliases = {"EU"},
Wiktionary = true,
topical_categories = true,
}
labels["Evangelicalism"] = {
aliases = {"Evangelical", "evangelical", "Evangelical Christianity", "Evangelical Christian", "Evangelical Protestantism", "Evangelical Protestant"},
Wikipedia = true,
topical_categories = true,
}
labels["evolutionary theory"] = {
aliases = {"evolutionary biology"},
Wiktionary = true,
topical_categories = true,
}
labels["exercise"] = {
Wiktionary = true,
topical_categories = true,
}
labels["eye color"] = {
aliases = {"eye colour"},
display = "[[eye]] [[color]]",
topical_categories = "Eye colors",
}
labels["eyewear"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fairy tale"] = { -- names of fairy tales
aliases = {"fairytale", "fairy-tale"},
Wiktionary = true,
topical_categories = true,
}
labels["fairy tales"] = { -- relating to fairy tales
aliases = {"fairytales", "fairy-tales"},
Wiktionary = true,
topical_categories = true,
}
labels["falconry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fantasy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["farriery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fascism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fashion"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fatty acid"] = {
display = "[[organic chemistry]]",
topical_categories = "Fatty acids",
}
labels["felid"] = {
aliases = {"cat"},
display = "[[zoology]]",
topical_categories = "Felids",
}
labels["feminism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fencing"] = {
Wiktionary = "fencing#Noun",
topical_categories = true,
}
labels["feudalism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fiction"] = {
aliases = {"fictional"},
Wiktionary = true,
topical_categories = true,
}
labels["fictional character"] = {
display = "[[fiction]]",
topical_categories = "Fictional characters",
}
labels["field hockey"] = {
Wiktionary = true,
topical_categories = true,
}
labels["figure of speech"] = {
display = "[[rhetoric]]",
topical_categories = "Figures of speech",
}
labels["figure skating"] = {
Wiktionary = true,
topical_categories = true,
}
labels["file format"] = {
Wiktionary = true,
topical_categories = "File formats",
}
labels["film"] = {
Wiktionary = "film#Noun",
topical_categories = true,
}
labels["film genre"] = {
aliases = {"cinema"},
display = "[[film#Noun|film]]",
topical_categories = "Film genres",
}
labels["finance"] = {
Wiktionary = "finance#Noun",
topical_categories = true,
}
labels["Finnic mythology"] = {
aliases = {"Finnish mythology"},
display = "[[Finnic]] [[mythology]]",
topical_categories = true,
}
labels["firearms"] = {
aliases = {"firearm"},
display = "[[firearm]]s",
topical_categories = true,
}
labels["firefighting"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fish"] = {
display = "[[zoology]]",
topical_categories = true,
}
labels["fishing"] = {
aliases = {"angling"},
Wiktionary = "fishing#Noun",
topical_categories = true,
}
labels["flamenco"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fluid dynamics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["fluid mechanics"] = {
Wiktionary = true,
topical_categories = "Mechanics",
}
labels["folklore"] = {
Wiktionary = true,
topical_categories = true,
}
labels["footwear"] = {
Wiktionary = true,
topical_categories = true,
}
labels["forestry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Forteana"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Freemasonry"] = {
aliases = {"freemasonry"},
Wiktionary = true,
topical_categories = true,
}
labels["French politics"] = {
Wikipedia = "Politics of France",
topical_categories = true,
}
labels["functional analysis"] = {
Wiktionary = true,
topical_categories = true,
}
labels["functional group prefix"] = {
display = "[[organic chemistry]]",
topical_categories = "Functional group prefixes",
}
labels["functional group suffix"] = {
display = "[[organic chemistry]]",
topical_categories = "Functional group suffixes",
}
labels["functional programming"] = {
Wiktionary = true,
topical_categories = "Programming",
}
labels["furniture"] = {
Wiktionary = true,
topical_categories = true,
}
labels["furry fandom"] = {
aliases = {"furry", "furry community", "fursuit", "kemonā", "kemona", "kemono", "kemonomimi"},
display = "[[furry#Noun|furry]] [[fandom]]",
topical_categories = true,
}
labels["fuzzy logic"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Gaelic football"] = {
Wiktionary = true,
topical_categories = true,
}
labels["galaxy"] = {
display = "[[astronomy]]",
topical_categories = "Galaxies",
}
labels["gambling"] = {
Wiktionary = "gambling#Noun",
topical_categories = true,
}
labels["game theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["games"] = {
aliases = {"game"},
Wiktionary = "game#Noun",
topical_categories = true,
}
labels["gaming"] = {
Wiktionary = "gaming#Noun",
topical_categories = true,
}
labels["gender critical"] = {
aliases = {"gender-critical", "gender critical feminism", "gender-critical feminism", "GC", "GCF", "trans-exclusionary radical feminism", "TERF", "TERFism"},
Wiktionary = "gender-critical#Adjective",
Wikipedia = "Gender-critical feminism",
topical_categories = "Gender-critical feminism",
}
labels["genealogy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["general semantics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["genetic disorder"] = {
display = "[[medical]] [[genetics]]",
topical_categories = "Genetic disorders",
}
labels["genetics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["geography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["geological period"] = {
Wikipedia = true,
display ="[[geology]]",
topical_categories = "Geological periods",
}
labels["geology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["geometry"] = {
aliases = {"geometric", "geometrical"},
Wiktionary = true,
topical_categories = true,
}
labels["geomorphology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["geopolitics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["German politics"] = {
Wikipedia = "Politics of Germany",
topical_categories = true,
}
labels["Germanic god"] = {
aliases = {"Germanic goddess", "Germanic deity"},
display = "[[Germanic]] [[mythology]]",
topical_categories = "Germanic deities",
}
labels["Germanic paganism"] = {
aliases = {"Asatru", "Ásatrú", "Germanic neopaganism", "Germanic Paganism", "Heathenry", "heathenry", "Norse neopaganism", "Norse paganism"},
display = "[[Germanic#Adjective|Germanic]] [[paganism]]",
topical_categories = true,
}
labels["gerontology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["gladiatorial combat"] = {
Wikipedia = true,
topical_categories = true,
}
labels["glassblowing"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Gnosticism"] = {
aliases = {"gnosticism"},
Wiktionary = true,
topical_categories = true,
}
labels["go"] = {
aliases = {"Go", "game of go", "game of Go"},
display = "{{l|en|go|id=game}}",
topical_categories = true,
}
labels["golf"] = {
aliases = {"golfing"},
Wiktionary = true,
topical_categories = true,
}
labels["government"] = {
Wiktionary = true,
topical_categories = true,
}
labels["grammar"] = {
aliases = {"grammatical"},
Wiktionary = true,
topical_categories = true,
}
labels["grammatical case"] = {
display = "[[grammar]]",
topical_categories = "Grammatical cases",
}
labels["grammatical mood"] = {
display = "[[grammar]]",
topical_categories = "Grammatical moods",
}
labels["graph theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["graphic design"] = {
Wiktionary = true,
topical_categories = true,
}
labels["graphical user interface"] = {
aliases = {"GUI"},
Wiktionary = true,
topical_categories = true,
}
labels["Greek god"] = {
aliases = {"Greek goddess", "Greek deity"},
display = "[[Greek]] [[mythology]]",
topical_categories = "Greek deities",
}
labels["Greek mythology"] = {
display = "[[Greek]] [[mythology]]",
topical_categories = true,
}
labels["Greek Orthodoxy"] = {
aliases = {"Greek Orthodox", "Greek Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["group theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["gun mechanisms"] = {
aliases = {"firearm mechanism", "firearm mechanisms", "gun mechanism"},
display = "[[firearm]]s",
topical_categories = true,
}
labels["gun sports"] = {
aliases = {"shooting sports"},
display = "[[gun]] [[sport]]s",
topical_categories = true,
}
labels["gymnastics"] = {
Wiktionary = true,
Wikipedia = true,
topical_categories = true,
}
labels["gynaecology"] = {
aliases = {"gynecology"},
Wiktionary = "gynecology",
topical_categories = true,
}
labels["hair color"] = {
aliases = {"hair colour"},
display = "[[hair]] [[color]]",
topical_categories = "Hair colors",
}
labels["hairdressing"] = {
Wiktionary = true,
topical_categories = true,
}
labels["hanafuda"] = {
Wikipedia = true,
topical_categories = true,
}
labels["hand games"] = {
aliases = {"hand game"},
display = "[[hand]] [[game]]s",
topical_categories = true,
}
labels["handball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Hawaiian mythology"] = {
display = "[[Hawaiian]] [[mythology]]",
topical_categories = true,
}
labels["headwear"] = {
display = "[[clothing#Noun|clothing]]",
topical_categories = true,
}
labels["healthcare"] = {
Wiktionary = true,
topical_categories = true,
}
labels["helminthology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["hematology"] = {
aliases = {"haematology"},
Wiktionary = true,
topical_categories = true,
}
labels["heraldic charge"] = {
aliases = {"heraldiccharge"},
display = "[[heraldry]]",
topical_categories = "Heraldic charges",
}
labels["heraldry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["herbalism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["herpetology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Hindu god"] = {
display = "[[Hinduism]]",
topical_categories = "Hindu deities",
}
labels["Hinduism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Hindutva"] = {
Wiktionary = true,
topical_categories = true,
}
labels["historical currencies"] = {
aliases = {"historical currency"},
display = "[[numismatics]]",
sense_categories = "historical",
topical_categories = "Historical currencies",
}
labels["historical linguistics"] = {
Wiktionary = true,
topical_categories = "Linguistics",
}
labels["historical period"] = {
aliases = {"historical periods"},
display = "[[history]]",
topical_categories = "Historical periods",
}
labels["historiography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["history"] = {
Wiktionary = true,
topical_categories = true,
}
labels["hockey"] = {
display = "[[field hockey]] or [[ice hockey]]",
topical_categories = {"Field hockey", "Ice hockey"},
}
labels["homeopathy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Homestuck"] = {
display = "''[[Homestuck]]''",
Wiktionary = true,
topical_categories = true,
}
labels["Hong Kong politics"] = {
aliases = {"HK politics"},
Wikipedia = "Politics of Hong Kong",
topical_categories = true,
}
labels["hormone"] = {
display = "[[biochemistry]]",
topical_categories = "Hormones",
}
labels["horse color"] = {
aliases = {"horse colour"},
display = "[[horse]] [[color]]",
topical_categories = "Horse colors",
}
labels["horse racing"] = {
Wiktionary = true,
topical_categories = true,
}
labels["horticulture"] = {
aliases = {"gardening"},
Wiktionary = true,
topical_categories = true,
}
labels["HTML"] = {
Wiktionary = "Hypertext Markup Language",
topical_categories = true,
}
labels["human resources"] = {
aliases = {"HR"},
Wiktionary = true,
topical_categories = true,
}
labels["humanities"] = {
Wiktionary = true,
topical_categories = true,
}
labels["hunting"] = {
Wiktionary = "hunting#Noun",
topical_categories = true,
}
labels["hurling"] = {
Wiktionary = "hurling#Noun",
topical_categories = true,
}
labels["hydroacoustics"] = {
Wikipedia = true,
topical_categories = true,
}
labels["hydrocarbon chain prefix"] = {
display = "[[organic chemistry]]",
topical_categories = "Hydrocarbon chain prefixes",
}
labels["hydrocarbon chain suffix"] = {
display = "[[organic chemistry]]",
topical_categories = "Hydrocarbon chain suffixes",
}
labels["hydrology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ice hockey"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ichthyology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["idol fandom"] = {
aliases = {"idol"},
display = "[[idol]] [[fandom]]",
topical_categories = true,
}
labels["immunochemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["immunology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["import/export"] = {
aliases = {"import", "export"},
display = "[[import#Noun|import]]/[[export#Noun|export]]",
topical_categories = true,
}
labels["incoterm"] = {
display = "[[Incoterm]]",
topical_categories = "Incoterms",
}
labels["Indian politics"] = {
Wikipedia = "Politics of India",
topical_categories = true,
}
labels["Indo-European studies"] = {
aliases = {"indo-european studies"},
Wiktionary = true,
topical_categories = true,
}
labels["Indonesian politics"] = {
aliases = {"Indonesia politics"},
Wikipedia = "Politics of Indonesia",
topical_categories = true,
}
labels["information science"] = {
Wiktionary = true,
topical_categories = true,
}
labels["information technology"] = {
aliases = {"IT"},
Wiktionary = true,
topical_categories = "Computing",
}
labels["information theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["inheritance law"] = {
Wiktionary = true,
topical_categories = true,
}
labels["inorganic chemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["inorganic compound"] = {
display = "[[inorganic chemistry]]",
topical_categories = "Inorganic compounds",
}
labels["insurance"] = {
Wiktionary = true,
topical_categories = true,
}
labels["international law"] = {
Wiktionary = true,
topical_categories = true,
}
labels["international relations"] = {
Wiktionary = true,
topical_categories = true,
}
labels["international standards"] = {
aliases = {"international standard", "ISO", "International Organization for Standardization", "International Organisation for Standardisation"},
Wikipedia = "International standard",
}
labels["Internet"] = {
aliases = {"internet", "online"},
Wiktionary = true,
topical_categories = true,
}
labels["Iranian mythology"] = {
display = "[[Iranian]] [[mythology]]",
topical_categories = true,
}
labels["Irish mythology"] = {
display = "[[Irish]] [[mythology]]",
topical_categories = true,
}
labels["Irish politics"] = {
Wikipedia = "Politics of the Republic of Ireland",
topical_categories = true,
}
labels["Islam"] = {
aliases = {"islam", "Islamic", "Muslim"},
Wikipedia = true,
topical_categories = true,
}
labels["Islamic finance"] = {
aliases = {"Islamic banking", "Muslim finance", "Muslim banking", "Sharia-compliant finance"},
Wikipedia = true,
topical_categories = true,
}
labels["Islamic law"] = {
aliases = {"Islamic legal", "Sharia"},
Wikipedia = true,
topical_categories = true,
}
labels["isotope"] = {
display = "[[physics]]",
topical_categories = "Isotopes",
}
labels["Jainism"] = {
Wiktionary = true,
Wikipedia = true,
topical_categories = true,
}
labels["Japanese fiction"] = {
-- aliases = {"anime", "manga", "anime and manga", "manga and anime"},
display = "[[Japanese#Adjective|Japanese]] [[fiction]]",
Wikipedia = true,
topical_categories = true,
}
labels["Japanese god"] = {
display = "[[Japanese#Adjective|Japanese]] [[mythology]]",
topical_categories = "Japanese deities",
}
labels["Japanese mythology"] = {
display = "[[Japanese#Adjective|Japanese]] [[mythology]]",
topical_categories = true,
}
labels["Japanese politics"] = {
Wikipedia = "Politics of Japan",
topical_categories = true,
}
labels["Japanese pornography"] = {
aliases = {"Japanese porn", "hentai", "adult anime", "erotic anime", "ero anime"},
display = "[[Japanese#Adjective|Japanese]] [[pornography]]",
Wikipedia = true,
topical_categories = true,
}
labels["Java programming language"] = {
aliases = {"JavaPL", "Java PL"},
Wikipedia = "Java (programming language)",
topical_categories = true,
}
labels["jazz"] = {
Wiktionary = "jazz#Noun",
topical_categories = true,
}
labels["jewelry"] = {
aliases = {"jewellery"},
Wiktionary = true,
topical_categories = true,
}
labels["Jewish law"] = {
aliases = {"Halacha", "Halachah", "Halakha", "Halakhah", "halacha", "halachah", "halakha", "halakhah", "Jewish Law", "jewish law"},
display = "[[Jewish]] [[law]]",
topical_categories = true,
}
labels["journalism"] = {
Wiktionary = true,
topical_categories = "Mass media",
}
labels["Judaism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["judo"] = {
Wiktionary = true,
topical_categories = true,
}
labels["juggling"] = {
Wiktionary = "juggling#Noun",
topical_categories = true,
}
labels["karuta"] = {
Wiktionary = true,
topical_categories = true,
}
labels["kendo"] = {
Wiktionary = true,
topical_categories = true,
}
labels["knitting"] = {
Wiktionary = "knitting#Noun",
topical_categories = true,
}
labels["Korean mythology"] = {
display = "[[Korean#Adjective|Korean]] [[mythology]]",
topical_categories = true,
}
labels["labour"] = {
aliases = {"labor", "labour movement", "labor movement"},
Wiktionary = true,
topical_categories = true,
}
labels["labour law"] = {
aliases = {"labor law"},
Wiktionary = true,
topical_categories = "Law",
}
labels["lacrosse"] = {
Wiktionary = true,
topical_categories = true,
}
labels["landforms"] = {
display = "[[geography]]",
topical_categories = true,
}
labels["law"] = {
aliases = {"legal"},
Wiktionary = "law#English",
topical_categories = true,
}
labels["law enforcement"] = {
aliases = {"police", "policing"},
Wiktionary = true,
topical_categories = true,
}
labels["leatherworking"] = {
Wiktionary = true,
topical_categories = true,
}
labels["leftism"] = {
aliases = {"leftist"},
Wiktionary = true,
topical_categories = true,
}
labels["letterpress"] = {
aliases = {"metal type", "metal typesetting"},
display = "[[letterpress]] [[typography]]",
topical_categories = "Typography",
}
labels["lexicography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["LGBTQ"] = {
aliases = {"LGBT", "LGBT+", "LGBT*", "LGBTQ+", "LGBTQ*", "LGBTQIA", "LGBTQIA+", "LGBTQIA*", "queer"},
Wiktionary = true,
topical_categories = true,
}
labels["liberalism"] = {
aliases = {"liberal"},
Wiktionary = true,
topical_categories = true,
}
labels["library science"] = {
Wiktionary = true,
topical_categories = true,
}
labels["lichenology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["limnology"] = {
Wiktionary = true,
topical_categories = "Ecology",
}
labels["linear algebra"] = {
aliases = {"vector algebra"},
Wiktionary = true,
topical_categories = true,
}
labels["linguistic morphology"] = {
display = "[[linguistic]] [[morphology]]",
topical_categories = true,
}
labels["linguistics"] = {
aliases = {"linguistic", "philology"},
Wiktionary = true,
topical_categories = true,
}
labels["lipid"] = {
aliases = {"lipids"},
display = "[[biochemistry]]",
topical_categories = "Lipids",
}
labels["literature"] = {
Wiktionary = true,
topical_categories = true,
}
labels["locksmithing"] = {
Wiktionary = true,
display = "[[locksmithing]]",
topical_categories = true,
}
labels["logic"] = {
Wiktionary = true,
topical_categories = true,
}
labels["logical fallacy"] = {
aliases = {"fallacies"},
display = "[[rhetoric]]",
topical_categories = "Logical fallacies",
}
labels["logistics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["luge"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Lutheranism"] = {
aliases = {"Lutheran", "Lutheranist", "Lutheran Church"},
Wikipedia = true,
topical_categories = true,
}
labels["lutherie"] = {
Wiktionary = true,
topical_categories = true,
}
labels["machine learning"] = {
aliases = {"ML"},
Wiktionary = true,
topical_categories = true,
}
labels["machining"] = {
Wiktionary = "machining#Noun",
topical_categories = true,
}
labels["macroeconomics"] = {
Wiktionary = true,
topical_categories = "Economics",
}
labels["mahjong"] = {
Wiktionary = true,
topical_categories = true,
}
labels["malacology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Malaysian politics"] = {
aliases = {"Malaysia politics"},
Wikipedia = "Politics of Malaysia",
topical_categories = true,
}
labels["mammalogy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["management"] = {
Wiktionary = true,
topical_categories = true,
}
labels["manga"] = {
aliases = {"Japanese comics"},
Wiktionary = true,
topical_categories = "Japanese fiction",
}
labels["manhua"] = {
aliases = {"Chinese comics"},
Wiktionary = true,
topical_categories = "Chinese fiction",
}
labels["manhwa"] = {
aliases = {"Korean comics"},
Wiktionary = true,
topical_categories = "Korean fiction",
}
labels["Manichaeism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["manufacturing"] = {
Wiktionary = "manufacturing#Noun",
topical_categories = true,
}
labels["Maoism"] = {
aliases = {"Maoist"},
Wiktionary = true,
topical_categories = true,
}
labels["marching"] = {
Wiktionary = "marching#Noun",
topical_categories = true,
}
labels["marine biology"] = {
aliases = {"coral science"},
Wiktionary = true,
topical_categories = true,
}
labels["marketing"] = {
Wiktionary = "marketing#Noun",
topical_categories = true,
}
labels["martial arts"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Marxism"] = {
aliases = {"Marxist"},
Wiktionary = true,
topical_categories = true,
}
labels["masonry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["massage"] = {
Wiktionary = true,
topical_categories = true,
}
labels["materials science"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mathematical analysis"] = {
aliases = {"analysis"},
Wiktionary = true,
topical_categories = true,
}
labels["mathematics"] = {
aliases = {"math", "maths"},
Wiktionary = true,
topical_categories = true,
}
labels["measure theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mechanical engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mechanics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["media"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mediaeval folklore"] = {
aliases = {"medieval folklore"},
display = "[[mediaeval]] [[folklore]]",
topical_categories = "European folklore",
}
labels["medical genetics"] = {
display = "[[medical]] [[genetics]]",
topical_categories = true,
}
labels["medical sign"] = {
aliases = {"medical symptoms", "symptom", "symptoms"},
display = "[[medicine]]",
topical_categories = "Medical signs and symptoms",
}
labels["medicine"] = {
aliases = {"medical"},
Wiktionary = true,
topical_categories = true,
}
labels["Meitei god"] = {
aliases = {"Meitei goddess", "Meitei deity"},
display = "[[Meitei]] [[mythology]]",
topical_categories = "Meitei deities",
}
labels["mental health"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Mesopotamian god"] = {
aliases = {"Mesopotamian goddess", "Mesopotamian deity",
"Mesopotamian diety" -- FIXME: existing typo
},
display = "[[Mesopotamian]] [[mythology]]",
topical_categories = "Mesopotamian deities",
}
labels["Mesopotamian mythology"] = {
display = "[[Mesopotamian]] [[mythology]]",
topical_categories = true,
}
labels["metadata"] = {
Wiktionary = true,
topical_categories = "Data management",
}
labels["metallurgy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["metalworking"] = {
Wiktionary = true,
topical_categories = true,
}
labels["metamaterial"] = {
display = "[[physics]]",
topical_categories = "Metamaterials",
}
labels["metaphysics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["meteorology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Methodism"] = {
aliases = {"Methodist", "methodism", "methodist"},
Wiktionary = true,
topical_categories = true,
}
labels["metrology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Mexican politics"] = {
aliases = {"Mexico politics"},
Wikipedia = "Politics of Mexico",
topical_categories = true,
}
labels["microbiology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["microelectronics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["micronationalism"] = {
aliases = {"micronation", "micronations"},
Wiktionary = true,
topical_categories = true,
}
labels["microscopy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["military"] = {
aliases = {"army"},
Wiktionary = true,
topical_categories = true,
}
labels["military ranks"] = {
aliases = {"military rank"},
display = "[[military]]",
topical_categories = true,
}
labels["military unit"] = {
display = "[[military]]",
topical_categories = "Military units",
}
labels["milling"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Minecraft"] = {
display = "''[[Minecraft]]''",
topical_categories = true,
}
labels["mineral"] = {
display = "[[mineralogy]]",
topical_categories = "Minerals",
}
labels["mineralogy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mining"] = {
Wiktionary = "mining#Noun",
topical_categories = true,
}
labels["mobile phones"] = {
aliases = {"cell phone", "cell phones", "mobile phone", "mobile telephony", "smartphone", "smartphones", "mobile"},
display = "[[mobile telephone|mobile telephony]]",
topical_categories = true,
}
labels["molecular biology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["monarchy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["money"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Mormonism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["motor racing"] = {
-- There are other types of racing, but 99% of the time "racing" on its own refers to motorsports.
aliases = {"motor sport", "motorsport", "motorsports", "racing"},
Wiktionary = true,
topical_categories = true,
}
labels["motorcycling"] = {
aliases = {"motorcycle", "motorcycles", "motorbike"},
Wiktionary = "motorcycling#Noun",
topical_categories = "Motorcycles",
}
labels["multiplicity"] = {
aliases = {"plurality", "polypsychism", "dissociative identity disorder", "DID"},
display = "{{l|en|multiplicity|id=multiple personalities}}",
topical_categories = "Multiplicity (psychology)",
}
labels["muscle"] = {
aliases = {"muscles"},
display = "[[anatomy]]",
topical_categories = "Muscles",
}
labels["mushroom"] = {
aliases = {"mushrooms"},
display = "[[mycology]]",
topical_categories = "Mushrooms",
}
labels["music"] = {
aliases = {"musical"},
Wiktionary = true,
topical_categories = true,
}
labels["music genre"] = {
display = "[[music]]",
topical_categories = "Musical genres",
}
labels["music industry"] = {
Wikipedia = true,
topical_categories = true,
}
labels["musical instruments"] = {
aliases = {"musical instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["musician"] = {
display = "[[music]]",
topical_categories = "Musicians",
}
labels["musicology"] = {
Wiktionary = true,
topical_categories = "Music",
}
labels["mycology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mysticism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["mythological creature"] = {
aliases = {"mythological creatures"},
display = "[[mythology]]",
topical_categories = "Mythological creatures",
}
labels["mythology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["nanotechnology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["narratology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["nautical"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Navajo mythology"] = {
display = "[[Navajo]] [[mythology]]",
topical_categories = true,
}
labels["navigation"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Nazism"] = { -- see also Neo-Nazism
aliases = {"nazism", "Nazi", "nazi", "Nazis", "nazis"},
Wikipedia = true,
topical_categories = true,
}
labels["nematology"] = {
Wiktionary = true,
topical_categories = "Zoology",
}
labels["neo-Nazism"] = { -- Often used to indicate Nazi-used jargon; compare "white supremacist ideology"
aliases = {"Neo-Nazism", "Neo-nazism", "neo-nazism", "Neo-Nazi", "Neo-nazi", "neo-Nazi", "neo-nazi", "Neo-Nazis", "Neo-nazis", "neo-Nazis", "neo-nazis", "NeoNazism", "Neonazism", "neoNazism", "neonazism", "NeoNazi", "Neonazi", "neoNazi", "neonazi", "NeoNazis", "Neonazis", "neoNazis", "neonazis"},
Wikipedia = true,
topical_categories = true,
}
labels["netball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["networking"] = {
Wiktionary = "networking#Noun",
topical_categories = true,
}
labels["neuroanatomy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["neurology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["neuroscience"] = {
Wiktionary = true,
topical_categories = true,
}
labels["neurosurgery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["neurotoxin"] = {
display = "[[neurotoxicology]]",
topical_categories = "Neurotoxins",
}
labels["neurotransmitter"] = {
display = "[[biochemistry]]",
topical_categories = "Neurotransmitters",
}
labels["New Zealand politics"] = {
Wikipedia = "Politics of New Zealand",
topical_categories = true,
}
labels["newspapers"] = {
display = "[[newspaper]]s",
topical_categories = true,
}
labels["Norse god"] = {
aliases = {"Norse goddess", "Norse deity"},
display = "[[Norse]] [[mythology]]",
topical_categories = "Norse deities",
}
labels["Norse mythology"] = {
display = "[[Norse]] [[mythology]]",
topical_categories = true,
}
labels["nuclear energy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["nuclear physics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["number theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["numismatics"] = {
Wiktionary = true,
topical_categories = "Currency",
}
labels["nutrition"] = {
Wiktionary = true,
topical_categories = true,
}
labels["object-oriented programming"] = {
aliases = {"object-oriented", "OOP"},
Wiktionary = true,
topical_categories = true,
}
labels["obsolete chemical element symbol"] = {
display = "[[chemistry]], [[obsolete]]",
plain_categories = "Obsolete chemical element symbols",
}
labels["obstetrics"] = {
aliases = {"obstetric"},
Wiktionary = true,
topical_categories = true,
}
labels["occult"] = {
Wiktionary = true,
topical_categories = true,
}
labels["oceanography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Odinani"] = {
aliases = {"Odinala", "Omenala", "Odinana", "Omenana", "Igbo religion"},
Wikipedia = true,
topical_categories = true,
}
labels["oil industry"] = {
aliases = {"oil", "oil drilling", "petroleum industry", "petroleum"},
Wikipedia = true,
topical_categories = true,
}
labels["oncology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["online gaming"] = {
aliases = {"online games", "MMO", "MMORPG"},
display = "[[online]] [[gaming#Noun|gaming]]",
topical_categories = "Video games",
}
labels["onomastics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["opera"] = {
Wiktionary = true,
topical_categories = true,
}
labels["operating systems"] = {
display = "[[operating system]]s",
topical_categories = "Software",
}
labels["ophthalmology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["optics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["organic chemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["organic compound"] = {
display = "[[organic chemistry]]",
topical_categories = "Organic compounds",
}
labels["Oriental Orthodoxy"] = {
aliases = {"Oriental Orthodox", "Oriental Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["ornithology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["orthodontics"] = {
Wiktionary = true,
topical_categories = "Dentistry",
}
labels["orthography"] = {
Wiktionary = true,
topical_categories = true,
}
labels["paganism"] = {
aliases = {"pagan", "neopagan", "neopaganism", "neo-pagan", "neo-paganism"},
Wiktionary = true,
topical_categories = true,
}
labels["pain"] = {
display = "[[medicine]]",
topical_categories = true,
}
labels["paintball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["painting"] = {
Wiktionary = "painting#Noun",
topical_categories = true,
}
labels["Pakistani politics"] = {
Wikipedia = "Politics of Pakistan",
topical_categories = true,
}
labels["palaeography"] = {
aliases = {"paleography"},
Wiktionary = true,
topical_categories = true,
}
labels["paleontology"] = {
aliases = {"palaeontology"},
Wiktionary = true,
topical_categories = true,
}
labels["Palestinian politics"] = {
aliases = {"Palestine politics"},
Wikipedia = "Politics of the Palestinian National Authority",
topical_categories = true,
}
labels["palmistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["palynology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["papermaking"] = {
Wiktionary = true,
topical_categories = true,
}
labels["paraphilia"] = {
aliases = {"paraphilias", "paraphilic", "fetish", "fetishes", "fetishism", "fetishistic", "fetishization", "fetishisation"},
Wiktionary = "paraphilia#Noun",
topical_categories = "Paraphilias",
}
labels["parapsychology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["parasitology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["part of speech"] = {
aliases = {"PoS"},
display = "[[grammar]]",
topical_categories = "Parts of speech",
}
labels["particle"] = {
aliases = {"subatomic particle", "subatomic particles"},
display = "[[particle physics]]",
topical_categories = "Subatomic particles",
}
labels["particle physics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pasteurization"] = {
aliases = {"pasteurisation"},
Wiktionary = true,
topical_categories = true,
}
labels["patent law"] = {
aliases = {"patents"},
display = "[[patent#Noun|patent]] [[law]]",
topical_categories = true,
}
labels["pathology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pensions"] = {
aliases = {"pension"},
display = "[[pension]]s",
topical_categories = true,
}
labels["percussion instruments"] = {
aliases = {"percussion instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["perfumery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Peruvian politics"] = {
Wikipedia = "Politics of Peru",
topical_categories = true,
}
labels["pesäpallo"] = {
aliases = {"pesapallo"},
Wiktionary = true,
topical_categories = true,
}
labels["petrochemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["petrology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pharmaceutical drug"] = {
display = "[[pharmacology]]",
topical_categories = "Pharmaceutical drugs",
}
labels["pharmaceutical effect"] = {
display = "[[pharmacology]]",
topical_categories = "Pharmaceutical effects",
}
labels["pharmacology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pharmacy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pharyngology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["philately"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Philippine politics"] = {
aliases = {"Filipino politics"},
Wikipedia = "Politics of the Philippines",
topical_categories = true,
}
labels["Philmont Scout Ranch"] = {
aliases = {"Philmont"},
Wikipedia = true,
topical_categories = true,
}
labels["philosophy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["phonetics"] = {
aliases = {"phonetic"},
Wiktionary = true,
topical_categories = true,
}
labels["phonology"] = {
aliases = {"phonological"},
Wiktionary = true,
topical_categories = true,
}
labels["photography"] = {
aliases = {"photograph"},
Wiktionary = true,
topical_categories = true,
}
labels["phrenology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["phycology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["physical chemistry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["physical quantity"] = {
display = "[[physics]]",
topical_categories = "Physical quantities",
}
labels["physics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["physiology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["phytopathology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pinball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["planetology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["plant"] = {
aliases = {"plants"},
display = "[[botany]]",
topical_categories = "Plants",
}
labels["plant disease"] = {
aliases = {"plant diseases"},
display = "[[phytopathology]]",
topical_categories = "Plant diseases",
}
labels["plastic surgery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["playground games"] = {
aliases = {"playground game"},
display = "[[playground]] [[game]]s",
topical_categories = true,
}
labels["poetry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["poison"] = {
display = "[[toxicology]]",
topical_categories = "Poisons",
}
labels["Pokémon"] = {
aliases = {"Pokemon"},
display = "''[[w:Pokémon|Pokémon]]''",
Wikipedia = true,
topical_categories = true,
}
labels["poker"] = {
Wiktionary = true,
topical_categories = true,
}
labels["poker slang"] = {
display = "[[poker]] [[slang]]",
topical_categories = "Poker",
}
labels["political science"] = {
Wiktionary = true,
topical_categories = true,
}
labels["political subdivision"] = {
display = "[[government]]",
topical_categories = "Political subdivisions",
}
labels["politics"] = {
aliases = {"political"},
Wiktionary = true,
topical_categories = true,
}
labels["pornography"] = {
aliases = {"porn", "porno", "adult video", "adult videos"},
Wiktionary = true,
topical_categories = true,
}
labels["Portuguese folklore"] = {
display = "[[Portuguese#Adjective|Portuguese]] [[folklore]]",
topical_categories = "European folklore",
}
labels["Portuguese politics"] = {
Wikipedia = "Politics of Portugal",
topical_categories = true,
}
labels["post"] = {
aliases = {"mail", "postal"},
display = "[[postal]]",
topical_categories = true,
}
labels["postal abbreviation"] = {
aliases = {"postal abbr", "postal abbrev"},
display = "[[postal]]",
topical_categories = "Postal abbreviations",
}
labels["potential theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pottery"] = {
Wiktionary = true,
topical_categories = "Ceramics",
}
labels["pragmatics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["printing"] = {
Wiktionary = "printing#Noun",
topical_categories = true,
}
labels["probability theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["professional wrestling"] = {
aliases = {"pro wrestling"},
Wiktionary = true,
topical_categories = true,
}
labels["programming"] = {
aliases = {"computer programming"},
Wiktionary = "programming#Noun",
topical_categories = true,
}
labels["property law"] = {
aliases = {"land law", "real estate law"},
Wiktionary = true,
topical_categories = true,
}
labels["prosody"] = {
Wiktionary = true,
topical_categories = true,
}
labels["protein"] = {
aliases = {"proteins"},
display = "[[biochemistry]]",
topical_categories = "Proteins",
}
labels["Protestantism"] = {
aliases = {"protestantism", "Protestant", "protestant"},
Wiktionary = true,
topical_categories = true,
}
labels["pseudoscience"] = {
Wiktionary = true,
topical_categories = true,
}
labels["psychiatry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["psychoanalysis"] = {
Wiktionary = true,
topical_categories = true,
}
labels["psychology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["psychotherapy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["publishing"] = {
Wiktionary = "publishing#Noun",
topical_categories = true,
}
labels["pulmonology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["pyrotechnics"] = {
Wiktionary = true,
aliases = { "firework", "fireworks" },
topical_categories = true,
}
labels["QAnon"] = {
aliases = {"Qanon"},
Wikipedia = true,
topical_categories = true,
}
labels["Quakerism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["quantum computing"] = {
Wiktionary = true,
topical_categories = true,
}
labels["quantum mechanics"] = {
aliases = {"quantum physics"},
Wiktionary = true,
topical_categories = true,
}
labels["Quimbanda"] = {
Wiktionary = true,
topical_categories = true,
}
labels["radiation"] = {
-- TODO: What kind of topic is "radiation"? Is it specific kinds of radiation? That would be a set-type category.
display = "[[physics]]",
topical_categories = true,
}
labels["radio"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Raëlism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rail transport"] = {
aliases = {"rail", "railroading", "railroads"},
Wiktionary = true,
topical_categories = "Rail transportation",
}
labels["Rastafari"] = {
aliases = {"Rasta", "rasta", "Rastafarian", "rastafarian", "Rastafarianism"},
Wiktionary = true,
topical_categories = true,
}
labels["real estate"] = {
Wiktionary = true,
topical_categories = true,
}
labels["real tennis"] = {
Wiktionary = true,
topical_categories = "Tennis",
}
labels["recreational mathematics"] = {
Wiktionary = true,
topical_categories = "Mathematics",
}
labels["Reddit"] = {
Wiktionary = true,
topical_categories = true,
}
labels["regular expressions"] = {
aliases = {"regex"},
display = "[[regular expression]]s",
topical_categories = true,
}
labels["relativity"] = {
Wiktionary = true,
topical_categories = true,
}
labels["religion"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rhetoric"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rhythmic gymnastics"] = {
Wiktionary = true,
Wikipedia = true,
topical_categories = true,
}
labels["road transport"] = {
aliases = {"roads"},
Wikipedia = true,
topical_categories = true,
}
labels["robotics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rock"] = {
aliases = {"rocks"},
display = "[[geology]]",
topical_categories = "Rocks",
}
labels["rock paper scissors"] = {
topical_categories = true,
}
labels["roleplaying games"] = {
aliases = {"role playing games", "role-playing games", "RPG", "RPGs"},
display = "[[roleplaying game]]s",
topical_categories = "Role-playing games",
}
labels["roller derby"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Roman Catholicism"] = {
aliases = {"Roman Catholic", "Roman Catholic Church"},
Wiktionary = true,
topical_categories = true,
}
labels["Roman Empire"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Roman god"] = {
aliases = {"Roman goddess", "Roman deity"},
display = "[[Roman]] [[mythology]]",
topical_categories = "Roman deities",
}
labels["Roman mythology"] = {
display = "[[Roman]] [[mythology]]",
topical_categories = true,
}
labels["Roman numerals"] = {
display = "[[Roman numeral]]s",
topical_categories = true,
}
labels["roofing"] = {
Wiktionary = "roofing#Noun",
topical_categories = true,
}
labels["rosiculture"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rowing"] = {
Wiktionary = "rowing#Noun",
topical_categories = true,
}
labels["Rubik's Cube"] = {
aliases = {"Rubik's cube", "Rubik's cubes", "Magic Cube", "magic cube"},
Wiktionary = "Rubik's cube",
topical_categories = true,
}
labels["rugby"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rugby league"] = {
Wiktionary = true,
topical_categories = true,
}
labels["rugby union"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Russian Orthodoxy"] = {
aliases = {"Russian Orthodox", "Russian Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["sailing"] = {
Wiktionary = "sailing#Noun",
topical_categories = true,
}
labels["schools"] = {
display = "[[education]]",
topical_categories = true,
}
labels["science fiction"] = {
aliases = {"scifi", "sci fi", "sci-fi"},
Wiktionary = true,
topical_categories = true,
}
labels["sciences"] = {
aliases = {"science", "scientific"},
Wiktionary = true,
topical_categories = true,
}
labels["Scientology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Scots law"] = {
-- Note: this is the usual term, not "Scottish law".
aliases = {"Scottish law", "Scotland law", "Scots Law", "Scottish Law", "Scotland Law"},
Wikipedia = true,
topical_categories = true,
}
labels["Scouting"] = {
aliases = {"scouting"},
display = "[[scouting]]",
topical_categories = true,
}
labels["Scrabble"] = {
display = "''[[Scrabble]]''",
Wikipedia = true,
topical_categories = true,
}
labels["scrapbooks"] = {
display = "[[scrapbook]]s",
topical_categories = true,
}
labels["sculpture"] = {
Wiktionary = true,
topical_categories = true,
}
labels["seduction community"] = {
aliases = {"pickup artist", "pickup artists", "pickup artistry", "pickup community"},
Wikipedia = true,
topical_categories = true,
}
labels["seismology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["self-harm"] = {
aliases = {"selfharm", "self harm", "self-harm community"},
Wiktionary = true,
topical_categories = true,
}
labels["semantics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["semiconductors"] = {
display = "[[semiconductor]]s",
topical_categories = true,
}
labels["semiotics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["SEO"] = {
Wiktionary = "search engine optimization",
topical_categories = {"Internet", "Marketing"},
}
labels["set theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sewing"] = {
Wiktionary = "sewing#Noun",
topical_categories = true,
}
labels["sex"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sex position"] = {
display = "[[sex]]",
topical_categories = "Sex positions",
}
labels["sexology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sexuality"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Shaivism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["shamanism"] = {
aliases = {"Shamanism"},
Wiktionary = true,
topical_categories = true,
}
labels["Shi'ism"] = {
aliases = {"Shia", "Shi'ite", "Shi'i"},
display = "[[Shia Islam]]",
topical_categories = true,
}
labels["Shinto"] = {
Wiktionary = true,
topical_categories = true,
}
labels["ship parts"] = {
display = "[[nautical]]",
topical_categories = "Ship parts",
}
labels["shipping"] = {
Wiktionary = "shipping#Noun",
topical_categories = true,
}
labels["shoemaking"] = {
Wiktionary = true,
topical_categories = true,
}
labels["shogi"] = {
Wiktionary = true,
topical_categories = true,
}
labels["signal processing"] = {
Wikipedia = true,
topical_categories = true,
}
labels["Sikhism"] = {
aliases = {"Sikh"},
Wiktionary = true,
topical_categories = true,
}
labels["Singaporean politics"] = {
Wikipedia = "Politics of Singapore",
topical_categories = true,
}
labels["singing"] = {
Wiktionary = "singing#Noun",
topical_categories = true,
}
labels["skateboarding"] = {
Wiktionary = "skateboarding#Noun",
topical_categories = true,
}
labels["skating"] = {
Wiktionary = "skating#Noun",
topical_categories = true,
}
labels["skeleton"] = {
display = "[[anatomy]]",
topical_categories = true,
}
labels["skiing"] = {
Wiktionary = "skiing#Noun",
topical_categories = true,
}
labels["skydiving"] = {
Wiktionary = "skydiving#Noun",
topical_categories = true,
}
labels["Slavic god"] = {
display = "[[Slavic]] [[mythology]]",
topical_categories = "Slavic deities",
}
labels["Slavic mythology"] = {
display = "[[Slavic]] [[mythology]]",
topical_categories = true,
}
labels["smoking"] = {
Wiktionary = "smoking#Noun",
topical_categories = true,
}
labels["snooker"] = {
Wiktionary = "snooker#Noun",
topical_categories = true,
}
labels["snowboarding"] = {
Wiktionary = "snowboarding#Noun",
topical_categories = true,
}
labels["soccer"] = {
aliases = {"football", "association football"},
Wiktionary = true,
topical_categories = "Football (soccer)",
}
labels["social media"] = {
Wiktionary = true,
topical_categories = true,
}
labels["social sciences"] = {
aliases = {"social science"},
display = "[[social science]]s",
topical_categories = true,
}
labels["socialism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sociolinguistics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sociology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["softball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["software"] = {
Wiktionary = true,
topical_categories = true,
}
labels["software architecture"] = {
Wiktionary = true,
topical_categories = {"Software engineering", "Programming"},
}
labels["software engineering"] = {
aliases = {"software development"},
Wiktionary = true,
topical_categories = true,
}
labels["soil science"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sound"] = {
Wiktionary = "sound#Noun",
topical_categories = true,
}
labels["sound engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["South Korean idol fandom"] = {
aliases = {"Korean idol fandom", "Korean idol"},
display = "[[South Korean]] [[idol]] [[fandom]]",
topical_categories = true,
}
labels["South Park"] = {
display = "''[[w:South Park|South Park]]''",
Wikipedia = true,
topical_categories = true,
}
labels["Soviet Union"] = {
aliases = {"USSR", "Soviet"},
Wiktionary = true,
topical_categories = true,
}
labels["space flight"] = {
aliases = {"spaceflight", "space travel"},
Wiktionary = true,
topical_categories = "Space",
}
labels["space science"] = {
aliases = {"space"},
Wiktionary = true,
topical_categories = "Space",
}
labels["Spanish politics"] = {
Wikipedia = "Politics of Spain",
topical_categories = true,
}
labels["spectroscopy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["speedrunning"] = {
aliases = {"speedrun", "speedruns"},
Wiktionary = true,
topical_categories = true,
}
labels["spinning"] = {
Wiktionary = true,
topical_categories = true,
}
labels["spiritualism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["sports"] = {
aliases = {"sport"},
Wiktionary = true,
topical_categories = true,
}
labels["square dancing"] = {
aliases = {"square dance"},
Wiktionary = true,
topical_categories = true,
}
labels["squash"] = {
Wikipedia = "Squash (sport)",
topical_categories = true,
}
labels["standard of identity"] = {
display = "[[standard of identity|standards of identity]]",
topical_categories = "Standards of identity",
}
labels["star"] = {
display = "[[astronomy]]",
topical_categories = "Stars",
}
labels["Star Wars"] = {
display = "''[[Star Wars]]''",
topical_categories = true,
}
labels["statistical mechanics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["statistics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["steroid"] = {
display = "[[biochemistry]]",
topical_categories = "Steroids",
}
labels["steroid hormone"] = {
aliases = {"steroid drug"},
display = "[[biochemistry]], [[steroids]]",
topical_categories = "Hormones",
}
labels["stock market"] = {
Wiktionary = true,
topical_categories = true,
}
labels["stock ticker symbol"] = {
aliases = {"stock symbol"},
Wiktionary = true,
topical_categories = "Stock symbols for companies",
}
labels["string instruments"] = {
aliases = {"string instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["subculture"] = {
Wiktionary = true,
topical_categories = "Culture",
}
labels["Sufism"] = {
aliases = {"Sufi Islam"},
Wikipedia = true,
topical_categories = true,
}
labels["sugar acid"] = {
display = "[[organic chemistry]]",
topical_categories = "Sugar acids",
}
labels["sumo"] = {
Wiktionary = true,
topical_categories = true,
}
labels["supply chain"] = {
Wiktionary = true,
topical_categories = true,
}
labels["surface feature"] = {
display = "[[planetology]]",
topical_categories = "Planetary nomenclature",
}
labels["surfing"] = {
aliases = {"surf"},
Wiktionary = "surfing#Noun",
topical_categories = true,
}
labels["surgery"] = {
Wiktionary = true,
topical_categories = true,
}
labels["surveying"] = {
Wiktionary = "surveying#Noun",
topical_categories = true,
}
labels["sushi"] = {
Wiktionary = true,
topical_categories = true,
}
labels["swimming"] = {
Wiktionary = "swimming#Noun",
topical_categories = true,
}
labels["Swiss politics"] = {
Wikipedia = "Politics of Switzerland",
topical_categories = true,
}
labels["swords"] = {
display = "[[sword]]s",
topical_categories = true,
}
labels["syntax"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Syriac Orthodoxy"] = {
aliases = {"Syriac Orthodox", "Syriac Orthodox Church"},
Wikipedia = true,
topical_categories = true,
}
labels["systematic chemical element symbol"] = {
display = "[[chemistry]]",
plain_categories = "Systematic chemical element symbols",
}
labels["systematics"] = {
Wiktionary = true,
topical_categories = "Taxonomy",
}
labels["systems engineering"] = {
Wiktionary = true,
topical_categories = true,
}
labels["systems theory"] = {
Wiktionary = true,
topical_categories = true,
}
labels["table tennis"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Taoism"] = {
aliases = {"Daoism"},
Wiktionary = true,
topical_categories = true,
}
labels["tarot"] = {
Wiktionary = true,
topical_categories = "Cartomancy",
}
labels["taxation"] = {
aliases = {"tax", "taxes"},
Wiktionary = true,
topical_categories = true,
}
labels["taxonomic name"] = {
display = "[[taxonomy]]",
topical_categories = "Taxonomic names",
}
labels["taxonomy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["technology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["telecommunications"] = {
aliases = {"telecommunication", "telecom"},
Wiktionary = true,
topical_categories = true,
}
labels["telegraphy"] = {
Wiktionary = true,
topical_categories = true,
}
labels["telephony"] = {
aliases = {"telephone", "telephones"},
Wiktionary = true,
topical_categories = true,
}
labels["television"] = {
aliases = {"TV"},
Wiktionary = true,
topical_categories = true,
}
labels["tennis"] = {
Wiktionary = true,
topical_categories = true,
}
labels["teratology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Tetris"] = {
Wiktionary = true,
topical_categories = true,
}
labels["textiles"] = {
Wiktionary = true,
topical_categories = true,
}
labels["textual criticism"] = {
Wiktionary = true,
topical_categories = true,
}
labels["theater"] = {
aliases = {"theatre"},
Wiktionary = true,
topical_categories = true,
}
labels["theology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["thermodynamics"] = {
Wiktionary = true,
topical_categories = true,
}
labels["Thracian god"] = {
aliases = {"Thracian goddess", "Thracian deity"},
display = "[[w:Thracian religion|Thracian religion]]",
Wikipedia = "Thracian religion",
topical_categories = "Thracian deities",
}
labels["Tibetan Buddhism"] = {
Wiktionary = true,
topical_categories = "Buddhism",
}
labels["tiddlywinks"] = {
Wiktionary = true,
topical_categories = true,
}
labels["TikTok aesthetic"] = {
display = "[[TikTok]] aesthetic",
topical_categories = "Aesthetics",
}
labels["timber industry"] = {
aliases = {"timber", "wood industry", "lumber industry", "lumber", "logging"},
Wikipedia = true,
topical_categories = true,
}
labels["time"] = {
Wiktionary = true,
topical_categories = true,
}
labels["tincture"] = {
display = "[[heraldry]]",
topical_categories = "Heraldic tinctures",
}
labels["topology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["tort law"] = {
Wiktionary = true,
topical_categories = "Law",
}
labels["tourism"] = {
aliases = {"tourist"},
Wiktionary = true,
topical_categories = true,
}
labels["toxicology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["trading"] = {
aliases = {"trade"},
Wiktionary = "trading#Noun",
topical_categories = true,
}
labels["trading cards"] = {
display = "[[trading card]]s",
topical_categories = true,
}
labels["traditional Chinese medicine"] = {
aliases = {"TCM", "Chinese medicine"},
Wiktionary = true,
topical_categories = true,
}
labels["traditional Korean medicine"] = {
aliases = {"Korean medicine"},
topical_categories = true,
}
labels["transgender"] = {
aliases = {"trans"},
Wiktionary = true,
topical_categories = true,
}
labels["translation studies"] = {
Wiktionary = true,
topical_categories = true,
}
labels["transport"] = {
aliases = {"transportation"},
Wiktionary = true,
topical_categories = true,
}
labels["traumatology"] = {
Wiktionary = true,
topical_categories = "Emergency medicine",
}
labels["travel"] = {
aliases = {"travelling"},
Wiktionary = true,
topical_categories = true,
}
labels["trigonometric function"] = {
display = "[[trigonometry]]",
topical_categories = "Trigonometric functions",
}
labels["trigonometry"] = {
Wiktionary = true,
topical_categories = true,
}
labels["trust law"] = {
Wiktionary = true,
topical_categories = "Law",
}
labels["Tumblr aesthetic"] = {
display = "[[Tumblr]] [[aesthetic]]",
topical_categories = "Aesthetics",
}
labels["Twitter"] = {
aliases = {"twitter", "X"},
Wiktionary = "Twitter#Proper noun",
topical_categories = true,
}
labels["two-up"] = {
Wiktionary = true,
topical_categories = true,
}
labels["typography"] = {
aliases = {"typesetting"},
Wiktionary = true,
topical_categories = true,
}
labels["ufology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["UK politics"] = {
Wikipedia = "Politics of the United Kingdom",
topical_categories = true,
}
labels["Umbanda"] = {
Wiktionary = true,
topical_categories = true,
}
labels["underwater diving"] = {
aliases = {"scuba", "scuba diving"},
display = "[[underwater]] [[diving#Noun|diving]]",
topical_categories = true,
}
labels["Unicode"] = {
aliases = {"Unicode standard"},
Wikipedia = true,
topical_categories = true,
}
labels["United Nations"] = {
aliases = {"UN"},
display = "[[United Nations|UN]]",
Wikipedia = true,
topical_categories = true,
}
labels["Unix"] = {
Wiktionary = true,
topical_categories = true,
}
labels["urban studies"] = {
aliases = {"urbanism", "urban planning"},
Wiktionary = true,
topical_categories = true,
}
labels["urology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["US politics"] = {
Wikipedia = "Politics of the United States",
topical_categories = true,
}
labels["Usenet"] = {
aliases = {"newsgroup"},
Wiktionary = true,
topical_categories = true,
}
labels["Vaishnavism"] = {
aliases = {"Vaishnavist"},
Wiktionary = true,
topical_categories = true,
}
labels["Valentinianism"] = {
aliases = {"valentinianism", "Valentinianist", "valentinianist"},
Wikipedia = true,
topical_categories = true,
}
labels["Vedic religion"] = {
aliases = {"Vedic Hinduism", "Vedism", "Vedicism", "Ancient Hinduism", "ancient Hinduism"},
Wikipedia = "Historical Vedic religion",
topical_categories = true,
}
labels["vegetable"] = {
aliases = {"vegetables"},
Wiktionary = true,
topical_categories = "Vegetables",
}
labels["vehicles"] = {
aliases = {"vehicle"},
display = "[[vehicle]]s",
topical_categories = true,
}
labels["Venezuelan politics"] = {
aliases = {"Venezuela politics"},
Wikipedia = "Politics of Venezuela",
topical_categories = true,
}
labels["veterinary disease"] = {
display = "[[veterinary medicine]]",
topical_categories = "Veterinary diseases",
}
labels["veterinary medicine"] = {
aliases = {"veterinary", "vet"},
Wiktionary = true,
topical_categories = true,
}
labels["video compression"] = {
Wikipedia = true,
topical_categories = true,
}
labels["video game genre"] = {
display = "[[video game]]s",
topical_categories = "Video game genres",
}
labels["video games"] = {
aliases = {"video game", "video gaming"},
display = "[[video game]]s",
topical_categories = true,
}
labels["virology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["virus"] = {
display = "[[virology]]",
topical_categories = "Viruses",
}
labels["vitamin"] = {
display = "[[biochemistry]]",
topical_categories = "Vitamins",
}
labels["viticulture"] = {
Wiktionary = true,
topical_categories = {"Horticulture", "Wine"},
}
labels["volcanology"] = {
aliases = {"vulcanology"},
Wiktionary = true,
topical_categories = true,
}
labels["volleyball"] = {
Wiktionary = true,
topical_categories = true,
}
labels["voodoo"] = {
Wiktionary = true,
topical_categories = true,
}
labels["VTuber"] = {
aliases = {"Virtual YouTuber"},
Wiktionary = true,
topical_categories = "Virtual YouTuber",
}
labels["war"] = {
aliases = {"warfare"},
Wiktionary = true,
topical_categories = true,
}
labels["water sports"] = {
aliases = {"watersport", "watersports", "water sport"},
Wiktionary = "watersport",
topical_categories = true,
}
labels["watercraft"] = {
display = "[[nautical]]",
topical_categories = true,
}
labels["weaponry"] = {
aliases = {"weapon", "weapons"},
Wiktionary = true,
topical_categories = "Weapons",
}
labels["weather"] = {
topical_categories = true,
}
labels["weaving"] = {
Wiktionary = "weaving#Noun",
topical_categories = true,
}
labels["web design"] = {
Wiktionary = true,
topical_categories = true,
aliases = {"Web design"}
}
labels["web development"] = {
Wiktionary = true,
topical_categories = {"Programming", "Web design"},
}
labels["weightlifting"] = {
Wiktionary = true,
topical_categories = true,
}
labels["white supremacy"] = { -- Often used to indicate Nazi-used jargon; compare "neo-Nazism"
aliases = {"white nationalism", "white nationalist", "white power", "white racism", "white supremacist ideology", "white supremacism", "white supremacist"},
Wikipedia = true,
topical_categories = "White supremacist ideology",
}
labels["Wicca"] = {
Wiktionary = true,
topical_categories = true,
}
labels["wiki jargon"] = {
aliases = {"wiki", "wikis"},
display = "[[wiki]] [[jargon]]",
topical_categories = "Wiki",
}
labels["Wikimedia jargon"] = {
aliases = {
"Wikimedia", "Wiktionary", "Wiktionary jargon", "Wikipedia", "Wikipedia jargon",
"WMF", "WMF jargon" -- technically not correct
},
display = "[[w:Wikimedia movement|Wikimedia]] [[jargon]]",
topical_categories = "Wikimedia",
}
labels["wind instruments"] = {
aliases = {"wind instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["wine"] = {
aliases = {"oenology", "winemaking"},
Wiktionary = true,
topical_categories = true,
}
labels["winter sports"] = {
display = "[[winter sport]]s",
topical_categories = true,
}
labels["woodwind instruments"] = {
aliases = {"woodwind instrument"},
display = "[[music]]",
topical_categories = true,
}
labels["woodworking"] = {
Wiktionary = true,
topical_categories = true,
}
labels["World War I"] = {
aliases = {"World War 1", "WWI", "WW I", "WW1", "WW 1"},
Wikipedia = true,
topical_categories = true,
}
labels["World War II"] = {
aliases = {"World War 2", "WWII", "WW II", "WW2", "WW 2"},
Wikipedia = true,
topical_categories = true,
}
labels["wrestling"] = {
Wiktionary = "wrestling#Noun",
topical_categories = true,
}
labels["writing"] = {
Wiktionary = "writing#Noun",
topical_categories = true,
}
labels["xiangqi"] = {
aliases = {"Chinese chess"},
Wiktionary = true,
topical_categories = true,
}
labels["Yazidism"] = {
aliases = {"Yezidism"},
Wiktionary = true,
topical_categories = true,
}
labels["yoga"] = {
Wiktionary = true,
topical_categories = true,
}
labels["yoga pose"] = {
aliases = {"asana"},
display = "[[yoga]]",
topical_categories = "Yoga poses",
}
labels["zodiac constellations"] = {
display = "[[astronomy]]",
topical_categories = "Constellations in the zodiac",
}
labels["zoology"] = {
Wiktionary = true,
topical_categories = true,
}
labels["zootomy"] = {
Wiktionary = true,
topical_categories = "Animal body parts",
}
labels["Zoroastrianism"] = {
Wiktionary = true,
topical_categories = true,
}
-- Deprecated/do not use warning (ambiguous, unsuitable etc)
labels["deprecated label"] = {
aliases = {"emergency", "greekmyth", "industry", "morphology", "musici", "quantum", "vector"},
display = "<span style=\"color:var(--wikt-palette-red,red);\"><b>deprecated label</b></span>",
deprecated = true,
}
return require("Module:labels").finalize_data(labels)
o4s2izs1xzb9qh6y7aalgyei7zhwnvh
साँचा:code
10
302285
487770
478870
2026-09-02T16:37:53Z
SM7
6218
updating...
487770
wikitext
text/x-wiki
{{#invoke:code|show}}<noinclude>{{documentation}}</noinclude>
elz92n6wosc3vfz1cu3dkycgrq2rkrh
मॉड्यूल:category tree
828
302327
487856
487701
2026-09-02T20:37:11Z
SM7
6218
सुधार टेस्ट
487856
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local category_tree_submodule_prefix = "Module:category tree/"
local category_tree_styles_css = "Module:category tree/styles.css"
local m_str_utils = require("Module:string utilities")
local m_template_parser = require("Module:template parser")
local m_utilities = require("Module:utilities")
local ceil = math.ceil
local class_else_type = m_template_parser.class_else_type
local concat = table.concat
local deep_copy = require("Module:table").deepCopy
local full_url = mw.uri.fullUrl
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local log10 = math.log10 or require("Module:math").log10
local new_title = mw.title.new
local pages_in_category = mw.site.stats.pagesInCategory
local parse = m_template_parser.parse
local remove_comments = require("Module:string/removeComments")
local sort = table.sort
local split = m_str_utils.split
local string_compare = require("Module:string/compare")
local trim = m_str_utils.trim
local uupper = m_str_utils.upper
local yesno = require("Module:yesno")
local current_frame = mw.getCurrentFrame()
local current_title = mw.title.getCurrentTitle()
local namespace = current_title.namespace
local poscatboiler_subsystem = "poscatboiler"
local extra_args_error = "Extra arguments to {{((}}auto cat{{))}} are not allowed for this category."
-- Generates a sortkey for a numeral `n`, adding leading zeroes to avoid the "1, 10, 2, 3" sorting problem. `max_n` is the greatest expected value of `n`, and is used to determine how many leading zeroes are needed. If not supplied, it defaults to the number of languages.
function export.numeral_sortkey(n, max_n)
max_n = max_n or require("Module:list of languages").count()
return ("#%%0%dd"):format(ceil(log10(max_n + 1))):format(n)
end
function export.split_lang_label(title_text)
local getByCanonicalName = require("Module:languages").getByCanonicalName
-- Progressively remove a word from the potential canonical name until it
-- matches an actual canonical name.
local words = split(title_text, " ", true)
for i = #words - 1, 1, -1 do
local lang = getByCanonicalName(concat(words, " ", 1, i))
if lang then
return lang, concat(words, " ", i + 1)
end
end
return nil, title_text
end
local function show_error(text, title)
return require("Module:message box").maintenance(
"red",
"[[File:Codex icon Alert red.svg|40px|alt=alert]]",
title or "This category is not defined in Wiktionary's category tree.",
text
)
end
local function error_not_in_category_tree()
error(
"This category is not defined in Wiktionary's category tree. "
.. "Double-check the category name for typos. "
.. "Search existing categories or request definition at [[Wiktionary:Category and label treatment requests|WT:CLTR]]. "
.. "Affected category: " .. current_title.fullText,
2
)
end
-- Show the text that goes at the very top right of the page.
local function show_topright(current)
return current.getTopright and current:getTopright() or nil
end
local function link_box(content)
return ("<div class=\"noprint plainlinks\" style=\"float: right; clear: both; margin: 0 0 .5em 1em; background: var(--wikt-palette-paleblue, #f9f9f9); border: 1px var(--border-color-base, #aaaaaa) solid; margin-top: -1px; padding: 5px; font-weight: bold;\">%s</div>"):format(content)
end
local function show_editlink(current)
return link_box(("[%s Edit category data]"):format(tostring(full_url(current:getDataModule(), "action=edit"))))
end
local function show_related_changes()
local title = current_title.fullText
return link_box(("[%s <span title=\"Recent edits and other changes to pages in %s\">Recent changes</span>]"):format(
tostring(full_url("Special:RecentChangesLinked", {
target = title,
showlinkedto = 0,
})),
title
))
end
local function show_pagelist(current)
local namespace = "namespace="
local info = current:getInfo()
local lang_code = info.code
if info.label == "citations" or info.label == "citations of undefined terms" then
namespace = namespace .. "Citations"
elseif lang_code then
local lang = require("Module:languages").getByCode(lang_code, true, true)
if lang then
-- Proto-Norse (gmq-pro) is probably the only language with a code ending in -pro
-- that's intended to have mostly non-reconstructed entries.
if (lang_code:find("%-pro$") and lang_code ~= "gmq-pro") or lang:hasType("reconstructed") then
namespace = namespace .. "विक्षनरी"
elseif lang:hasType("appendix-constructed") then
namespace = namespace .. "विक्षनरी"
end
end
elseif info.label:match("templates") then
namespace = namespace .. "साँचा"
elseif info.label:match("modules") then
namespace = namespace .. "Module"
elseif info.label:match("^विक्षनरी") or info.label:match("^Pages") then
namespace = ""
end
return ([=[
{| id="newest-and-oldest-pages" class="wikitable mw-collapsible" style="float: right; clear: both; margin: 0 0 .5em 1em;"
! Newest and oldest pages
|-
| id="recent-additions" style="font-size:0.9em;" | '''Newest pages ordered by last [[mw:Manual:Categorylinks table#cl_timestamp|category link update]]:'''
%s
|-
| id="oldest-pages" style="font-size:0.9em;" | '''Oldest pages ordered by last edit:'''
%s
|}]=]):format(
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=categoryadd
order=descending]=]
):format(current_title.text, namespace)
),
current_frame:extensionTag(
"DynamicPageList",
([=[
category=%s
%s
count=10
mode=ordered
ordermethod=lastedit
order=ascending]=]
):format(current_title.text, namespace)
)
)
end
-- Show navigational "breadcrumbs" at the top of the page.
local function show_breadcrumbs(current)
local steps = {}
-- Start at the current label and move our way up the "chain" from child to parent, until we can't go further.
while current do
local category, display_name, nocap
if type(current) == "string" then
category = current
display_name = current:gsub("^श्रेणी:", "")
else
if not current.getCategoryName then
error("Internal error: Bad format in breadcrumb chain structure, probably a misformatted value for `parents`: " ..
mw.dumpObject(current))
end
category = "श्रेणी:" .. current:getCategoryName()
display_name, nocap = current:getBreadcrumbName()
end
if not nocap then
display_name = mw.getContentLanguage():ucfirst(display_name)
end
insert(steps, 1, ("[[:%s|%s]]"):format(category, display_name))
-- Move up the "chain" by one level.
if type(current) == "string" then
current = nil
else
current = current:getParents()
end
if current then
current = current[1].name
end
end
local templateStyles = require("Module:TemplateStyles")(category_tree_styles_css)
local ol = mw.html.create("ol")
for i, step in ipairs(steps) do
local li = mw.html.create("li")
if i ~= 1 then
local span = mw.html.create("span")
:attr("aria-hidden", "true")
:addClass("ts-categoryBreadcrumbs-separator")
:wikitext(" » ")
li:node(span)
end
li:wikitext(step)
ol:node(li)
end
return templateStyles .. tostring(mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-categoryBreadcrumbs")
:node(ol))
end
local function show_also(current)
local also = current._info.also
if also and #also > 0 then
return ('<div style="margin-top:-1em;margin-bottom:1.5em">%s</div>'):format(require("Module:also").main(also))
end
return nil
end
-- Show a short description text for the category.
local function show_description(current)
return current.getDescription and current:getDescription() or nil
end
local function show_appendix(current)
local appendix = current.getAppendix and current:getAppendix()
return appendix and ("For more information, see [[%s]]."):format(appendix) or nil
end
local function sort_children(child1, child2)
return string_compare(uupper(child1.sort), uupper(child2.sort))
end
-- Show a list of child categories.
local function show_children(current)
local children = current.getChildren and current:getChildren() or nil
if not children then
return nil
end
sort(children, sort_children)
local children_list = {}
for _, child in ipairs(children) do
local child_name, child_pagetitle = child.name
if type(child_name) == "string" then
child_pagetitle = child_name
else
child_pagetitle = "श्रेणी:" .. child_name:getCategoryName()
end
if new_title(child_pagetitle).exists then
insert(children_list, ("* [[:%s]]: %s"):format(
child_pagetitle,
child.description or
type(child_name) == "string" and child_name:gsub("^श्रेणी:", "") .. "." or
child_name:getDescription("child")
))
end
end
return concat(children_list, "\n")
end
-- Show a table of contents with links to each letter in the language's script.
local function show_TOC(current)
local titleText = current_title.text
local inCategoryPages = pages_in_category(titleText, "pages")
local inCategorySubcats = pages_in_category(titleText, "subcats")
local TOC_type
-- Compute type of table of contents required.
if inCategoryPages > 2500 or inCategorySubcats > 2500 then
TOC_type = "full"
elseif inCategoryPages > 200 or inCategorySubcats > 200 then
TOC_type = "normal"
else
-- No (usual) need for a TOC if all pages or subcategories can fit on one page;
-- but allow this to be overridden by a custom TOC handler.
TOC_type = "none"
end
if current.getTOC then
local TOC_text = current:getTOC(TOC_type)
if TOC_text ~= true then
return TOC_text or nil
end
end
if TOC_type ~= "none" then
local templatename = current:getTOCTemplateName()
local TOC_template
if TOC_type == "full" then
-- This category is very large, see if there is a "full" version of the TOC.
local TOC_template_full = new_title(templatename .. "/full")
if TOC_template_full.exists then
TOC_template = TOC_template_full
end
end
if not TOC_template then
local TOC_template_normal = new_title(templatename)
if TOC_template_normal.exists then
TOC_template = TOC_template_normal
end
end
if TOC_template then
return current_frame:expandTemplate{title = TOC_template.text, args = {}}
end
end
return nil
end
-- Show the "catfix" that adds language attributes and script classes to the page.
local function show_catfix(current)
local lang, sc = current:getCatfixInfo()
return lang and m_utilities.catfix(lang, sc) or nil
end
-- Show the parent categories that the current category should be placed in.
local function show_categories(current, categories)
local parents = current.getParents and current:getParents() or nil
if not parents then
return nil
end
for _, parent in ipairs(parents) do
local parent_name = parent.name
local sortkey = type(parent.sort) == "table" and parent.sort:makeSortKey() or parent.sort
if type(parent_name) == "string" then
insert(categories, ("[[%s|%s]]"):format(parent_name, sortkey))
else
insert(categories, ("[[श्रेणी:%s|%s]]"):format(parent_name:getCategoryName(), sortkey))
end
end
-- Also put the category in its corresponding "umbrella" or "by language" category.
local umbrella = current:getUmbrella()
if umbrella then
-- FIXME: use a language-neutral sorting function like the Unicode Collation Algorithm.
local sortkey = current._lang and current._lang:getCanonicalName() or current:getCategoryName()
sortkey = require("Module:languages").getByCode("en", true):makeSortKey(sortkey)
if type(umbrella) == "string" then
insert(categories, ("[[%s|%s]]"):format(umbrella, sortkey))
else
insert(categories, ("[[श्रेणी:%s|%s]]"):format(umbrella:getCategoryName(), sortkey))
end
end
-- Check for various unwanted parser functions, which should be integrated into the category tree data instead.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
local content = current_title:getContent()
if not content then
-- This happens when using [[Special:ExpandTemplates]] to call {{auto cat}} on a nonexistent category page,
-- which is needed by Benwing's create_wanted_categories.py script.
return
end
local defaultsort, displaytitle, page_has_param
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "template" then
local name = node:get_name()
if name == "DEFAULTSORT:" and not defaultsort then
insert(categories, "[[Category:Pages with DEFAULTSORT conflicts]]")
defaultsort = true
elseif name == "DISPLAYTITLE:" and not displaytitle then
insert(categories,"[[Category:Pages with DISPLAYTITLE conflicts]]")
displaytitle = true
end
elseif node_class == "parameter" and not page_has_param then
insert(categories,"[[Category:Pages with raw triple-brace template parameters]]")
page_has_param = true
end
end
-- Check for raw category markup, which should also be integrated into the category tree data.
content = remove_comments(content, "BOTH")
local head = content:find("[[", 1, true)
while head do
local close = content:find("]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = content:find("[[", head + 2, true)
while open and open < close do
head = open
open = content:find("[[", head + 2, true)
end
local cat = content:sub(head + 2, close - 1)
local colon = cat:match("^[ _\128-\244]*[श्रेणी _\128-\244]*():")
if colon then
local pipe = cat:find("|", colon + 1, true)
if pipe ~= #cat then
local title = new_title(pipe and cat:sub(1, pipe - 1) or cat)
if title and title.namespace == 14 then
insert(categories,"[[Category:Categories with categories using raw markup]]")
break
end
end
end
head = open
end
end
local function generate_output(current)
if current then
for _, functionName in pairs{
"getBreadcrumbName",
"getDataModule",
"canBeEmpty",
"getDescription",
"getParents",
"getChildren",
"getUmbrella",
"getAppendix",
"getTOCTemplateName",
} do
if not is_callable(current[functionName]) then
require("Module:debug").track{"category tree/missing function", "category tree/missing function/" .. functionName}
end
end
end
local boxes, display, categories = {}, {}, {}
-- Categories should never show files as a gallery.
insert(categories, "__NOGALLERY__")
if current_frame:getParent():getTitle() == "साँचा:auto cat" then
insert(categories, "[[Category:Categories calling Template:auto cat]]")
end
-- Check if the category is empty
local totalPages = pages_in_category(current_title.text, "all")
local hugeCategory = totalPages > 1000000 -- 1 million
-- Categorize huge categories, as they cause DynamicPageList to time out and make the category inaccessible.
if hugeCategory then
insert(categories, "[[Category:Huge categories]]")
end
-- Are the parameters valid?
if not current then
-- Signal failure so export.show can try the next handler.
return nil, true
end
-- Does the category have the correct name?
local currentName = current:getCategoryName()
local correctName = current_title.text == currentName
if not correctName then
insert(categories, "[[श्रेणी:Categories with incorrect names]]")
insert(display, show_error(
("Based on the data in the category tree, this category should be called '''[[:श्रेणी:%s]]'''."):format(currentName),
"इस श्रेणी में कोई ग़लत नाम है।"
))
end
-- Add cleanup category for empty categories.
local canBeEmpty = current:canBeEmpty()
if canBeEmpty and correctName then
insert(categories, " __EXPECTUNUSEDCATEGORY__")
elseif totalPages == 0 then
insert(categories, "[[Category:Empty categories]]")
end
if current:isHidden() then
insert(categories, " __HIDDENCAT__")
end
-- Put all the float-right stuff into a <div> that does not clear, so that float-left stuff like the breadcrumbs and
-- description can go opposite the float-right stuff without vertical space.
insert(boxes, "<div style=\"float: right;\">")
insert(boxes, show_topright(current))
insert(boxes, show_editlink(current))
insert(boxes, show_related_changes())
-- Show pagelist, unless it's a huge category (since they can't use DynamicPageList - see above).
if not hugeCategory then
insert(boxes, show_pagelist(current))
end
insert(boxes, "</div>")
-- Generate the displayed information
insert(display, show_breadcrumbs(current))
insert(display, show_also(current))
insert(display, show_description(current))
insert(display, show_appendix(current))
insert(display, show_children(current))
insert(display, show_TOC(current))
insert(display, show_catfix(current))
insert(display, '<br class="clear-both-in-vector-2022-only">')
show_categories(current, categories)
return concat(boxes, "\n") .. "\n" .. concat(display, "\n\n") .. concat(categories, "")
end
--[==[
List of handler functions that try to match the page name. A handler should return the name of a submodule to
[[Module:category tree]] and an info table which is passed as an argument to the submodule. If a handler does not
recognize the page name, it should return nil. Note that the order of handlers matters!
]==]
local handlers = {}
-- Thesaurus per-language category
insert(handlers, function(title)
local code, label = title:match("^विक्षनरी:(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Topic per-language category
insert(handlers, function(title)
local code, label = title:match("^(%l[%a-]*%a):(.+)")
if code then
return poscatboiler_subsystem, {label = title, raw = true}
end
end)
-- Lect category e.g. for [[:Category:New Zealand English]] or [[:Category:Issime Walser]]
insert(handlers, function(title, args)
local lect = args.lect or args.dialect
if lect ~= "" and yesno(lect, true) then -- Same as boolean in [[Module:parameters]].
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end
end)
-- poscatboiler per-language label, e.g. [[Category:English non-lemma forms]]
insert(handlers, function(title, args)
local lang, label = export.split_lang_label(title)
if not lang then
return
end
local baseLabel, script = label:match("(.+) in (.-)$")
if script and baseLabel ~= "टर्म" then
local scriptObj = require("Module:scripts").getByCategoryName(script)
if scriptObj then
return poscatboiler_subsystem, {label = baseLabel, code = lang:getCode(), sc = scriptObj:getCode(), args = args}
end
end
return poscatboiler_subsystem, {label = label, code = lang:getCode(), args = args}
end)
-- poscatboiler label umbrella category
insert(handlers, function(title, args)
local label = title:match("(.+) भाषा अनुसार$")
if label then
-- The poscatboiler code will appropriately lowercase if needed.
return poscatboiler_subsystem, {label = label, args = args}
end
end)
-- poscatboiler raw handlers
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args, raw = true}
end)
-- poscatboiler umbrella handlers without 'by language'
insert(handlers, function(title, args)
return poscatboiler_subsystem, {label = title, args = args}
end)
function export.show(frame)
local args, other_args = require("Module:parameters").process(frame:getParent().args, {
["also"] = {type = "title", sublist = "comma without whitespace", namespace = 14}
}, true)
if args.also then
for k, arg in next, args.also do
args.also[k] = arg.prefixedText
end
end
for k, arg in next, other_args do
other_args[k] = trim(arg)
end
if namespace == 10 then -- Template
return "(यह साँचा [[Help:Namespaces#Category|श्रेणी:]] नामस्थान में स्थित पृष्ठ पर प्रयोग किया जाना चाहिये।)"
elseif namespace ~= 14 then -- Category
error("यह साँचा/मॉड्यूल केवल [[mw:Help:Namespaces#Category|श्रेणी:]] नामस्थान में प्रयोग में लाया जा सकता है।")
end
local saw_tree_lookup_failure = false
local failure_consumed_args = false
-- Go through each handler in turn. If a handler doesn't recognize the format of the category, it will return nil,
-- and we will consider the next handler. Otherwise, it returns a template name and arguments to call it with, but
-- even then, that template might return an error, and we need to consider the next handler. This happens, for
-- example, with the category "CAT:Mato Grosso, Brazil", where "Mato" is the name of a language, so the poscatboiler
-- per-language label handler fires and tries to find a label "Grosso, Brazil". This throws an error, and
-- previously, this blocked further handler consideration, but now we check for the error and continue checking
-- handlers; eventually, the topic umbrella handler will fire and correctly handle the category.
for _, handler in ipairs(handlers) do
-- Use a new title object and args table for each handler, to keep them isolated.
local submodule, info = handler(current_title.text, deep_copy(other_args))
if submodule then
info.also = deep_copy(args.also)
require("Module:debug").track("auto cat/" .. submodule)
-- `failed` is true if no match was found in the category tree.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
saw_tree_lookup_failure = true
failure_consumed_args = failure_consumed_args or not not info.args
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- No handler produced a valid category-tree match.
-- Preserve previous behavior: if no failing handler consumed args, surface extra-arg errors first.
if saw_tree_lookup_failure and not failure_consumed_args and next(other_args) then
error(extra_args_error)
end
error_not_in_category_tree()
end
-- TODO: new test entrypoint.
return export
ia7nzbei6nzouh7ygyhpoosr8rgpefn
मॉड्यूल:category tree/data
828
302328
487804
487713
2026-09-02T18:58:29Z
SM7
6218
कुछ submodule का प्रयोग फिलहाल रोका गया
487804
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local subpages = {
-- It should not matter much what order we do the handlers in, but topic handling historically
-- preceded "poscatboiler" handling (i.e. everything else), so keep it that way for the moment.
-- "विषय",
-- "affixes and compounds",
-- "वर्ण",
"प्रविष्टि रखरखाव",
"व्युत्पत्ति",
"परिवार",
-- "figures of speech",
-- "grammatical classes",
-- "lang-specific-raw",
"भाषाएँ",
-- "लेक्ट",
"लेम्मा",
-- "lexical properties",
-- "miscellaneous",
-- "मॉड्यूल",
"नाम",
-- "गैर-लेम्मा रूप",
-- "phrases",
-- "pragmatic properties",
-- "तुक",
"लिपियाँ",
-- "semantic classes",
-- "shortenings",
-- "speech acts",
-- "चिह्न",
"साँचे",
--"टर्म लिपि अनुसार",
-- "ट्रांसलिट्रेशन",
-- "युनिकोड",
-- "विक्षनरी",
"विक्षनरी रखरखाव",
-- "विक्षनरी सदस्य'",
-- "wiktionary votes",
-- "word of the day",
"हेडवर्ड",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "Module:category tree/" .. subpage
local retval = require(datamodule)
if retval["LABELS"] then
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
error("लेबल " .. label .. " जिसे [["
.. datamodule .. "]] और [[" .. labels[label].module .. "]] दोनों में परिभाषित किया गया है।")
end
data.module = datamodule
labels[label] = data
end
end
if retval["RAW_CATEGORIES"] then
for category, data in pairs(retval["RAW_CATEGORIES"]) do
if raw_categories[category] and not retval["IGNOREDUP"] then
error("प्रारूपहीन श्रेणी " .. category .. " जिसे [["
.. datamodule .. "]] और [[" .. raw_categories[category].module .. "]] दोनों में परिभाषित किया गया है।")
end
data.module = datamodule
raw_categories[category] = data
end
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
if retval["RAW_HANDLERS"] then
for _, handler in ipairs(retval["RAW_HANDLERS"]) do
table.insert(raw_handlers, { module = datamodule, handler = handler })
end
end
end
-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
for key, data in pairs(hierarchy) do
local parents = data.parents
if parents then
if type(parents) ~= "table" then
parents = {parents}
end
if parents.name or parents.module then
parents = {parents}
end
for _, parent in ipairs(parents) do
if type(parent) ~= "table" or not parent.name and not parent.module then
parent = {name = parent}
end
if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^श्रेणी:") then
local parent_is_raw
if raw then
parent_is_raw = not parent.is_label
else
parent_is_raw = parent.raw
end
-- Don't do anything if the child is raw and the parent is lang-specific, otherwise e.g.
-- "Lemmas subcategories by language" will be listed as a child of every "LANG lemmas" category.
-- FIXME: We need to rethink this mechanism.
if not raw or parent_is_raw then
local child_hierarchy = parent_is_raw and raw_categories or labels
if child_hierarchy[parent.name] then
local child = {name = key, sort = parent.sort, raw = raw}
if child_hierarchy[parent.name].children then
table.insert(child_hierarchy[parent.name].children, child)
else
child_hierarchy[parent.name].children = {child}
end
end
end
end
end
end
end
end
add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)
return {
LABELS = labels, RAW_CATEGORIES = raw_categories,
HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}
805drj44oi06dmfy6voqjmxckv0x9r2
487827
487804
2026-09-02T19:28:48Z
SM7
6218
कुछ और subpage रोके
487827
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local subpages = {
-- It should not matter much what order we do the handlers in, but topic handling historically
-- preceded "poscatboiler" handling (i.e. everything else), so keep it that way for the moment.
-- "विषय",
-- "affixes and compounds",
-- "वर्ण",
"प्रविष्टि रखरखाव",
"व्युत्पत्ति",
"परिवार",
-- "figures of speech",
-- "grammatical classes",
-- "lang-specific-raw",
"भाषाएँ",
-- "लेक्ट",
"लेम्मा",
-- "lexical properties",
-- "miscellaneous",
-- "मॉड्यूल",
-- "नाम",
-- "गैर-लेम्मा रूप",
-- "phrases",
-- "pragmatic properties",
-- "तुक",
"लिपियाँ",
-- "semantic classes",
-- "shortenings",
-- "speech acts",
-- "चिह्न",
-- "साँचे",
--"टर्म लिपि अनुसार",
-- "ट्रांसलिट्रेशन",
-- "युनिकोड",
-- "विक्षनरी",
-- "विक्षनरी रखरखाव",
-- "विक्षनरी सदस्य'",
-- "wiktionary votes",
-- "word of the day",
"हेडवर्ड",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "Module:category tree/" .. subpage
local retval = require(datamodule)
if retval["LABELS"] then
for label, data in pairs(retval["LABELS"]) do
if labels[label] and not retval["IGNOREDUP"] then
error("लेबल " .. label .. " जिसे [["
.. datamodule .. "]] और [[" .. labels[label].module .. "]] दोनों में परिभाषित किया गया है।")
end
data.module = datamodule
labels[label] = data
end
end
if retval["RAW_CATEGORIES"] then
for category, data in pairs(retval["RAW_CATEGORIES"]) do
if raw_categories[category] and not retval["IGNOREDUP"] then
error("प्रारूपहीन श्रेणी " .. category .. " जिसे [["
.. datamodule .. "]] और [[" .. raw_categories[category].module .. "]] दोनों में परिभाषित किया गया है।")
end
data.module = datamodule
raw_categories[category] = data
end
end
if retval["HANDLERS"] then
for _, handler in ipairs(retval["HANDLERS"]) do
table.insert(handlers, { module = datamodule, handler = handler })
end
end
if retval["RAW_HANDLERS"] then
for _, handler in ipairs(retval["RAW_HANDLERS"]) do
table.insert(raw_handlers, { module = datamodule, handler = handler })
end
end
end
-- Add child categories to their parents
local function add_children_to_parents(hierarchy, raw)
for key, data in pairs(hierarchy) do
local parents = data.parents
if parents then
if type(parents) ~= "table" then
parents = {parents}
end
if parents.name or parents.module then
parents = {parents}
end
for _, parent in ipairs(parents) do
if type(parent) ~= "table" or not parent.name and not parent.module then
parent = {name = parent}
end
if parent.name and not parent.module and type(parent.name) == "string" and not parent.name:find("^श्रेणी:") then
local parent_is_raw
if raw then
parent_is_raw = not parent.is_label
else
parent_is_raw = parent.raw
end
-- Don't do anything if the child is raw and the parent is lang-specific, otherwise e.g.
-- "Lemmas subcategories by language" will be listed as a child of every "LANG lemmas" category.
-- FIXME: We need to rethink this mechanism.
if not raw or parent_is_raw then
local child_hierarchy = parent_is_raw and raw_categories or labels
if child_hierarchy[parent.name] then
local child = {name = key, sort = parent.sort, raw = raw}
if child_hierarchy[parent.name].children then
table.insert(child_hierarchy[parent.name].children, child)
else
child_hierarchy[parent.name].children = {child}
end
end
end
end
end
end
end
end
add_children_to_parents(labels)
add_children_to_parents(raw_categories, true)
return {
LABELS = labels, RAW_CATEGORIES = raw_categories,
HANDLERS = handlers, RAW_HANDLERS = raw_handlers
}
dfuqz8h4tn9b2ph4a0lzu49ctprh0yh
मॉड्यूल:category tree/poscatboiler
828
302330
487805
477906
2026-09-02T19:04:12Z
SM7
6218
updating...
487805
Scribunto
text/plain
local lang_independent_data = require("Module:category tree/data")
local lang_specific_module = "Module:category tree/lang"
local lang_specific_module_prefix = lang_specific_module .. "/"
local family_specific_module = "Module:category tree/fam"
local family_specific_module_prefix = family_specific_module .. "/"
local labels_utilities_module = "Module:labels/utilities"
local template_parser_module = "Module:template parser"
local concat = table.concat
local dump = mw.dumpObject
local expand_template = require("Module:frame").expandTemplate
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local lcfirst = require("Module:string utilities").lcfirst
local list_to_set = require("Module:table").listToSet
local make_title = mw.title.makeTitle
local new_title = mw.title.new
local parse = require(template_parser_module).parse
local sparse_concat = require("Module:table").sparseConcat
local tostring = tostring
local type = type
local ucfirst = require("Module:string utilities").ucfirst
local uupper = require("Module:string utilities").upper
local function internal_error(msg)
error("Internal error: " .. msg)
end
local function get_lang(...)
local _get_lang = require("Module:languages").getByCode
function get_lang(...)
return _get_lang(...) or require("Module:languages/errorGetBy").code(...)
end
return get_lang(...)
end
local function get_script(...)
local _get_script = require("Module:scripts").getByCode
function get_script(code)
return _get_script(code) or require("Module:languages/error")(code, true, "script code")
end
return get_script(...)
end
-- Category object
local Category = {}
Category.__index = Category
function Category:get_originating_info()
local originating_info = ""
if self._info.originating_label then
originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])"
end
return originating_info
end
local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"}
function Category.new(info)
for key in pairs(info) do
if not valid_keys[key] then
internal_error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
internal_error("No label was specified.")
end
self:initCommon()
if not self._data then
internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".")
end
return self
end
function Category:initCommon()
local function patch_args(args)
-- This fixes the issue with Scribunto automatically converting keys
-- in a table as numbers to strings, which in turn causes a circular
-- error for having argument parameter names as numbers as strings.
if type(args) ~= "table" then
return args
end
local new_args = {}
for k, v in pairs(args) do
if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then
new_args[tonumber(k)] = patch_args(v)
else
new_args[k] = patch_args(v)
end
end
return new_args
end
local args_handled = false
if self._info.raw then
-- Check if the category exists
local raw_categories = lang_independent_data["RAW_CATEGORIES"]
self._data = raw_categories[self._info.label]
if self._data then
if self._data.lang then
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
else
-- Go through raw handlers
local data = {
category = self._info.label,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if self._data then
-- Update the label if the handler specified a canonical name for it.
if self._data.canonical_name then
self._info.canonical_name = self._data.canonical_name
end
if self._data.lang then
if type(self._data.lang) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
end
end
else
-- Already parsed into language + label
if self._info.code then
self._lang = get_lang(self._info.code, nil, true)
else
self._lang = nil
end
if self._info.sc then
self._sc = get_script(self._info.sc)
else
self._sc = nil
end
self._info.orig_label = self._info.label
if not self._lang then
-- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be
-- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]];
-- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language
-- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella
-- categories, storing the original into `orig_label`, and correct it later if needed.
self._info.label = lcfirst(self._info.label)
end
-- First, check lang-specific labels and handlers if this is not an umbrella category.
if self._lang then
local objects_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
local object_specific_module_prefix = lang_specific_module_prefix
local is_family = false
repeat
if objects_with_modules[obj:getCode()] then
local module = object_specific_module_prefix .. obj:getCode()
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
self._data = labels_and_handlers.LABELS[self._info.label]
if self._data then
if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
end
end
if not self._data and labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if not is_family and self._data.umbrella == nil and
self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
seen[obj:getCode()] = true
obj = obj:getFamily()
if not is_family then
is_family = true
object_specific_module_prefix = family_specific_module_prefix
objects_with_modules = require(family_specific_module)
end
until not obj or seen[obj:getCode()]
end
local function fetch_label_data(labels)
self._data = labels[self._info.label]
-- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable
-- in umbrella categories.
if not self._data then
self._data = labels[self._info.orig_label]
if self._data then
self._info.label = self._info.orig_label
end
end
end
-- Then check lang-independent labels.
if not self._data then
-- lang_independent_data.LABELS should always exist.
fetch_label_data(lang_independent_data.LABELS)
if not self._data and not self._lang then
-- Check family-specific labels for umbrella label.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
fetch_label_data(labels_and_handlers.LABELS)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
end
end
-- Then check lang-independent handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if not self._data and not self._lang then
-- Check family-specific labels for umbrella handler.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
end
end
end
if not args_handled and self._data and self._info.args and next(self._info.args) then
local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])"
local args_text = {}
for k, v in pairs(self._info.args) do
insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v)))
end
error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " ..
concat(args_text, ", "))
end
if self._sc and not self._lang then
internal_error("Umbrella categories cannot have a script specified.")
end
end
function Category:convert_spec_to_string(desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc))
end
desc = desc {
lang = self._lang,
sc = self._sc,
label = self._info.label,
raw = self._info.raw,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc))
end
local function add_obj_args(args, obj, obj_type, sc_lang)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName(sc_lang)
args[obj_type .. "disp"] = obj:getDisplayForm(sc_lang)
args[obj_type .. "cat"] = obj:getCategoryName(false, sc_lang)
args[obj_type .. "link"] = obj:makeCategoryLink(sc_lang)
end
end
-- Expands `desc` like a template, passing values for specs like {{{langname}}}.
function Category:substitute_template_specs(desc)
-- This may end up happening twice but that's OK as the function is (usually) idempotent.
-- FIXME: Not idempotent if a preprocessed template returns wikicode.
desc = self:convert_spec_to_string(desc)
if not desc then
return nil
end
-- Populate the substitution arguments.
local args = {}
args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language."
args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic."
add_obj_args(args, self._lang, "lang")
add_obj_args(args, self._sc, "sc", self._lang)
return parse(desc, true):expand(args)
end
function Category:substitute_template_specs_in_args(args)
if not args then
return args
end
local pinfo = {}
for k, v in pairs(args) do
pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v)
end
return pinfo
end
function Category:make_new(info)
info.originating_label = self._info.label
info.originating_module = self._data.module
info.called_from_inside = true
return Category.new(info)
end
function Category:getBreadcrumbName()
local ret
if self._sc then
-- The parent of 'LANG POS in SCRIPT script' is always 'SCRIPT script' regardless of the parents normally set,
-- so the breadcrumb should always be 'POS' regardless of the breadcrumb normally set.
return self._info.label, nil
end
if self._lang or self._info.raw then
ret = self._data.breadcrumb or
self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base or
self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key or
nil
else
ret = self._data.umbrella and (self._data.umbrella.breadcrumb or
self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base or
self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or
nil
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
return self:substitute_template_specs(ret.name), ret.nocap
end
local function expand_toc_template_if(template)
local template_obj = new_title(template, 10)
if template_obj.exists then
return expand_template{title = template_obj.text}
end
return nil
end
-- Return the textual expansion of the first existing template among the given templates, first performing
-- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any).
-- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in,
-- treat it like a one-element list consisting of that string.
function Category:get_template_text(templates)
if templates == nil then
return nil
elseif type(templates) ~= "table" then
templates = {templates}
end
for _, template in ipairs(templates) do
if template == false then
return false
end
template = self:substitute_template_specs(template)
return expand_toc_template_if(template)
end
return nil
end
function Category:getTOC(toc_type)
-- Type "none" means everything fits on a single page; in that case, display nothing.
if toc_type == "none" then
return nil
end
local templates, fallback_templates
-- If TOC type is "full" (more than 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. look up and expand the `toc_template` templates (normal or umbrella, as above);
-- 3. do the default behavior, which is as follows:
-- 3a. look up a language-specific "full" template according to the current language (using English if there
-- is no current language);
-- 3b. look up a script-specific "full" template according to the first script of current language (using English
-- if there is no current language);
-- 3c. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 3d. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 3e. display nothing.
--
-- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. do the default behavior, which is as follows:
-- 2a. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 2b. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 2c. display nothing.
local data_source
if self._lang or self._info.raw then
data_source = self._data
else
data_source = self._data.umbrella
end
if data_source then
if toc_type == "full" then
templates = data_source.toc_template_full
fallback_templates = data_source.toc_template
else
templates = data_source.toc_template
end
end
local text = self:get_template_text(templates)
if text then
return text
elseif text == false then
return nil
end
text = self:get_template_text(fallback_templates)
if text then
return text
elseif text == false then
return nil
end
local default_toc_templates_to_check = {}
local lang, sc = self:getCatfixInfo()
local langcode = lang and lang:getCode() or "en"
local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn"
-- FIXME: What is toctemplateprefix used for?
local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC"
if toc_type == "full" then
insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname))
end
insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname))
for _, toc_template in ipairs(default_toc_templates_to_check) do
local toc_template_text = expand_toc_template_if(toc_template)
if toc_template_text then
return toc_template_text
end
end
return nil
end
function Category:getInfo()
return self._info
end
function Category:getDataModule()
return self._data.module
end
function Category:canBeEmpty()
if self._lang or self._info.raw then
return self._data.can_be_empty
end
return self._data.umbrella and self._data.umbrella.can_be_empty
end
function Category:isHidden()
if self._lang or self._info.raw then
return self._data.hidden
end
return self._data.umbrella and self._data.umbrella.hidden
end
function Category:getCategoryName()
if self._info.raw then
return self._info.canonical_name or self._info.label
elseif self._lang then
local ret = self._lang:getCanonicalName() .. " " .. self._info.label
if self._sc then
ret = ret .. " in " .. self._sc:getDisplayForm(self._lang)
end
return ucfirst(ret)
end
local ret = ucfirst(self._info.label)
if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then
ret = ret .. " by language"
end
return ret
end
function Category:getTopright()
if self._lang or self._info.raw then
return self:substitute_template_specs(self._data.topright)
end
return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright)
end
function Category:display_title(displaytitle, lang)
if type(displaytitle) == "string" then
displaytitle = self:substitute_template_specs(displaytitle)
else
displaytitle = displaytitle(self:getCategoryName(), lang)
end
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "Category:" .. displaytitle)
end
function Category:get_labels_categorizing()
local m_labels_utilities = require(labels_utilities_module)
local pos_cat_labels, sense_cat_labels, use_tlb
pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang)
local sense_label = self._info.label:match("^(.*) terms$")
if sense_label then
use_tlb = true
else
sense_label = self._info.label:match("^terms with (.*) senses$")
end
if not sense_label then
return nil
end
sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang)
if use_tlb then
return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang)
end
local all_labels = pos_cat_labels
for k, v in pairs(sense_cat_labels) do
all_labels[k] = v
end
return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang)
end
-- FIXME: this is clunky.
local function remove_lang_params(desc)
-- Simply remove a language name/code/category from the beginning of the string, but replace the language name
-- in the middle of the string with either "specific languages" or "specific-language" depending on whether the
-- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong,
-- in which case the category in question should supply its own umbrella description.
desc = desc:gsub("^{{{langname}}} ", "")
:gsub("{{{langname}}} %(", "specific languages (")
:gsub("{{{langname}}}([.,])", "specific languages%1")
:gsub("{{{langname}}} ", "specific-language ")
:gsub("{{{langdisp}}}", "specific languages")
:gsub("{{{langlink}}}", "specific languages")
return desc
end
function Category:getDescription(isChild)
-- Allows different text in the list of a category's children
local isChild = isChild == "child"
if self._lang or self._info.raw then
if not isChild and self._data.displaytitle then
self:display_title(self._data.displaytitle, self._lang)
end
if self._sc then
return self:getCategoryName() .. "."
end
local desc = self:substitute_template_specs(self._data.description)
if not desc then
return nil
elseif isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(self._data.preceding),
desc,
self:substitute_template_specs(self._data.additional),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
local umbrella = self._data.umbrella
if not isChild and umbrella and umbrella.displaytitle then
self:display_title(umbrella.displaytitle)
end
local desc = self:substitute_template_specs(umbrella and umbrella.description)
local has_umbrella_desc = not not desc
if not desc then
desc = self:convert_spec_to_string(self._data.description)
if desc then
desc = remove_lang_params(desc)
desc = lcfirst(desc)
desc = desc:gsub("%.$", "")
desc = "Categories with " .. desc .. "."
else
desc = "Categories with " .. self._info.label .. " in various specific languages."
end
desc = self:substitute_template_specs(desc)
end
if isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding),
desc,
self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional),
self:substitute_template_specs("{{{umbrella_msg}}}"),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
function Category:new_sortkey(sortkey)
local sortkey_type = type(sortkey)
if sortkey_type == "string" then
sortkey = uupper(sortkey)
elseif sortkey_type == "table" then
function sortkey:makeSortKey()
local sort_func = self.sort_func
if sort_func ~= nil then
return sort_func(self.sort_base)
end
local lang = self.lang
if lang == nil then
return self.sort_base
end
lang = get_lang(lang, nil, true)
if lang == nil then
return self.sort_base
end
local sc = self.sc
if sc ~= nil then
sc = get_script(sc)
end
return lang:makeSortKey(self.sort_base, sc)
end
end
return sortkey
end
function Category:inherit_spec(spec, parent_spec, substitute_result)
if spec == false then
return nil
end
local retval = spec or parent_spec
if substitute_result then
retval = self:substitute_template_specs(retval)
end
return retval
end
function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base)
if not cats then
return nil
elseif type(cats) == "table" then
if cats.name or cats.module then
cats = {cats}
elseif #cats == 0 then
return nil
end
else
cats = {cats}
end
local ret = {}
for _, cat in ipairs(cats) do
if type(cat) ~= "table" or not cat.name and not cat.module then
cat = {name = cat}
end
insert(ret, cat)
end
local is_umbrella = not self._lang and not self._info.raw
local table_type = is_children and "extra_children" or "parents"
for i, cat in ipairs(ret) do
local raw
if self._info.raw or is_umbrella then
raw = not cat.is_label
else
raw = cat.raw
end
local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute")
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute")
-- Get the sortkey.
local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil)
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
if sortkey.sort_func then
-- Not allowed to give a lang and/or script if sort_func is given.
local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil
if bad_spec then
internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type ..
"' .sort table for '" .. self._info.label .. "' category entry in module '" ..
(self._data.module or "unknown") .. "'")
end
else
sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute")
sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute")
end
else
sortkey = self:substitute_template_specs(sortkey)
end
local name
if cat.module then
-- A reference to a category using another category tree module.
if not cat.args then
internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
end
name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args))
else
name = cat.name
if not name then
internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly
name = self:substitute_template_specs(name)
if name:find("^Category:") then
-- It's a non-poscatboiler category name.
sortkey = sortkey or is_children and name:gsub("^Category:", "") or self:getCategoryName()
else
-- It's a label.
sortkey = sortkey or is_children and name or self._info.label
name = self:make_new{
label = name, code = lang, sc = sc,
raw = raw, args = self:substitute_template_specs_in_args(cat.args)
}
end
end
end
sortkey = sortkey or is_children and " " or self._info.label
ret[i] = {
name = name,
description = is_children and self:substitute_template_specs(cat.description) or nil,
sort = self:new_sortkey(sortkey)
}
end
return ret
end
function Category:getParents()
local is_umbrella, ret = not self._lang and not self._info.raw
if self._sc then
local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getDisplayForm(self._lang)}
local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args}
ret = {
{name = parent1, sort = self._sc:getCanonicalName(self._lang)},
{name = parent2, sort = self._sc:getCanonicalName(self._lang)},
}
else
local parents, fallback_sort_base, fallback_sort_key
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
fallback_sort_base = self._data.umbrella and (self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base) or nil
fallback_sort_key = self._data.umbrella and (self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil
else
parents = self._data.parents
fallback_sort_base = self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base
fallback_sort_key = self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key
end
ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base)
if not ret then
return nil
end
end
local self_cat = self:getCategoryName()
for _, parent in ipairs(ret) do
local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName()
if self_cat == parent_cat then
internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat))
end
end
return ret
end
function Category:getChildren()
local is_umbrella = not self._lang and not self._info.raw
local children = self._data.children
local ret = {}
if not is_umbrella and children then
for _, child in ipairs(children) do
child = mw.clone(child)
if type(child) ~= "table" then
child = {name = child}
end
if not child.sort then
child.sort = child.name
end
-- FIXME, is preserving the script correct?
child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc}
insert(ret, child)
end
end
local extra_children
if is_umbrella then
extra_children = self._data.umbrella and self._data.umbrella.extra_children
else
extra_children = self._data.extra_children
end
extra_children = self:canonicalize_parents_children(extra_children, "children")
if extra_children then
for _, child in ipairs(extra_children) do
insert(ret, child)
end
end
return #ret > 0 and ret or nil
end
function Category:getUmbrella()
local umbrella = self._data.umbrella
if umbrella == false or self._info.raw or not self._lang or self._sc then
return nil
end
-- If `umbrella` is a string, use that; otherwise, use the label.
return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label})
end
function Category:getAppendix()
-- FIXME, this should be customizable.
local lang, label = self._lang, self._info.label
if self._info.raw or not (lang and label) then
return nil
end
local appendix = make_title(100, lang:getCanonicalName() .. " " .. label)
return appendix.exists and appendix.fullText or nil
end
function Category:getCatfixInfo()
if self._lang or self._sc or self._info.raw then
local langcode, sccode = self._data.catfix, self._data.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
elseif langcode == nil then -- not false
lang = self._lang
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
elseif sccode == nil then -- not false
sc = self._sc
end
if lang then
lang = lang:getFull()
end
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
end
if lang then
lang = lang:getFull()
end
return lang, sc
end
function Category:getTOCTemplateName()
-- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC()
-- implements its own default algorithm.
internal_error("This should never get called")
end
local export = {}
function export.main(info)
local self = setmetatable({_info = info}, Category)
self:initCommon()
return self._data and self or nil
end
export.new = Category.new
return export
9b7irq94y5jplhe4pd0okuk8aoeevuh
487855
487805
2026-09-02T20:33:19Z
SM7
6218
localization...
487855
Scribunto
text/plain
local lang_independent_data = require("Module:category tree/data")
local lang_specific_module = "Module:category tree/lang"
local lang_specific_module_prefix = lang_specific_module .. "/"
local family_specific_module = "Module:category tree/fam"
local family_specific_module_prefix = family_specific_module .. "/"
local labels_utilities_module = "Module:labels/utilities"
local template_parser_module = "Module:template parser"
local concat = table.concat
local dump = mw.dumpObject
local expand_template = require("Module:frame").expandTemplate
local insert = table.insert
local is_callable = require("Module:fun").is_callable
local lcfirst = require("Module:string utilities").lcfirst
local list_to_set = require("Module:table").listToSet
local make_title = mw.title.makeTitle
local new_title = mw.title.new
local parse = require(template_parser_module).parse
local sparse_concat = require("Module:table").sparseConcat
local tostring = tostring
local type = type
local ucfirst = require("Module:string utilities").ucfirst
local uupper = require("Module:string utilities").upper
local function internal_error(msg)
error("Internal error: " .. msg)
end
local function get_lang(...)
local _get_lang = require("Module:languages").getByCode
function get_lang(...)
return _get_lang(...) or require("Module:languages/errorGetBy").code(...)
end
return get_lang(...)
end
local function get_script(...)
local _get_script = require("Module:scripts").getByCode
function get_script(code)
return _get_script(code) or require("Module:languages/error")(code, true, "script code")
end
return get_script(...)
end
-- Category object
local Category = {}
Category.__index = Category
function Category:get_originating_info()
local originating_info = ""
if self._info.originating_label then
originating_info = " (originating from label \"" .. self._info.originating_label .. "\" in module [[" .. self._info.originating_module .. "]])"
end
return originating_info
end
local valid_keys = list_to_set{"code", "label", "sc", "raw", "args", "also", "called_from_inside", "originating_label", "originating_module"}
function Category.new(info)
for key in pairs(info) do
if not valid_keys[key] then
internal_error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
internal_error("No label was specified.")
end
self:initCommon()
if not self._data then
internal_error("The " .. (self._info.raw and "raw " or "") .. "label \"" .. self._info.label .. "\" does not exist" .. self:get_originating_info() .. ".")
end
return self
end
function Category:initCommon()
local function patch_args(args)
-- This fixes the issue with Scribunto automatically converting keys
-- in a table as numbers to strings, which in turn causes a circular
-- error for having argument parameter names as numbers as strings.
if type(args) ~= "table" then
return args
end
local new_args = {}
for k, v in pairs(args) do
if type(k) == "string" and string.len(k) < 10 and not string.match(k, "^0") and string.match(k, "^%d+$") then
new_args[tonumber(k)] = patch_args(v)
else
new_args[k] = patch_args(v)
end
end
return new_args
end
local args_handled = false
if self._info.raw then
-- Check if the category exists
local raw_categories = lang_independent_data["RAW_CATEGORIES"]
self._data = raw_categories[self._info.label]
if self._data then
if self._data.lang then
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
else
-- Go through raw handlers
local data = {
category = self._info.label,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["RAW_HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if self._data then
-- Update the label if the handler specified a canonical name for it.
if self._data.canonical_name then
self._info.canonical_name = self._data.canonical_name
end
if self._data.lang then
if type(self._data.lang) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.lang) .. " for self._data.lang, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._lang = get_lang(self._data.lang, nil, true)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
internal_error("Received non-string value " .. dump(self._data.sc) .. " for self._data.sc, label \"" .. self._info.label .. "\"" .. self:get_originating_info() .. ".")
end
self._sc = get_script(self._data.sc)
self._info.sc = self._sc:getCode()
end
end
end
else
-- Already parsed into language + label
if self._info.code then
self._lang = get_lang(self._info.code, nil, true)
else
self._lang = nil
end
if self._info.sc then
self._sc = get_script(self._info.sc)
else
self._sc = nil
end
self._info.orig_label = self._info.label
if not self._lang then
-- Umbrella categories without a preceding language always begin with a capital letter, but the actual label may be
-- lowercase (cf. [[:Category:Nouns by language]] with label 'nouns' with per-language [[:Category:English nouns]];
-- but [[:Category:Reddit slang by language]] with label 'Reddit slang' with per-language
-- [[:Category:English Reddit slang]]). Since the label is almost always lowercase, we lowercase it for umbrella
-- categories, storing the original into `orig_label`, and correct it later if needed.
self._info.label = lcfirst(self._info.label)
end
-- First, check lang-specific labels and handlers if this is not an umbrella category.
if self._lang then
local objects_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
local object_specific_module_prefix = lang_specific_module_prefix
local is_family = false
repeat
if objects_with_modules[obj:getCode()] then
local module = object_specific_module_prefix .. obj:getCode()
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
self._data = labels_and_handlers.LABELS[self._info.label]
if self._data then
if not is_family and self._data.umbrella == nil and self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
end
end
if not self._data and labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if not is_family and self._data.umbrella == nil and
self._data.umbrella_parents == nil then
self._data.umbrella = false
end
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
seen[obj:getCode()] = true
obj = obj:getFamily()
if not is_family then
is_family = true
object_specific_module_prefix = family_specific_module_prefix
objects_with_modules = require(family_specific_module)
end
until not obj or seen[obj:getCode()]
end
local function fetch_label_data(labels)
self._data = labels[self._info.label]
-- See comment above about uppercase- vs. lowercase-initial labels, which are indistinguishable
-- in umbrella categories.
if not self._data then
self._data = labels[self._info.orig_label]
if self._data then
self._info.label = self._info.orig_label
end
end
end
-- Then check lang-independent labels.
if not self._data then
-- lang_independent_data.LABELS should always exist.
fetch_label_data(lang_independent_data.LABELS)
if not self._data and not self._lang then
-- Check family-specific labels for umbrella label.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.LABELS then
fetch_label_data(labels_and_handlers.LABELS)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
end
end
-- Then check lang-independent handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
for _, handler in ipairs(lang_independent_data["HANDLERS"]) do
self._data, args_handled = handler.handler(data)
if self._data then
self._data.module = self._data.module or handler.module
break
end
end
if not self._data and not self._lang then
-- Check family-specific labels for umbrella handler.
local families_with_modules = require(family_specific_module)
for famcode, _ in pairs(families_with_modules) do
local module = family_specific_module_prefix .. famcode
local labels_and_handlers = require(module)
if labels_and_handlers.HANDLERS then
for _, handler in ipairs(labels_and_handlers.HANDLERS) do
local data = {
label = self._info.label,
sc = self._sc,
args = patch_args(self._info.args) or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
self._data.module = self._data.module or module
break
end
end
end
if self._data then
break
end
end
end
end
end
if not args_handled and self._data and self._info.args and next(self._info.args) then
local module_text = " (handled in [[" .. (self._data.module or "UNKNOWN").. "]])"
local args_text = {}
for k, v in pairs(self._info.args) do
insert(args_text, k .. "=" .. ((type(v) == "string" or type(v) == "number") and v or dump(v)))
end
error("poscatboiler label '" .. self._info.label .. "' " .. module_text .. " doesn't accept extra args " ..
concat(args_text, ", "))
end
if self._sc and not self._lang then
internal_error("Umbrella categories cannot have a script specified.")
end
end
function Category:convert_spec_to_string(desc)
if not desc then
return desc
end
local desc_type = type(desc)
if desc_type == "string" then
return desc
elseif desc_type == "number" then
return tostring(desc)
elseif not is_callable(desc) then
internal_error("`desc` must be a string, number, function, callable table or nil; received " .. dump(desc))
end
desc = desc {
lang = self._lang,
sc = self._sc,
label = self._info.label,
raw = self._info.raw,
}
if not desc then
return desc
end
desc_type = type(desc)
if desc_type == "string" then
return desc
end
internal_error("The value returned by `desc` must be a string or nil; received " .. dump(desc))
end
local function add_obj_args(args, obj, obj_type, sc_lang)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName(sc_lang)
args[obj_type .. "disp"] = obj:getDisplayForm(sc_lang)
args[obj_type .. "cat"] = obj:getCategoryName(false, sc_lang)
args[obj_type .. "link"] = obj:makeCategoryLink(sc_lang)
end
end
-- Expands `desc` like a template, passing values for specs like {{{langname}}}.
function Category:substitute_template_specs(desc)
-- This may end up happening twice but that's OK as the function is (usually) idempotent.
-- FIXME: Not idempotent if a preprocessed template returns wikicode.
desc = self:convert_spec_to_string(desc)
if not desc then
return nil
end
-- Populate the substitution arguments.
local args = {}
args.umbrella_msg = "This is an umbrella category. It contains no dictionary entries, but only other, language-specific categories, which in turn contain relevant terms in a given language."
args.umbrella_meta_msg = "This is an umbrella metacategory, covering a general area such as \"lemmas\", \"names\" or \"terms by etymology\". It contains no dictionary entries, but holds only umbrella (\"by language\") categories covering specific subtopics, which in turn contain language-specific categories holding terms in a given language for that same topic."
add_obj_args(args, self._lang, "lang")
add_obj_args(args, self._sc, "sc", self._lang)
return parse(desc, true):expand(args)
end
function Category:substitute_template_specs_in_args(args)
if not args then
return args
end
local pinfo = {}
for k, v in pairs(args) do
pinfo[self:substitute_template_specs(k)] = self:substitute_template_specs(v)
end
return pinfo
end
function Category:make_new(info)
info.originating_label = self._info.label
info.originating_module = self._data.module
info.called_from_inside = true
return Category.new(info)
end
function Category:getBreadcrumbName()
local ret
if self._sc then
-- The parent of 'LANG POS in SCRIPT script' is always 'SCRIPT script' regardless of the parents normally set,
-- so the breadcrumb should always be 'POS' regardless of the breadcrumb normally set.
return self._info.label, nil
end
if self._lang or self._info.raw then
ret = self._data.breadcrumb or
self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base or
self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key or
nil
else
ret = self._data.umbrella and (self._data.umbrella.breadcrumb or
self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base or
self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or
nil
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
return self:substitute_template_specs(ret.name), ret.nocap
end
local function expand_toc_template_if(template)
local template_obj = new_title(template, 10)
if template_obj.exists then
return expand_template{title = template_obj.text}
end
return nil
end
-- Return the textual expansion of the first existing template among the given templates, first performing
-- substitutions on the template name such as replacing {{{langcode}}} with the current language's code (if any).
-- If no templates exist after expansion, or if nil is passed in, return nil. If a single string is passed in,
-- treat it like a one-element list consisting of that string.
function Category:get_template_text(templates)
if templates == nil then
return nil
elseif type(templates) ~= "table" then
templates = {templates}
end
for _, template in ipairs(templates) do
if template == false then
return false
end
template = self:substitute_template_specs(template)
return expand_toc_template_if(template)
end
return nil
end
function Category:getTOC(toc_type)
-- Type "none" means everything fits on a single page; in that case, display nothing.
if toc_type == "none" then
return nil
end
local templates, fallback_templates
-- If TOC type is "full" (more than 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template_full` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. look up and expand the `toc_template` templates (normal or umbrella, as above);
-- 3. do the default behavior, which is as follows:
-- 3a. look up a language-specific "full" template according to the current language (using English if there
-- is no current language);
-- 3b. look up a script-specific "full" template according to the first script of current language (using English
-- if there is no current language);
-- 3c. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 3d. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 3e. display nothing.
--
-- If TOC type is "normal" (between 200 and 2500 entries), do the following, in order:
-- 1. look up and expand the `toc_template` templates (normal or umbrella, depending on whether there is
-- a current language);
-- 2. do the default behavior, which is as follows:
-- 2a. look up a language-specific "normal" template according to the current language (using English if there
-- is no current language);
-- 2b. look up a script-specific "normal" template according to the first script of the current language (using
-- English if there is no current language);
-- 2c. display nothing.
local data_source
if self._lang or self._info.raw then
data_source = self._data
else
data_source = self._data.umbrella
end
if data_source then
if toc_type == "full" then
templates = data_source.toc_template_full
fallback_templates = data_source.toc_template
else
templates = data_source.toc_template
end
end
local text = self:get_template_text(templates)
if text then
return text
elseif text == false then
return nil
end
text = self:get_template_text(fallback_templates)
if text then
return text
elseif text == false then
return nil
end
local default_toc_templates_to_check = {}
local lang, sc = self:getCatfixInfo()
local langcode = lang and lang:getCode() or "en"
local sccode = sc and sc:getCode() or lang and lang:getScriptCodes()[1] or "Latn"
-- FIXME: What is toctemplateprefix used for?
local tocname = (self._data.toctemplateprefix or "") .. "categoryTOC"
if toc_type == "full" then
insert(default_toc_templates_to_check, ("%s-%s/full"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s/full"):format(sccode, tocname))
end
insert(default_toc_templates_to_check, ("%s-%s"):format(langcode, tocname))
insert(default_toc_templates_to_check, ("%s-%s"):format(sccode, tocname))
for _, toc_template in ipairs(default_toc_templates_to_check) do
local toc_template_text = expand_toc_template_if(toc_template)
if toc_template_text then
return toc_template_text
end
end
return nil
end
function Category:getInfo()
return self._info
end
function Category:getDataModule()
return self._data.module
end
function Category:canBeEmpty()
if self._lang or self._info.raw then
return self._data.can_be_empty
end
return self._data.umbrella and self._data.umbrella.can_be_empty
end
function Category:isHidden()
if self._lang or self._info.raw then
return self._data.hidden
end
return self._data.umbrella and self._data.umbrella.hidden
end
function Category:getCategoryName()
if self._info.raw then
return self._info.canonical_name or self._info.label
elseif self._lang then
local ret = self._lang:getCanonicalName() .. " " .. self._info.label
if self._sc then
ret = ret .. " in " .. self._sc:getDisplayForm(self._lang)
end
return ucfirst(ret)
end
local ret = ucfirst(self._info.label)
if not (self._data.no_by_language or self._data.umbrella and self._data.umbrella.no_by_language) then
ret = ret .. " by language"
end
return ret
end
function Category:getTopright()
if self._lang or self._info.raw then
return self:substitute_template_specs(self._data.topright)
end
return self._data.umbrella and self:substitute_template_specs(self._data.umbrella.topright)
end
function Category:display_title(displaytitle, lang)
if type(displaytitle) == "string" then
displaytitle = self:substitute_template_specs(displaytitle)
else
displaytitle = displaytitle(self:getCategoryName(), lang)
end
mw.getCurrentFrame():callParserFunction("DISPLAYTITLE", "श्रेणी:" .. displaytitle)
end
function Category:get_labels_categorizing()
local m_labels_utilities = require(labels_utilities_module)
local pos_cat_labels, sense_cat_labels, use_tlb
pos_cat_labels = m_labels_utilities.find_labels_for_category(self._info.label, "pos", self._lang)
local sense_label = self._info.label:match("^(.*) terms$")
if sense_label then
use_tlb = true
else
sense_label = self._info.label:match("^terms with (.*) senses$")
end
if not sense_label then
return nil
end
sense_cat_labels = m_labels_utilities.find_labels_for_category(sense_label, "sense", self._lang)
if use_tlb then
return m_labels_utilities.format_labels_categorizing(pos_cat_labels, sense_cat_labels, self._lang)
end
local all_labels = pos_cat_labels
for k, v in pairs(sense_cat_labels) do
all_labels[k] = v
end
return m_labels_utilities.format_labels_categorizing(all_labels, nil, self._lang)
end
-- FIXME: this is clunky.
local function remove_lang_params(desc)
-- Simply remove a language name/code/category from the beginning of the string, but replace the language name
-- in the middle of the string with either "specific languages" or "specific-language" depending on whether the
-- language name appears to be an attributive qualifier of another noun or to stand by itself. This may be wrong,
-- in which case the category in question should supply its own umbrella description.
desc = desc:gsub("^{{{langname}}} ", "")
:gsub("{{{langname}}} %(", "specific languages (")
:gsub("{{{langname}}}([.,])", "specific languages%1")
:gsub("{{{langname}}} ", "specific-language ")
:gsub("{{{langdisp}}}", "specific languages")
:gsub("{{{langlink}}}", "specific languages")
return desc
end
function Category:getDescription(isChild)
-- Allows different text in the list of a category's children
local isChild = isChild == "child"
if self._lang or self._info.raw then
if not isChild and self._data.displaytitle then
self:display_title(self._data.displaytitle, self._lang)
end
if self._sc then
return self:getCategoryName() .. "."
end
local desc = self:substitute_template_specs(self._data.description)
if not desc then
return nil
elseif isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(self._data.preceding),
desc,
self:substitute_template_specs(self._data.additional),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
local umbrella = self._data.umbrella
if not isChild and umbrella and umbrella.displaytitle then
self:display_title(umbrella.displaytitle)
end
local desc = self:substitute_template_specs(umbrella and umbrella.description)
local has_umbrella_desc = not not desc
if not desc then
desc = self:convert_spec_to_string(self._data.description)
if desc then
desc = remove_lang_params(desc)
desc = lcfirst(desc)
desc = desc:gsub("%.$", "")
desc = "Categories with " .. desc .. "."
else
desc = "Categories with " .. self._info.label .. " in various specific languages."
end
desc = self:substitute_template_specs(desc)
end
if isChild then
return desc
end
return sparse_concat({
self:substitute_template_specs(umbrella and umbrella.preceding or not has_umbrella_desc and self._data.preceding),
desc,
self:substitute_template_specs(umbrella and umbrella.additional or not has_umbrella_desc and self._data.additional),
self:substitute_template_specs("{{{umbrella_msg}}}"),
self:substitute_template_specs(self:get_labels_categorizing()),
}, "\n\n")
end
function Category:new_sortkey(sortkey)
local sortkey_type = type(sortkey)
if sortkey_type == "string" then
sortkey = uupper(sortkey)
elseif sortkey_type == "table" then
function sortkey:makeSortKey()
local sort_func = self.sort_func
if sort_func ~= nil then
return sort_func(self.sort_base)
end
local lang = self.lang
if lang == nil then
return self.sort_base
end
lang = get_lang(lang, nil, true)
if lang == nil then
return self.sort_base
end
local sc = self.sc
if sc ~= nil then
sc = get_script(sc)
end
return lang:makeSortKey(self.sort_base, sc)
end
end
return sortkey
end
function Category:inherit_spec(spec, parent_spec, substitute_result)
if spec == false then
return nil
end
local retval = spec or parent_spec
if substitute_result then
retval = self:substitute_template_specs(retval)
end
return retval
end
function Category:canonicalize_parents_children(cats, is_children, fallback_sort_key, fallback_sort_base)
if not cats then
return nil
elseif type(cats) == "table" then
if cats.name or cats.module then
cats = {cats}
elseif #cats == 0 then
return nil
end
else
cats = {cats}
end
local ret = {}
for _, cat in ipairs(cats) do
if type(cat) ~= "table" or not cat.name and not cat.module then
cat = {name = cat}
end
insert(ret, cat)
end
local is_umbrella = not self._lang and not self._info.raw
local table_type = is_children and "extra_children" or "parents"
for i, cat in ipairs(ret) do
local raw
if self._info.raw or is_umbrella then
raw = not cat.is_label
else
raw = cat.raw
end
local lang = self:inherit_spec(cat.lang, not raw and self._info.code or nil, "substitute")
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil, "substitute")
-- Get the sortkey.
local sortkey = self:inherit_spec(cat.sort, i == 1 and (fallback_sort_key or fallback_sort_base and {sort_base = fallback_sort_base}) or nil)
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
internal_error("Missing .sort_base in '" .. table_type .. "' .sort table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
if sortkey.sort_func then
-- Not allowed to give a lang and/or script if sort_func is given.
local bad_spec = sortkey.lang and "lang" or sortkey.sc and "sc" or nil
if bad_spec then
internal_error("Cannot specify both ." .. bad_spec .. " and .sort_func in '" .. table_type ..
"' .sort table for '" .. self._info.label .. "' category entry in module '" ..
(self._data.module or "unknown") .. "'")
end
else
sortkey.lang = self:inherit_spec(sortkey.lang, lang, "substitute")
sortkey.sc = self:inherit_spec(sortkey.sc, sc, "substitute")
end
else
sortkey = self:substitute_template_specs(sortkey)
end
local name
if cat.module then
-- A reference to a category using another category tree module.
if not cat.args then
internal_error("Missing .args in '" .. table_type .. "' table with module=\"" .. cat.module .. "\" for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
end
name = require("Module:category tree/" .. cat.module).new(self:substitute_template_specs_in_args(cat.args))
else
name = cat.name
if not name then
internal_error("Missing .name in " .. (is_umbrella and "umbrella " or "") .. "'" .. table_type .. "' table for '" ..
self._info.label .. "' category entry in module '" .. (self._data.module or "unknown") .. "'")
elseif type(name) == "string" then -- otherwise, assume it's a category object and use it directly
name = self:substitute_template_specs(name)
if name:find("^श्रेणी:") then
-- It's a non-poscatboiler category name.
sortkey = sortkey or is_children and name:gsub("^श्रेणी:", "") or self:getCategoryName()
else
-- It's a label.
sortkey = sortkey or is_children and name or self._info.label
name = self:make_new{
label = name, code = lang, sc = sc,
raw = raw, args = self:substitute_template_specs_in_args(cat.args)
}
end
end
end
sortkey = sortkey or is_children and " " or self._info.label
ret[i] = {
name = name,
description = is_children and self:substitute_template_specs(cat.description) or nil,
sort = self:new_sortkey(sortkey)
}
end
return ret
end
function Category:getParents()
local is_umbrella, ret = not self._lang and not self._info.raw
if self._sc then
local parent1 = self:make_new{code = self._info.code, label = "terms in " .. self._sc:getDisplayForm(self._lang)}
local parent2 = self:make_new{code = self._info.code, label = self._info.label, raw = self._info.raw, args = self._info.args}
ret = {
{name = parent1, sort = self._sc:getCanonicalName(self._lang)},
{name = parent2, sort = self._sc:getCanonicalName(self._lang)},
}
else
local parents, fallback_sort_base, fallback_sort_key
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
fallback_sort_base = self._data.umbrella and (self._data.umbrella.breadcrumb_base or self._data.umbrella.breadcrumb_and_first_sort_base) or nil
fallback_sort_key = self._data.umbrella and (self._data.umbrella.breadcrumb_key or self._data.umbrella.breadcrumb_and_first_sort_key) or nil
else
parents = self._data.parents
fallback_sort_base = self._data.breadcrumb_base or self._data.breadcrumb_and_first_sort_base
fallback_sort_key = self._data.breadcrumb_key or self._data.breadcrumb_and_first_sort_key
end
ret = self:canonicalize_parents_children(parents, nil, fallback_sort_key, fallback_sort_base)
if not ret then
return nil
end
end
local self_cat = self:getCategoryName()
for _, parent in ipairs(ret) do
local parent_cat = parent.name.getCategoryName and parent.name:getCategoryName()
if self_cat == parent_cat then
internal_error(("Infinite loop would occur, as parent category '%s' is the same as the child category"):format(self_cat))
end
end
return ret
end
function Category:getChildren()
local is_umbrella = not self._lang and not self._info.raw
local children = self._data.children
local ret = {}
if not is_umbrella and children then
for _, child in ipairs(children) do
child = mw.clone(child)
if type(child) ~= "table" then
child = {name = child}
end
if not child.sort then
child.sort = child.name
end
-- FIXME, is preserving the script correct?
child.name = self:make_new{code = self._info.code, label = child.name, raw = child.raw, sc = self._info.sc}
insert(ret, child)
end
end
local extra_children
if is_umbrella then
extra_children = self._data.umbrella and self._data.umbrella.extra_children
else
extra_children = self._data.extra_children
end
extra_children = self:canonicalize_parents_children(extra_children, "children")
if extra_children then
for _, child in ipairs(extra_children) do
insert(ret, child)
end
end
return #ret > 0 and ret or nil
end
function Category:getUmbrella()
local umbrella = self._data.umbrella
if umbrella == false or self._info.raw or not self._lang or self._sc then
return nil
end
-- If `umbrella` is a string, use that; otherwise, use the label.
return self:make_new({label = type(umbrella) == "string" and umbrella or self._info.label})
end
function Category:getAppendix()
-- FIXME, this should be customizable.
local lang, label = self._lang, self._info.label
if self._info.raw or not (lang and label) then
return nil
end
local appendix = make_title(100, lang:getCanonicalName() .. " " .. label)
return appendix.exists and appendix.fullText or nil
end
function Category:getCatfixInfo()
if self._lang or self._sc or self._info.raw then
local langcode, sccode = self._data.catfix, self._data.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
elseif langcode == nil then -- not false
lang = self._lang
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
elseif sccode == nil then -- not false
sc = self._sc
end
if lang then
lang = lang:getFull()
end
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
local lang, sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode, nil, true)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
end
if lang then
lang = lang:getFull()
end
return lang, sc
end
function Category:getTOCTemplateName()
-- This should only be invoked if getTOC() returns true, meaning to do the default algorithm, but getTOC()
-- implements its own default algorithm.
internal_error("This should never get called")
end
local export = {}
function export.main(info)
local self = setmetatable({_info = info}, Category)
self:initCommon()
return self._data and self or nil
end
export.new = Category.new
return export
jiotpx8j0r07jouav5fszvyoe7zxrmy
साँचा:IPA
10
303048
487749
470038
2026-09-02T15:04:22Z
SM7
6218
updating...
487749
wikitext
text/x-wiki
{{ {{#if:{{{lang|}}}|check deprecated lang param usage|no deprecated lang param usage}}|lang={{{lang|}}}|<!--
-->{{#invoke:IPA/templates|IPA}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
9boayrvohq0yw9npgjusxgwtdcrlssr
साँचा:deprecated code
10
303050
487750
470040
2026-09-02T15:05:26Z
SM7
6218
updating...
487750
wikitext
text/x-wiki
{{#ifeq:{{{active|}}}|no|{{{1}}}|<span class="deprecated" title="{{#if:{{{tooltip|}}}|{{{tooltip}}}|This is a deprecated template usage.}}">''([[:Category:Successfully deprecated templates|{{#if:{{{text|}}}|{{{text}}}|deprecated template usage}}]])'' {{{1}}}</span><includeonly>[[Category:Pages using deprecated templates{{#switch:{{NAMESPACE}}|Appendix|Reconstruction|Thesaurus|Sign gloss|Citations|=|#default=/other}}]]</includeonly>}}<!--
--><noinclude>{{documentation}}</noinclude>
sbklorazzvj1bljd6402e0f7vxjwog3
मॉड्यूल:IPA/templates
828
303054
487745
470044
2026-09-02T14:52:05Z
SM7
6218
updating...
487745
Scribunto
text/plain
local export = {}
local m_IPA = require("Module:IPA")
local parameter_utilities_module = "Module:parameter utilities"
local function track(template, page)
require("Module:debug/track")(template .. "/" .. page)
return true
end
-- Used for [[Template:IPA]].
function export.IPA(frame)
local parent_args = frame:getParent().args
-- Track uses of n so they can be converted to ref.
-- Track uses of qual so they can be converted to q.
for k, v in pairs(parent_args) do
if type(k) == "string" and k:find("^qual%d*$") then
track("IPA", "q")
end
end
local include_langname = frame.args.include_langname
local compat = parent_args.lang
local offset = compat and 0 or 1
local lang_arg = compat and "lang" or 1
local params = {
[lang_arg] = {required = true, type = "language", default = "en"},
[1 + offset] = {list = true, disallow_holes = true},
-- Deprecated; don't use in new code.
["qual"] = {list = true, separate_no_index = true, alias_of = "q"},
["nocount"] = {type = "boolean"},
["nocat"] = {type = "boolean"},
["sort"] = {},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"ref", "a", "q"}},
{group = "link", include = {"t", "gloss", "pos"}},
}
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 1 + offset,
term_dest = "pron",
track_module = "IPA",
}
local lang = args[lang_arg]
for _, item in ipairs(items) do
require("Module:IPA/tracking").run_tracking(item.pron, lang)
end
-- Tracking for direct (manual) uses of {{IPA}} instead of lang-specific automatic templates such as {{is-IPA}}.
-- [[Category:LANG terms with IPA pronunciation]] tracks terms with IPA pronunciation added in any manner,
-- but doesn't distinguish manual {{IPA}} calls from calls to the automatic template.
track("IPA", "manual")
track("IPA", "manual/" .. lang:getCode())
local data = {
lang = lang,
items = items,
no_count = args.nocount,
nocat = args.nocat,
sort_key = args.sort,
include_langname = include_langname,
q = args.q.default,
qq = args.qq.default,
a = args.a.default,
aa = args.aa.default,
}
return m_IPA.format_IPA_full(data)
end
-- Used for [[Template:IPAchar]].
function export.IPAchar(frame)
local parent_args = frame.getParent and frame:getParent().args or frame
-- Track uses of n so they can be converted to ref.
-- Track uses of qual so they can be converted to q.
for k, v in pairs(parent_args) do
if type(k) == "string" and k:find("^n%d*$") then
track("IPAchar", "n")
end
if type(k) == "string" and k:find("^qual%d*$") then
track("IPAchar", "q")
end
end
local params = {
[1] = {list = true, disallow_holes = true},
-- FIXME, remove this.
["lang"] = {}, -- This parameter is not used and does nothing, but is allowed for futureproofing.
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
-- It doesn't really make sense to have separate overall a=/aa=/q=/qq= for {{IPAchar}}, which doesn't format a
-- whole line but just individual pronunciations. Instead they are associated with the first item.
{group = {"ref", "a", "q"}, separate_no_index = false},
-- Deprecated; don't use in new code.
{param = "qual", alias_of = "q"},
}
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 1,
term_dest = "pron",
track_module = "IPAchar",
}
-- [[Special:WhatLinksHere/Wiktionary:Tracking/IPAchar/lang]]
if args.lang then
track("IPAchar", "lang")
end
-- Format
return m_IPA.format_IPA_multiple(nil, items)
end
function export.XSAMPA(frame)
local params = {
[1] = { required = true },
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return m_IPA.XSAMPA_to_IPA(args[1] or "[Eg'zA:mp5=]")
end
-- Used by [[Template:X2IPA]]
function export.X2IPAtemplate(frame)
local parent_args = frame.getParent and frame:getParent().args or frame
local compat = parent_args["lang"]
local offset = compat and 0 or 1
local params = {
[compat and "lang" or 1] = {required = true, default = "und"},
[1 + offset] = {list = true, allow_holes = true},
["ref"] = {list = true, allow_holes = true},
["a"] = {list = true, allow_holes = true, separate_no_index = true},
["aa"] = {list = true, allow_holes = true, separate_no_index = true},
["q"] = {list = true, allow_holes = true, separate_no_index = true},
["qq"] = {list = true, allow_holes = true, separate_no_index = true},
["qual"] = {list = true, allow_holes = true},
["nocount"] = {type = "boolean"},
["sort"] = {},
}
local args = require("Module:parameters").process(parent_args, params)
local m_XSAMPA = require("Module:IPA/X-SAMPA")
local pronunciations, refs, a, aa, q, qq, qual, lang =
args[1 + offset], args.ref, args.a, args.aa, args.q, args.qq, args.qual, args[compat and "lang" or 1]
local output = {}
table.insert(output, "{{IPA")
table.insert(output, "|" .. lang)
if a.default then
table.insert(output, "|a=" .. a.default)
end
if q.default then
table.insert(output, "|q=" .. q.default)
end
for i = 1, math.max(pronunciations.maxindex, refs.maxindex, a.maxindex, aa.maxindex, q.maxindex, qq.maxindex,
qual.maxindex) do
if pronunciations[i] then
table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i]))
end
if a[i] then
table.insert(output, "|a" .. i .. "=" .. a[i])
end
if aa[i] then
table.insert(output, "|aa" .. i .. "=" .. aa[i])
end
if q[i] then
table.insert(output, "|q" .. i .. "=" .. q[i])
end
if qq[i] then
table.insert(output, "|qq" .. i .. "=" .. qq[i])
end
if refs[i] then
table.insert(output, "|ref" .. i .. "=" .. refs[i])
end
if qual[i] then
table.insert(output, "|qual" .. i .. "=" .. qual[i])
end
end
if aa.default then
table.insert(output, "|aa=" .. aa.default)
end
if qq.default then
table.insert(output, "|qq=" .. qq.default)
end
if args.nocount then
table.insert(output, "|nocount=1")
end
if args.sort then
table.insert(output, "|sort=" .. args.sort)
end
table.insert(output, "}}")
return table.concat(output)
end
-- Used by [[Template:X2IPAchar]]
function export.X2IPAchar(frame)
local params = {
[1] = { list = true, allow_holes = true },
["ref"] = {list = true, allow_holes = true},
["q"] = {list = true, allow_holes = true, require_index = true},
["qq"] = {list = true, allow_holes = true, require_index = true},
["qual"] = { list = true, allow_holes = true },
-- FIXME, remove this.
["lang"] = {},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/X2IPAchar/lang]]
if args.lang then
track("X2IPAchar", "lang")
end
local m_XSAMPA = require("Module:IPA/X-SAMPA")
local pronunciations, refs, q, qq, qual, lang = args[1], args.ref, args.q, args.qq, args.qual, args.lang
local output = {}
table.insert(output, "{{IPAchar")
for i = 1, math.max(pronunciations.maxindex, refs.maxindex, q.maxindex, qq.maxindex, qual.maxindex) do
if pronunciations[i] then
table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i]))
end
if q[i] then
table.insert(output, "|q" .. i .. "=" .. q[i])
end
if qq[i] then
table.insert(output, "|qq" .. i .. "=" .. qq[i])
end
if qual[i] then
table.insert(output, "|qual" .. i .. "=" .. qual[i])
end
if refs[i] then
table.insert(output, "|ref" .. i .. "=" .. refs[i])
end
end
if lang then
table.insert(output, "|lang=" .. lang)
end
table.insert(output, "}}")
return table.concat(output)
end
-- Used by [[Template:x2rhymes]]
function export.X2rhymes(frame)
local parent_args = frame.getParent and frame:getParent().args or frame
local compat = parent_args["lang"]
local offset = compat and 0 or 1
local params = {
[compat and "lang" or 1] = {required = true, default = "und"},
[1 + offset] = {required = true, list = true, allow_holes = true},
}
local args = require("Module:parameters").process(parent_args, params)
local m_XSAMPA = require("Module:IPA/X-SAMPA")
local pronunciations, lang = args[1 + offset], args[compat and "lang" or 1]
local output = {}
table.insert(output, "{{rhymes")
table.insert(output, "|" .. lang)
for i = 1, pronunciations.maxindex do
if pronunciations[i] then
table.insert(output, "|" .. m_XSAMPA.XSAMPA_to_IPA(pronunciations[i]))
end
end
table.insert(output, "}}")
return table.concat(output)
end
-- Used for [[Template:enPR]].
function export.enPR(frame)
local parent_args = frame:getParent().args
local params = {
[1] = {list = true, disallow_holes = true},
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{group = {"q", "a", "ref"}},
}
local items, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 1,
term_dest = "pron",
track_module = "enPR",
}
local data = {
items = items,
q = args.q.default,
qq = args.qq.default,
a = args.a.default,
aa = args.aa.default,
}
return m_IPA.format_enPR_full(data)
end
return export
4d032bpwth3egruuulwhrdv60ldftme
मॉड्यूल:IPA
828
303055
487773
487250
2026-09-02T16:55:05Z
SM7
6218
updating...
487773
Scribunto
text/plain
local export = {}
local force_cat = false -- for testing
local pages_module = "Module:pages"
local pron_qualifier_module = "Module:pron qualifier"
local qualifier_module = "Module:qualifier"
local references_module = "Module:references"
local string_utilities_module = "Module:string utilities"
local syllables_module = "Module:syllables"
local utilities_module = "Module:utilities"
local m_data = mw.loadData("Module:IPA/data")
local m_str_utils = require(string_utilities_module)
local m_syllables -- [[Module:syllables]]; loaded below if needed
local m_symbols = mw.loadData("Module:IPA/data/symbols")
local concat = table.concat
local decode_entities = m_str_utils.decode_entities
local find = string.find
local gcodepoint = m_str_utils.gcodepoint
local gmatch = m_str_utils.gmatch
local gsub = string.gsub
local insert = table.insert
local is_preview = require(pages_module).is_preview
local len = m_str_utils.len
local listToText = mw.text.listToText
local match = string.match
local pattern_escape = m_str_utils.pattern_escape
local sub = string.sub
local u = m_str_utils.char
local ugsub = m_str_utils.gsub
local umatch = m_str_utils.match
local usub = m_str_utils.sub
local function with_codepoints(s)
if find(s, "%S%s") then
local parts = {}
for ch in gmatch(s, "%S") do
parts[#parts + 1] = with_codepoints(ch)
end
return concat(parts, ", ")
end
local cps = {}
for cp in gcodepoint(s) do
cps[#cps + 1] = ("U+%04X"):format(cp)
end
return s .. " [" .. concat(cps, " ") .. "]"
end
local namespace = mw.title.getCurrentTitle().nsText
local function is_content_page(lang, namespace)
return namespace == "" or namespace == "Reconstruction" or
lang and lang:hasType("appendix-constructed") and namespace == "Appendix"
end
-- Etymology-only languages are not L2 entry languages; IPA should use the parent full language.
local function assert_not_etymology_only_lang(lang)
if lang and lang.hasType and lang:hasType("language", "etymology-only") then
local parent_code = lang.getParentCode and lang:getParentCode() or nil
error(("Cannot use IPA with the etymology-only language %q; use the parent full language %q instead."):format(lang:getCode(), parent_code))
end
end
local function track(page)
require("Module:debug/track")("IPA/" .. page)
return true
end
local function process_maybe_split_categories(split_output, categories, prontext, lang, errtext)
if split_output ~= "raw" then
if categories[1] then
categories = require(utilities_module).format_categories(categories, lang, nil, nil, force_cat)
else
categories = ""
end
end
if split_output then -- for use of IPA in links, etc.
if errtext then
return prontext, categories, errtext
else
return prontext, categories
end
else
return prontext .. (errtext or "") .. categories
end
end
--[==[
Format a line of one or more IPA pronunciations as {{tl|IPA}} would do it, i.e. with a preceding {"IPA:"} followed by
the word {"key"} linking to an Appendix page describing the language's phonology, and with an added category
` ``lang`` terms with IPA pronunciation`. Other than the extra preceding text and category, this is identical
to {format_IPA_multiple()}, and the considerations described there in the documentation apply here as well. There is a
single parameter `data`, an object with the following fields:
* `lang`: Object representing the language of the pronunciations, which is used when adding cleanup categories for
pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to
add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); for adding a category
` ``lang`` terms with IPA pronunciation`; and for determining the proper sort keys for categories. Unlike
for {format_IPA_multiple()}, `lang` may not be {nil}.
* `items`: List of pronunciations, in exactly the same format as for {format_IPA_multiple()}.
* `err`: If not {nil}, a string containing an error message to use in place of the link to the language's phonology.
* `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the
first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in
`items`.
* `sort_key`: Explicit sort key used for categories.
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that
only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a
given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup
or other categories. If you need them suppressed, use `split_output` to return the categories separately and ignore
them.
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category
strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If
`split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.
* `include_langname`: If specified, prefix the result with the language name, followed by a colon.
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted
pronunciations and preceding {"IPA:"}.
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted
pronunciations and preceding {"IPA:"}.
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.
]==]
function export.format_IPA_full(data)
if type(data) ~= "table" or data.getCode then
error("Must now supply a table of arguments to format_IPA_full(); first argument should be that table, not a language object")
end
local lang = data.lang
local items = data.items
local err = data.err
local separator = data.separator
local sort_key = data.sort_key
local no_count = data.no_count
local split_output = data.split_output
local q = data.q
local qq = data.qq
local a = data.a
local aa = data.aa
local include_langname = data.include_langname
local hasKey = m_data.langs_with_infopages
if not lang or not lang.getCode then
error("Must specify language to format_IPA_full()")
end
assert_not_etymology_only_lang(lang)
local langname = lang:getCanonicalName()
local prefix_text
if err then
prefix_text = '<span class="error">' .. err .. '</span>'
else
if hasKey[lang:getCode()] then
prefix_text = "Appendix:" .. langname .. " pronunciation"
else
prefix_text = "wikipedia:" .. langname .. " phonology"
end
prefix_text = "[[" .. prefix_text .. "|key]]"
end
local prefix = "[[विक्षनरी:अंतर्राष्ट्रीय ध्वन्यात्मक वर्णमाला|आईपीए]]<sup>(" .. prefix_text .. ")</sup>: "
local IPAs, categories = export.format_IPA_multiple(lang, items, separator, no_count, "raw")
if is_content_page(lang, namespace) then
insert(categories, {
cat = langname .. " टर्म आईपीए उच्चारण के साथ",
sort_key = sort_key
})
end
local prontext = prefix .. IPAs
if q and q[1] or qq and qq[1] or a and a[1] or aa and aa[1] then
prontext = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = prontext,
q = q,
qq = qq,
a = a,
aa = aa,
}
end
if include_langname then
prontext = langname .. ": " .. prontext
end
return process_maybe_split_categories(split_output, categories, prontext, lang)
end
local function split_phonemic_phonetic(pron)
local reconstructed, phonemic, phonetic = match(pron, "^(%*?)(/.-/)%s+(%[.-%])$")
if reconstructed then
return reconstructed .. phonemic, reconstructed .. phonetic
else
return pron, nil
end
end
local function determine_repr(pron)
local reconstructed
-- Temporarily remove any initial asterisk before representation marks,
-- which avoids having to account for it in the data, but set the
-- `reconstructed` flag.
if sub(pron, 1, 1) == "*" then
reconstructed = true
pron = sub(pron, 2)
end
-- Some representation types have aliases for convenience (e.g. "// //" is
-- an alias for "⫽ ⫽"). and these need to be substituted in before checking
-- for other data.
local opening, n = match(pron, "^.[\128-\191]*")
local subs_data = m_data.representation_subs[opening]
if subs_data then
pron, n = ugsub(pron, subs_data[1], subs_data[2])
-- If the substitution was made, `opening` needs to be changed to the
-- new opening character.
if n ~= 0 then
opening = subs_data[3]
end
end
-- Get the type data based on the opening character (if any), and set the
-- representation type if the closing character matches.
local type_data, repr, closing = m_data.representation_types[opening]
if type_data then
closing = type_data[2]
if type_data and match(pron, pattern_escape(closing) .. "$", #opening + 1) then
repr = type_data[1]
end
end
-- Default to the empty string.
if not repr then
opening, closing = "", ""
end
-- Reattach the asterisk if reconstructed.
if reconstructed then
pron = "*" .. pron
end
return pron, repr, opening, closing, reconstructed
end
local function hasInvalidSeparators(transcription)
-- Escape certain characters as well as pauses, which have the format "(...)" (with any number of dots), to avoid false-positives.
transcription = transcription:gsub(".[\128-\191]*", m_symbols.separator_escapes)
:gsub("%(%.+%)", "\3")
:gsub("[()]+", "")
return (
transcription:find("..", nil, true) or
transcription:match("%.%f[%z \1\2\3,:;]") or
transcription:match("\1%f[%z \2\3,:;]") or
transcription:match("\2%f[%z \1\3,:;]") or
transcription:match("\3[:;]") or
transcription:match("%f[^%z \1\2\3,]%.")
) and true or false
end
--[==[
Format a line of one or more bare IPA pronunciations (i.e. without any preceding {"IPA:"} and without adding to a
category ` ``lang`` terms with IPA pronunciation`). Individual pronunciations are formatted using
{format_IPA()} and are combined with separators, qualifiers, pre-text, post-text, etc. to form a line of pronunciations.
Parameters accepted are:
* `lang` is an object representing the language of the pronunciations, which is used when adding cleanup categories for
pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to
add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); and for computing the
proper sort keys for categories. `lang` may be {nil}.
* `items` is a list of pronunciations, each of which is an object with the following properties:
** `pron`: the pronunciation, in the same format as is accepted by {format_IPA()}, i.e. it should be either phonemic
(surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}) or a rhyme
(beginning with a hyphen);
** `pretext`: text to display directly before the formatted pronunciation, inside of any qualifiers or accent
qualifiers;
** `posttext`: text to display directly after the formatted pronunciation, inside of any qualifiers or accent
qualifiers;
** `q` or `qualifiers`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted
pronunciation; note that `qualifiers` is deprecated;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation;
** `refs`: {nil} or a list of references or reference specs to add after the pronunciation and any posttext and
qualifiers; the value of a list item is either a string containing the reference text (typically a call to a
citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text`
(the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}}
or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in
{{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section;
** `gloss`: {nil} or a gloss (definition) for this item, if different definitions have different pronunciations;
** `pos`: {nil} or a part of speech for this item, if different parts of speech have different pronunciations;
** `separator`: the separator text to insert directly before the formatted pronunciation and all qualifiers, accent
qualifiers and pre-text; defaults to the outer `separator` parameter.
* `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the
first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in
`items`.
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that
only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a
given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup
categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them.
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category
strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If
`split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.
]==]
function export.format_IPA_multiple(lang, items, separator, no_count, split_output)
local categories = {}
separator = separator or ", "
if not lang then
track("format-multiple-nolang")
else
assert_not_etymology_only_lang(lang)
end
-- Format
if not items[1] then
if namespace == "साँचा" then
insert(items, {pron = "/aɪ piː ˈeɪ/"})
else
insert(categories, "Pronunciation templates without a pronunciation")
end
end
local bits = {}
for i, item in ipairs(items) do
local bit
-- If the pronunciation is entirely empty, allow this and don't do anything, so that e.g. the pretext and/or
-- posttext can be specified to force something like ''unknown'' to appear in place of the pronunciation
-- (as happens e.g. when ? is used as a respelling in [[Module:ca-IPA]]; see [[guèiser]] for an example).
if item.pron == "" then
bit = ""
else
local item_categories, errtext
bit, item_categories, errtext = export.format_IPA(lang, item.pron, "raw")
bit = bit .. errtext
for _, cat in ipairs(item_categories) do
insert(categories, cat)
end
end
if item.pretext then
bit = item.pretext .. bit
end
if item.posttext then
bit = bit .. item.posttext
end
local has_qualifiers = item.q and item.q[1] or item.qq and item.qq[1] or item.qualifiers and item.qualifiers[1]
or item.a and item.a[1] or item.aa and item.aa[1]
local has_gloss_or_pos = item.gloss or item.pos
if has_qualifiers or has_gloss_or_pos then
-- FIXME: Currently we tack the gloss and POS (in that order) onto the end of the regular left qualifiers.
-- Should we do something different?
local q = item.q
if has_gloss_or_pos then
q = mw.clone(item.q) or {}
if item.gloss then
local m_qualifier = require(qualifier_module)
insert(q, m_qualifier.wrap_qualifier_css("“", "quote") .. item.gloss ..
m_qualifier.wrap_qualifier_css("”", "quote"))
end
if item.pos then
-- FIXME: Consider expanding aliases as found in [[Module:headword/data]] or similar.
insert(q, item.pos)
end
end
bit = require("Module:pron qualifier").format_qualifiers {
lang = lang,
text = bit,
q = q,
qq = item.qq,
qualifiers = item.qualifiers,
a = item.a,
aa = item.aa,
}
end
if item.note then
-- Support removed on 2024-06-15.
error("Support for `.note` has been removed; switch to `.refs` (which must be a list)")
end
if item.refs then
local refspecs = item.refs
if #refspecs > 0 then
bit = bit .. require(references_module).format_references(refspecs)
end
end
bit = (item.separator or (i == 1 and "" or separator)) .. bit
insert(bits, bit)
--[=[ [[Special:WhatLinksHere/Wiktionary:Tracking/IPA/syntax-error]]
The length or gemination symbol should not appear after a syllable break or stress symbol. ]=]
-- The nature of the following pattern match is such that we don't have to split a combined '/.../ [...]' spec
-- into its parts in order to process.
if match(item.pron, "[.\203][\136\140]?\203[\144\145]") then -- [.ˈˌ][ːˑ]
track("syntax-error")
end
if lang then
-- Add syllable count if the language's diphthongs are listed in [[Module:syllables]].
-- Don't do this if the term has spaces, a liaison mark (‿) or isn't in mainspace.
if not no_count and namespace == "" then
m_syllables = m_syllables or require(syllables_module)
local langcode = lang:getCode()
if m_data.langs_to_generate_syllable_count_categories[langcode] then
local raw_phonemic, phonetic, use_it = split_phonemic_phonetic(item.pron)
local phonemic, repr = determine_repr(raw_phonemic)
if not phonetic then -- not a '/.../ [...]' combined pronunciation
if m_data.langs_to_use_phonetic_or_phonemic_notation[langcode] then
use_it = phonemic
elseif m_data.langs_to_use_phonetic_notation[langcode] then
use_it = repr == "phonetic" and phonemic or nil
else
use_it = repr == "phonemic" and phonemic or nil
end
elseif repr == "phonetic" then
use_it = phonetic
elseif repr == "phonemic" then
use_it = phonemic
end
-- Note: two uses of find with plain patterns is much faster than umatch with [ ‿].
if use_it and not (find(use_it, " ") or find(use_it, "‿")) then
local syllable_count = m_syllables.getVowels(use_it, lang)
if syllable_count then
insert(categories, lang:getCanonicalName() .. " " .. syllable_count ..
"-सिलेबल शब्द")
end
end
end
end
end
end
return process_maybe_split_categories(split_output, categories, concat(bits), lang)
end
--[=[
Format a single IPA pronunciation, which cannot be a combined spec (such as {/.../ [...]}). This has been extracted from
{format_IPA()} to allow the latter to handle such combined specs. This works like {format_IPA()} but requires that
pre-created {err} (for error messages) and {categories} lists be passed in, and adds any generated error messages and
categories to those lists. A single value is returned, the pronunciation, which is usually the same as passed in, but
may have HTML added surrounding invalid characters so they appear in red.
]=]
local function format_one_IPA(lang, raw_pron, err, categories)
-- Disallow wikilinks.
if match(raw_pron, "%[%[.-%]%]") then
error("IPA input must not contain wikilinks.")
end
raw_pron = decode_entities(raw_pron)
-- Detect the type of transcription.
local pron, repr, opening, closing, reconstructed = determine_repr(raw_pron)
-- Strip any reconstruction asterisk and representation marks.
pron = sub(pron, #opening + 1 + (reconstructed and 1 or 0), -#closing - 1)
if not repr then
insert(categories, "IPA pronunciations with invalid representation marks")
-- insert(err, "invalid representation marks")
-- Removed because it's annoying when previewing pronunciation pages.
end
if repr ~= "orthographic" and lang and lang:getCode() == "en" and hasInvalidSeparators(pron) then
insert(categories, "English IPA pronunciations with invalid separators")
end
if pron == "" then
insert(categories, "IPA pronunciations with no pronunciation present")
end
-- Check for obsolete and nonstandard symbols
for _, symbol in ipairs(m_data.nonstandard) do
local result
for nonstandard in gmatch(pron, symbol) do
if not result then
result = {}
end
insert(result, nonstandard)
insert(categories,
{cat = "IPA pronunciations with obsolete or nonstandard characters", sort_key = nonstandard}
)
end
if result then
insert(err, "obsolete or nonstandard characters (" .. concat(result) .. ")")
break
end
end
--[[ Check for invalid symbols after removing the following:
1. wikilinks (handled above)
2. paired HTML tags
3. bolding
4. italics
5. asterisk at beginning of transcription
6. comma followed by spacing characters
7. superscripts enclosed in superscript parentheses ]]
local found_HTML
local result = gsub(pron, "<(%a+)[^>]*>([^<]+)</%1>",
function(tagName, content)
found_HTML = true
return content
end)
result = gsub(result, "'''([^']*)'''", "%1")
result = gsub(result, "''([^']*)''", "%1")
result = gsub(result, "^%*", "")
result = ugsub(result, ",%s+", "")
-- VS15
local vs15_class = "[" .. m_symbols.add_vs15 .. "]"
if umatch(pron, vs15_class) then
local vs15 = u(0xFE0E)
if find(result, vs15) then
result = gsub(result, vs15, "")
pron = gsub(pron, vs15, "")
end
pron = ugsub(pron, vs15_class, "%0" .. vs15)
end
if result ~= "" then
local content_page = is_content_page(lang, namespace)
if lang then
-- Get the per_lang_valid data, and convert any per-language valid sequences to spaces.
local per_lang_valid = m_symbols.per_lang_valid[lang:getCode()]
if per_lang_valid then
if type(per_lang_valid) == "table" then
for _, pattern in pairs(per_lang_valid) do
result = ugsub(result, pattern, " ")
end
else -- Should be a string.
result = ugsub(result, per_lang_valid, " ")
end
end
end
local suggestions = {}
-- Check for any invalid sequences, excluding anything in the per-language lookup table.
for k, v in pairs(m_symbols.invalid) do
if find(result, k, nil, true) then
insert(suggestions, with_codepoints(k) .. " with " .. with_codepoints(v))
end
end
if suggestions[1] then
local replacements = "replace " .. listToText(suggestions)
if content_page then
error("Invalid IPA: " .. replacements)
end
insert(err, replacements)
end
-- Convert any valid character sequences to spaces
for _, pattern in pairs(m_symbols.valid) do
result = ugsub(result, pattern, " ")
end
if not match(result, "^ *$") then
local category = "IPA pronunciations with invalid IPA characters"
if not content_page then
category = category .. "/non_mainspace"
end
insert(categories, category)
insert(err, "invalid IPA characters: " .. with_codepoints(result))
end
end
if found_HTML then
insert(categories, "IPA pronunciations with paired HTML tags")
end
if (repr == "phonemic" or repr == "rhyme") and lang and m_data.phonemes[lang:getCode()] then
local valid_phonemes = m_data.phonemes[lang:getCode()]
local rest = pron
local phonemes = {}
while #rest > 0 do
local longestmatch, longestmatch_len = "", 0
local rest_init = sub(rest, 1, 1)
if rest_init == "(" or rest_init == ")" then
longestmatch = rest_init
longestmatch_len = 1
else
for _, phoneme in ipairs(valid_phonemes) do
local phoneme_len = len(phoneme)
if phoneme_len > longestmatch_len and usub(rest, 1, phoneme_len) == phoneme then
longestmatch = phoneme
longestmatch_len = len(longestmatch)
end
end
end
if longestmatch_len > 0 then
insert(phonemes, longestmatch)
rest = usub(rest, longestmatch_len + 1)
else
local phoneme = usub(rest, 1, 1)
insert(phonemes, "<span style=\"color: var(--wikt-palette-red,red)\">" .. phoneme .. "</span>")
rest = usub(rest, 2)
insert(categories, "IPA pronunciations with invalid phonemes/" .. lang:getCode())
track("invalid phonemes/" .. phoneme)
end
end
pron = concat(phonemes)
end
return (reconstructed and "*" or "") .. opening .. pron .. closing
end
--[==[
Format an IPA pronunciation. This wraps the pronunciation in appropriate CSS classes and adds cleanup categories and
error messages as needed. The pronunciation `pron` should be either phonemic (surrounded by {/.../}), phonetic
(surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}), a rhyme (beginning with a hyphen) or a combined
phonemic/phonetic spec (of the form {/.../ [...]}). `lang` indicates the language of the pronunciation and can be {nil}.
If not {nil}, and the specified language has data in [[Module:IPA/data]] indicating the allowed phonemes, then the page
will be added to a cleanup category and an error message displayed next to the outputted pronunciation. Note that {lang}
also determines sort key processing in the added cleanup categories. If `split_output` is not given, the return value is
a concatenation of the formatted pronunciation, error messages and formatted cleanup categories. Otherwise, three values
are returned: the formatted pronunciation, the cleanup categories and the concatenated error messages. If `split_output`
is the value {"raw"}, the cleanup categories are returned in list form, where the list elements are a combination of
category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]].
If `split_output` is any other value besides {nil}, the cleanup categories are returned as a pre-formatted concatenated
string.
]==]
function export.format_IPA(lang, pron, split_output)
local err = {}
local categories = {}
-- `pron` shouldn't contain ref tags.
if match(pron, "\127'\"`UNIQ%-%-ref%-[%dA-F]+%-QINU`\"'\127") then
error("<ref> tags found inside pronunciation parameter.")
end
if not lang then
track("format-nolang")
else
assert_not_etymology_only_lang(lang)
end
local phonemic, phonetic = split_phonemic_phonetic(pron)
pron = format_one_IPA(lang, phonemic, err, categories)
if phonetic then
track("phonemic-phonetic") -- There's no benefit to supporting the "/.../ [...]" format within one parameter.
phonetic = format_one_IPA(lang, phonetic, err, categories)
pron = pron .. " " .. phonetic
end
if err[1] and is_preview() then
err = '<span class="error" style="font-size: small;> ' .. concat(err, ", ") .. "</span>"
else
err = ""
end
return process_maybe_split_categories(split_output, categories, '<span class="IPA nowrap">' .. pron .. "</span>", lang,
err)
end
--[==[
Format a line of one or more enPR pronunciations as {{tl|enPR}} would do it, i.e. with a preceding {"enPR:"} (linked to
[[Appendix:English pronunciation]]) followed by one or more formatted, comma-separated enPR pronunciations. The
pronunciations are formatted by wrapping them in the `AHD` and `enPR` CSS classes and adding any left and
right regular and accent qualifiers. In addition, the overall result is wrapped in any overall left and right regular
and accent qualifiers. There is a single parameter `data`, an object with the following fields:
* `items` is a list of enPR pronunciations, each of which is an object with the following properties:
** `pron`: the enPR pronunciation;
** `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation.
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted
pronunciations and preceding {"enPR:"}.
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted
pronunciations and preceding {"enPR:"}.
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.
]==]
function export.format_enPR_full(data)
local prefix = "[[:English pronunciation|enPR]]: "
local lang = require("Module:languages").getByCode("en")
local parts = {}
for _, item in ipairs(data.items) do
local part = '<span class="AHD enPR">' .. item.pron .. "</span>"
if item.q and item.q[1] or item.qq and item.qq[1] or item.a and item.a[1] or item.aa and item.aa[1] then
part = require("Module:pron qualifier").format_qualifiers {
lang = lang,
text = part,
q = item.q,
qq = item.qq,
a = item.a,
aa = item.aa,
}
end
insert(parts, part)
end
local prontext = prefix .. concat(parts, ", ")
if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then
prontext = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = prontext,
q = data.q,
qq = data.qq,
a = data.a,
aa = data.aa,
}
end
return prontext
end
return export
cbqohhv5z2dkjwwscddlkstt9gy4709
487774
487773
2026-09-02T16:57:25Z
SM7
6218
localization...
487774
Scribunto
text/plain
local export = {}
local force_cat = false -- for testing
local pages_module = "Module:pages"
local pron_qualifier_module = "Module:pron qualifier"
local qualifier_module = "Module:qualifier"
local references_module = "Module:references"
local string_utilities_module = "Module:string utilities"
local syllables_module = "Module:syllables"
local utilities_module = "Module:utilities"
local m_data = mw.loadData("Module:IPA/data")
local m_str_utils = require(string_utilities_module)
local m_syllables -- [[Module:syllables]]; loaded below if needed
local m_symbols = mw.loadData("Module:IPA/data/symbols")
local concat = table.concat
local decode_entities = m_str_utils.decode_entities
local find = string.find
local gcodepoint = m_str_utils.gcodepoint
local gmatch = m_str_utils.gmatch
local gsub = string.gsub
local insert = table.insert
local is_preview = require(pages_module).is_preview
local len = m_str_utils.len
local listToText = mw.text.listToText
local match = string.match
local pattern_escape = m_str_utils.pattern_escape
local sub = string.sub
local u = m_str_utils.char
local ugsub = m_str_utils.gsub
local umatch = m_str_utils.match
local usub = m_str_utils.sub
local function with_codepoints(s)
if find(s, "%S%s") then
local parts = {}
for ch in gmatch(s, "%S") do
parts[#parts + 1] = with_codepoints(ch)
end
return concat(parts, ", ")
end
local cps = {}
for cp in gcodepoint(s) do
cps[#cps + 1] = ("U+%04X"):format(cp)
end
return s .. " [" .. concat(cps, " ") .. "]"
end
local namespace = mw.title.getCurrentTitle().nsText
local function is_content_page(lang, namespace)
return namespace == "" or namespace == "Reconstruction" or
lang and lang:hasType("appendix-constructed") and namespace == "Appendix"
end
-- Etymology-only languages are not L2 entry languages; IPA should use the parent full language.
local function assert_not_etymology_only_lang(lang)
if lang and lang.hasType and lang:hasType("language", "etymology-only") then
local parent_code = lang.getParentCode and lang:getParentCode() or nil
error(("Cannot use IPA with the etymology-only language %q; use the parent full language %q instead."):format(lang:getCode(), parent_code))
end
end
local function track(page)
require("Module:debug/track")("IPA/" .. page)
return true
end
local function process_maybe_split_categories(split_output, categories, prontext, lang, errtext)
if split_output ~= "raw" then
if categories[1] then
categories = require(utilities_module).format_categories(categories, lang, nil, nil, force_cat)
else
categories = ""
end
end
if split_output then -- for use of IPA in links, etc.
if errtext then
return prontext, categories, errtext
else
return prontext, categories
end
else
return prontext .. (errtext or "") .. categories
end
end
--[==[
Format a line of one or more IPA pronunciations as {{tl|IPA}} would do it, i.e. with a preceding {"IPA:"} followed by
the word {"key"} linking to an Appendix page describing the language's phonology, and with an added category
` ``lang`` terms with IPA pronunciation`. Other than the extra preceding text and category, this is identical
to {format_IPA_multiple()}, and the considerations described there in the documentation apply here as well. There is a
single parameter `data`, an object with the following fields:
* `lang`: Object representing the language of the pronunciations, which is used when adding cleanup categories for
pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to
add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); for adding a category
` ``lang`` terms with IPA pronunciation`; and for determining the proper sort keys for categories. Unlike
for {format_IPA_multiple()}, `lang` may not be {nil}.
* `items`: List of pronunciations, in exactly the same format as for {format_IPA_multiple()}.
* `err`: If not {nil}, a string containing an error message to use in place of the link to the language's phonology.
* `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the
first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in
`items`.
* `sort_key`: Explicit sort key used for categories.
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that
only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a
given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup
or other categories. If you need them suppressed, use `split_output` to return the categories separately and ignore
them.
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category
strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If
`split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.
* `include_langname`: If specified, prefix the result with the language name, followed by a colon.
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted
pronunciations and preceding {"IPA:"}.
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted
pronunciations and preceding {"IPA:"}.
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.
]==]
function export.format_IPA_full(data)
if type(data) ~= "table" or data.getCode then
error("Must now supply a table of arguments to format_IPA_full(); first argument should be that table, not a language object")
end
local lang = data.lang
local items = data.items
local err = data.err
local separator = data.separator
local sort_key = data.sort_key
local no_count = data.no_count
local split_output = data.split_output
local q = data.q
local qq = data.qq
local a = data.a
local aa = data.aa
local include_langname = data.include_langname
local hasKey = m_data.langs_with_infopages
if not lang or not lang.getCode then
error("Must specify language to format_IPA_full()")
end
assert_not_etymology_only_lang(lang)
local langname = lang:getCanonicalName()
local prefix_text
if err then
prefix_text = '<span class="error">' .. err .. '</span>'
else
if hasKey[lang:getCode()] then
prefix_text = "विक्षनरी:" .. langname .. " उच्चारण"
else
prefix_text = "विकिपीडिया:" .. langname .. " ध्वनिविज्ञान"
end
prefix_text = "[[" .. prefix_text .. "|कुंजी]]"
end
local prefix = "[[विक्षनरी:अंतर्राष्ट्रीय ध्वन्यात्मक वर्णमाला|आईपीए]]<sup>(" .. prefix_text .. ")</sup>: "
local IPAs, categories = export.format_IPA_multiple(lang, items, separator, no_count, "raw")
if is_content_page(lang, namespace) then
insert(categories, {
cat = langname .. " टर्म आईपीए उच्चारण के साथ",
sort_key = sort_key
})
end
local prontext = prefix .. IPAs
if q and q[1] or qq and qq[1] or a and a[1] or aa and aa[1] then
prontext = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = prontext,
q = q,
qq = qq,
a = a,
aa = aa,
}
end
if include_langname then
prontext = langname .. ": " .. prontext
end
return process_maybe_split_categories(split_output, categories, prontext, lang)
end
local function split_phonemic_phonetic(pron)
local reconstructed, phonemic, phonetic = match(pron, "^(%*?)(/.-/)%s+(%[.-%])$")
if reconstructed then
return reconstructed .. phonemic, reconstructed .. phonetic
else
return pron, nil
end
end
local function determine_repr(pron)
local reconstructed
-- Temporarily remove any initial asterisk before representation marks,
-- which avoids having to account for it in the data, but set the
-- `reconstructed` flag.
if sub(pron, 1, 1) == "*" then
reconstructed = true
pron = sub(pron, 2)
end
-- Some representation types have aliases for convenience (e.g. "// //" is
-- an alias for "⫽ ⫽"). and these need to be substituted in before checking
-- for other data.
local opening, n = match(pron, "^.[\128-\191]*")
local subs_data = m_data.representation_subs[opening]
if subs_data then
pron, n = ugsub(pron, subs_data[1], subs_data[2])
-- If the substitution was made, `opening` needs to be changed to the
-- new opening character.
if n ~= 0 then
opening = subs_data[3]
end
end
-- Get the type data based on the opening character (if any), and set the
-- representation type if the closing character matches.
local type_data, repr, closing = m_data.representation_types[opening]
if type_data then
closing = type_data[2]
if type_data and match(pron, pattern_escape(closing) .. "$", #opening + 1) then
repr = type_data[1]
end
end
-- Default to the empty string.
if not repr then
opening, closing = "", ""
end
-- Reattach the asterisk if reconstructed.
if reconstructed then
pron = "*" .. pron
end
return pron, repr, opening, closing, reconstructed
end
local function hasInvalidSeparators(transcription)
-- Escape certain characters as well as pauses, which have the format "(...)" (with any number of dots), to avoid false-positives.
transcription = transcription:gsub(".[\128-\191]*", m_symbols.separator_escapes)
:gsub("%(%.+%)", "\3")
:gsub("[()]+", "")
return (
transcription:find("..", nil, true) or
transcription:match("%.%f[%z \1\2\3,:;]") or
transcription:match("\1%f[%z \2\3,:;]") or
transcription:match("\2%f[%z \1\3,:;]") or
transcription:match("\3[:;]") or
transcription:match("%f[^%z \1\2\3,]%.")
) and true or false
end
--[==[
Format a line of one or more bare IPA pronunciations (i.e. without any preceding {"IPA:"} and without adding to a
category ` ``lang`` terms with IPA pronunciation`). Individual pronunciations are formatted using
{format_IPA()} and are combined with separators, qualifiers, pre-text, post-text, etc. to form a line of pronunciations.
Parameters accepted are:
* `lang` is an object representing the language of the pronunciations, which is used when adding cleanup categories for
pronunciations with invalid phonemes; for determining how many syllables the pronunciations have in them, in order to
add a category such as [[:Category:Italian 2-syllable words]] (for certain languages only); and for computing the
proper sort keys for categories. `lang` may be {nil}.
* `items` is a list of pronunciations, each of which is an object with the following properties:
** `pron`: the pronunciation, in the same format as is accepted by {format_IPA()}, i.e. it should be either phonemic
(surrounded by {/.../}), phonetic (surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}) or a rhyme
(beginning with a hyphen);
** `pretext`: text to display directly before the formatted pronunciation, inside of any qualifiers or accent
qualifiers;
** `posttext`: text to display directly after the formatted pronunciation, inside of any qualifiers or accent
qualifiers;
** `q` or `qualifiers`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted
pronunciation; note that `qualifiers` is deprecated;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation;
** `refs`: {nil} or a list of references or reference specs to add after the pronunciation and any posttext and
qualifiers; the value of a list item is either a string containing the reference text (typically a call to a
citation template such as {{tl|cite-book}}, or a template wrapping such a call), or an object with fields `text`
(the reference text), `name` (the name of the reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}}
or {{cd|<nowiki><ref name="foo" /></nowiki>}}) and/or `group` (the group of the reference, as in
{{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section;
** `gloss`: {nil} or a gloss (definition) for this item, if different definitions have different pronunciations;
** `pos`: {nil} or a part of speech for this item, if different parts of speech have different pronunciations;
** `separator`: the separator text to insert directly before the formatted pronunciation and all qualifiers, accent
qualifiers and pre-text; defaults to the outer `separator` parameter.
* `separator`: The default separator to use when separating formatted items. Defaults to {", "}. Does not apply to the
first item, where the default separator is always the empty string. Overridden by the per-item `separator` field in
`items`.
* `no_count`: Suppress adding a {#-syllable words} category such as [[:Category:Italian 2-syllable words]]. Note that
only certain languages add such categories to begin with, because it depends on knowing how to count syllables in a
given language, which depends on the phonology of the language. Also, this does not suppress the addition of cleanup
categories. If you need them suppressed, use `split_output` to return the categories separately and ignore them.
* `split_output`: If not given, the return value is a concatenation of the formatted pronunciation and formatted
categories. Otherwise, two values are returned: the formatted pronunciation and the categories. If `split_output` is
the value {"raw"}, the categories are returned in list form, where the list elements are a combination of category
strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]]. If
`split_output` is any other value besides {nil}, the categories are returned as a pre-formatted concatenated string.
]==]
function export.format_IPA_multiple(lang, items, separator, no_count, split_output)
local categories = {}
separator = separator or ", "
if not lang then
track("format-multiple-nolang")
else
assert_not_etymology_only_lang(lang)
end
-- Format
if not items[1] then
if namespace == "साँचा" then
insert(items, {pron = "/aɪ piː ˈeɪ/"})
else
insert(categories, "Pronunciation templates without a pronunciation")
end
end
local bits = {}
for i, item in ipairs(items) do
local bit
-- If the pronunciation is entirely empty, allow this and don't do anything, so that e.g. the pretext and/or
-- posttext can be specified to force something like ''unknown'' to appear in place of the pronunciation
-- (as happens e.g. when ? is used as a respelling in [[Module:ca-IPA]]; see [[guèiser]] for an example).
if item.pron == "" then
bit = ""
else
local item_categories, errtext
bit, item_categories, errtext = export.format_IPA(lang, item.pron, "raw")
bit = bit .. errtext
for _, cat in ipairs(item_categories) do
insert(categories, cat)
end
end
if item.pretext then
bit = item.pretext .. bit
end
if item.posttext then
bit = bit .. item.posttext
end
local has_qualifiers = item.q and item.q[1] or item.qq and item.qq[1] or item.qualifiers and item.qualifiers[1]
or item.a and item.a[1] or item.aa and item.aa[1]
local has_gloss_or_pos = item.gloss or item.pos
if has_qualifiers or has_gloss_or_pos then
-- FIXME: Currently we tack the gloss and POS (in that order) onto the end of the regular left qualifiers.
-- Should we do something different?
local q = item.q
if has_gloss_or_pos then
q = mw.clone(item.q) or {}
if item.gloss then
local m_qualifier = require(qualifier_module)
insert(q, m_qualifier.wrap_qualifier_css("“", "quote") .. item.gloss ..
m_qualifier.wrap_qualifier_css("”", "quote"))
end
if item.pos then
-- FIXME: Consider expanding aliases as found in [[Module:headword/data]] or similar.
insert(q, item.pos)
end
end
bit = require("Module:pron qualifier").format_qualifiers {
lang = lang,
text = bit,
q = q,
qq = item.qq,
qualifiers = item.qualifiers,
a = item.a,
aa = item.aa,
}
end
if item.note then
-- Support removed on 2024-06-15.
error("Support for `.note` has been removed; switch to `.refs` (which must be a list)")
end
if item.refs then
local refspecs = item.refs
if #refspecs > 0 then
bit = bit .. require(references_module).format_references(refspecs)
end
end
bit = (item.separator or (i == 1 and "" or separator)) .. bit
insert(bits, bit)
--[=[ [[Special:WhatLinksHere/Wiktionary:Tracking/IPA/syntax-error]]
The length or gemination symbol should not appear after a syllable break or stress symbol. ]=]
-- The nature of the following pattern match is such that we don't have to split a combined '/.../ [...]' spec
-- into its parts in order to process.
if match(item.pron, "[.\203][\136\140]?\203[\144\145]") then -- [.ˈˌ][ːˑ]
track("syntax-error")
end
if lang then
-- Add syllable count if the language's diphthongs are listed in [[Module:syllables]].
-- Don't do this if the term has spaces, a liaison mark (‿) or isn't in mainspace.
if not no_count and namespace == "" then
m_syllables = m_syllables or require(syllables_module)
local langcode = lang:getCode()
if m_data.langs_to_generate_syllable_count_categories[langcode] then
local raw_phonemic, phonetic, use_it = split_phonemic_phonetic(item.pron)
local phonemic, repr = determine_repr(raw_phonemic)
if not phonetic then -- not a '/.../ [...]' combined pronunciation
if m_data.langs_to_use_phonetic_or_phonemic_notation[langcode] then
use_it = phonemic
elseif m_data.langs_to_use_phonetic_notation[langcode] then
use_it = repr == "phonetic" and phonemic or nil
else
use_it = repr == "phonemic" and phonemic or nil
end
elseif repr == "phonetic" then
use_it = phonetic
elseif repr == "phonemic" then
use_it = phonemic
end
-- Note: two uses of find with plain patterns is much faster than umatch with [ ‿].
if use_it and not (find(use_it, " ") or find(use_it, "‿")) then
local syllable_count = m_syllables.getVowels(use_it, lang)
if syllable_count then
insert(categories, lang:getCanonicalName() .. " " .. syllable_count ..
"-सिलेबल शब्द")
end
end
end
end
end
end
return process_maybe_split_categories(split_output, categories, concat(bits), lang)
end
--[=[
Format a single IPA pronunciation, which cannot be a combined spec (such as {/.../ [...]}). This has been extracted from
{format_IPA()} to allow the latter to handle such combined specs. This works like {format_IPA()} but requires that
pre-created {err} (for error messages) and {categories} lists be passed in, and adds any generated error messages and
categories to those lists. A single value is returned, the pronunciation, which is usually the same as passed in, but
may have HTML added surrounding invalid characters so they appear in red.
]=]
local function format_one_IPA(lang, raw_pron, err, categories)
-- Disallow wikilinks.
if match(raw_pron, "%[%[.-%]%]") then
error("IPA input must not contain wikilinks.")
end
raw_pron = decode_entities(raw_pron)
-- Detect the type of transcription.
local pron, repr, opening, closing, reconstructed = determine_repr(raw_pron)
-- Strip any reconstruction asterisk and representation marks.
pron = sub(pron, #opening + 1 + (reconstructed and 1 or 0), -#closing - 1)
if not repr then
insert(categories, "IPA pronunciations with invalid representation marks")
-- insert(err, "invalid representation marks")
-- Removed because it's annoying when previewing pronunciation pages.
end
if repr ~= "orthographic" and lang and lang:getCode() == "en" and hasInvalidSeparators(pron) then
insert(categories, "English IPA pronunciations with invalid separators")
end
if pron == "" then
insert(categories, "IPA pronunciations with no pronunciation present")
end
-- Check for obsolete and nonstandard symbols
for _, symbol in ipairs(m_data.nonstandard) do
local result
for nonstandard in gmatch(pron, symbol) do
if not result then
result = {}
end
insert(result, nonstandard)
insert(categories,
{cat = "IPA pronunciations with obsolete or nonstandard characters", sort_key = nonstandard}
)
end
if result then
insert(err, "obsolete or nonstandard characters (" .. concat(result) .. ")")
break
end
end
--[[ Check for invalid symbols after removing the following:
1. wikilinks (handled above)
2. paired HTML tags
3. bolding
4. italics
5. asterisk at beginning of transcription
6. comma followed by spacing characters
7. superscripts enclosed in superscript parentheses ]]
local found_HTML
local result = gsub(pron, "<(%a+)[^>]*>([^<]+)</%1>",
function(tagName, content)
found_HTML = true
return content
end)
result = gsub(result, "'''([^']*)'''", "%1")
result = gsub(result, "''([^']*)''", "%1")
result = gsub(result, "^%*", "")
result = ugsub(result, ",%s+", "")
-- VS15
local vs15_class = "[" .. m_symbols.add_vs15 .. "]"
if umatch(pron, vs15_class) then
local vs15 = u(0xFE0E)
if find(result, vs15) then
result = gsub(result, vs15, "")
pron = gsub(pron, vs15, "")
end
pron = ugsub(pron, vs15_class, "%0" .. vs15)
end
if result ~= "" then
local content_page = is_content_page(lang, namespace)
if lang then
-- Get the per_lang_valid data, and convert any per-language valid sequences to spaces.
local per_lang_valid = m_symbols.per_lang_valid[lang:getCode()]
if per_lang_valid then
if type(per_lang_valid) == "table" then
for _, pattern in pairs(per_lang_valid) do
result = ugsub(result, pattern, " ")
end
else -- Should be a string.
result = ugsub(result, per_lang_valid, " ")
end
end
end
local suggestions = {}
-- Check for any invalid sequences, excluding anything in the per-language lookup table.
for k, v in pairs(m_symbols.invalid) do
if find(result, k, nil, true) then
insert(suggestions, with_codepoints(k) .. " with " .. with_codepoints(v))
end
end
if suggestions[1] then
local replacements = "replace " .. listToText(suggestions)
if content_page then
error("Invalid IPA: " .. replacements)
end
insert(err, replacements)
end
-- Convert any valid character sequences to spaces
for _, pattern in pairs(m_symbols.valid) do
result = ugsub(result, pattern, " ")
end
if not match(result, "^ *$") then
local category = "IPA pronunciations with invalid IPA characters"
if not content_page then
category = category .. "/non_mainspace"
end
insert(categories, category)
insert(err, "invalid IPA characters: " .. with_codepoints(result))
end
end
if found_HTML then
insert(categories, "IPA pronunciations with paired HTML tags")
end
if (repr == "phonemic" or repr == "rhyme") and lang and m_data.phonemes[lang:getCode()] then
local valid_phonemes = m_data.phonemes[lang:getCode()]
local rest = pron
local phonemes = {}
while #rest > 0 do
local longestmatch, longestmatch_len = "", 0
local rest_init = sub(rest, 1, 1)
if rest_init == "(" or rest_init == ")" then
longestmatch = rest_init
longestmatch_len = 1
else
for _, phoneme in ipairs(valid_phonemes) do
local phoneme_len = len(phoneme)
if phoneme_len > longestmatch_len and usub(rest, 1, phoneme_len) == phoneme then
longestmatch = phoneme
longestmatch_len = len(longestmatch)
end
end
end
if longestmatch_len > 0 then
insert(phonemes, longestmatch)
rest = usub(rest, longestmatch_len + 1)
else
local phoneme = usub(rest, 1, 1)
insert(phonemes, "<span style=\"color: var(--wikt-palette-red,red)\">" .. phoneme .. "</span>")
rest = usub(rest, 2)
insert(categories, "IPA pronunciations with invalid phonemes/" .. lang:getCode())
track("invalid phonemes/" .. phoneme)
end
end
pron = concat(phonemes)
end
return (reconstructed and "*" or "") .. opening .. pron .. closing
end
--[==[
Format an IPA pronunciation. This wraps the pronunciation in appropriate CSS classes and adds cleanup categories and
error messages as needed. The pronunciation `pron` should be either phonemic (surrounded by {/.../}), phonetic
(surrounded by {[...]}), orthographic (surrounded by {⟨...⟩}), a rhyme (beginning with a hyphen) or a combined
phonemic/phonetic spec (of the form {/.../ [...]}). `lang` indicates the language of the pronunciation and can be {nil}.
If not {nil}, and the specified language has data in [[Module:IPA/data]] indicating the allowed phonemes, then the page
will be added to a cleanup category and an error message displayed next to the outputted pronunciation. Note that {lang}
also determines sort key processing in the added cleanup categories. If `split_output` is not given, the return value is
a concatenation of the formatted pronunciation, error messages and formatted cleanup categories. Otherwise, three values
are returned: the formatted pronunciation, the cleanup categories and the concatenated error messages. If `split_output`
is the value {"raw"}, the cleanup categories are returned in list form, where the list elements are a combination of
category strings and category objects of the form suitable for passing to {format_categories()} in [[Module:utilities]].
If `split_output` is any other value besides {nil}, the cleanup categories are returned as a pre-formatted concatenated
string.
]==]
function export.format_IPA(lang, pron, split_output)
local err = {}
local categories = {}
-- `pron` shouldn't contain ref tags.
if match(pron, "\127'\"`UNIQ%-%-ref%-[%dA-F]+%-QINU`\"'\127") then
error("<ref> tags found inside pronunciation parameter.")
end
if not lang then
track("format-nolang")
else
assert_not_etymology_only_lang(lang)
end
local phonemic, phonetic = split_phonemic_phonetic(pron)
pron = format_one_IPA(lang, phonemic, err, categories)
if phonetic then
track("phonemic-phonetic") -- There's no benefit to supporting the "/.../ [...]" format within one parameter.
phonetic = format_one_IPA(lang, phonetic, err, categories)
pron = pron .. " " .. phonetic
end
if err[1] and is_preview() then
err = '<span class="error" style="font-size: small;> ' .. concat(err, ", ") .. "</span>"
else
err = ""
end
return process_maybe_split_categories(split_output, categories, '<span class="IPA nowrap">' .. pron .. "</span>", lang,
err)
end
--[==[
Format a line of one or more enPR pronunciations as {{tl|enPR}} would do it, i.e. with a preceding {"enPR:"} (linked to
[[Appendix:English pronunciation]]) followed by one or more formatted, comma-separated enPR pronunciations. The
pronunciations are formatted by wrapping them in the `AHD` and `enPR` CSS classes and adding any left and
right regular and accent qualifiers. In addition, the overall result is wrapped in any overall left and right regular
and accent qualifiers. There is a single parameter `data`, an object with the following fields:
* `items` is a list of enPR pronunciations, each of which is an object with the following properties:
** `pron`: the enPR pronunciation;
** `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display before the formatted pronunciation;
** `qq`: {nil} or a list of right qualifiers to display after the formatted pronunciation;
** `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display before the formatted pronunciation;
** `aa`: {nil} or a list of right accent qualifiers to after before the formatted pronunciation.
* `q`: {nil} or a list of left qualifiers (as in {{tl|q}}) to display at the beginning, before the formatted
pronunciations and preceding {"enPR:"}.
* `qq`: {nil} or a list of right qualifiers to display after all formatted pronunciations.
* `a`: {nil} or a list of left accent qualifiers (as in {{tl|a}}) to display at the beginning, before the formatted
pronunciations and preceding {"enPR:"}.
* `aa`: {nil} or a list of right accent qualifiers to display after all formatted pronunciations.
]==]
function export.format_enPR_full(data)
local prefix = "[[:English pronunciation|enPR]]: "
local lang = require("Module:languages").getByCode("en")
local parts = {}
for _, item in ipairs(data.items) do
local part = '<span class="AHD enPR">' .. item.pron .. "</span>"
if item.q and item.q[1] or item.qq and item.qq[1] or item.a and item.a[1] or item.aa and item.aa[1] then
part = require("Module:pron qualifier").format_qualifiers {
lang = lang,
text = part,
q = item.q,
qq = item.qq,
a = item.a,
aa = item.aa,
}
end
insert(parts, part)
end
local prontext = prefix .. concat(parts, ", ")
if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then
prontext = require(pron_qualifier_module).format_qualifiers {
lang = lang,
text = prontext,
q = data.q,
qq = data.qq,
a = data.a,
aa = data.aa,
}
end
return prontext
end
return export
cypbgq0y29f5h73lxp5xmuve1i0nf5o
मॉड्यूल:IPA/data
828
303056
487743
477489
2026-09-02T14:49:49Z
SM7
6218
updating...
487743
Scribunto
text/plain
local list_to_set = require("Module:table").listToSet
local data = {}
--[=[
A list of representation types (e.g. /foo/ for phonemic and [bar] for phonetic),
given as a table. The key is the opening character, the first value the
representation type, and the second value the closing symbol.]=]
data.representation_types = {
["/"] = {"phonemic", "/"},
["["] = {"phonetic", "]"},
["⫽"] = {"morphophonemic", "⫽"},
["⟨"] = {"orthographic", "⟩"},
["-"] = {"rhyme", ""},
}
--[=[
A list of convenience inputs for certain representation types. The key is the
opening character, and the table is a three-item array consisting of (1) an
mw.ustring.gsub pattern which is anchored to the start and end of the string,
with a single capture group that excludes the characters to be substituted,
(2) a corresponding replacement pattern to be used with the pattern, and (3) the
replacement opening character.]=]
data.representation_subs = {
["<"] = {"^<(.*)>$", "⟨%1⟩", "⟨"},
["/"] = {"^//(.*)//$", "⫽%1⫽", "⫽"},
}
--[=[
This should list the language codes of all languages that have a pronunciation
page in the appendix of the form ''Appendix:LANG pronunciation'', e.g.
[[Appendix:Russian pronunciation]]. For these languages, the text "key" next to
the generated pronunciation links to such pages; for other languages, it links
to the "LANG phonology" page in Wikipedia (which may or may not exist).
[[Module:IPA]] is responsible for this linking; see format_IPA_full().]=]
data.langs_with_infopages = list_to_set{
"acw",
"ady",
"ang",
"arc",
"ba",
"bg",
"bo",
"ca",
"cho",
"cmn",
"cs",
"cv",
"cy",
"da",
"de",
"dsb",
"dz",
"egl",
"egy",
"el",
"en",
"enm",
"eo",
"es",
"fa",
"fi",
"fo",
"fr",
"fy",
"ga",
"gd",
"ghc",
"gmh",
"gmw-msc",
"got",
"he",
"hi",
"hrx",
"hu",
"hy",
"id",
"ii",
"is",
"it",
"iu",
"ja",
"jbo",
"ka",
"kls",
"ko",
"kw",
"la",
"lb",
"liv",
"lt",
"lv",
"mdf",
"mfe",
"mic",
"mk",
"mns-nor",
"ms",
"mt",
"mul",
"my",
"nan",
"nci",
"nl",
"nn",
"no",
"nov",
"nv",
"pjt",
"pl",
"ps",
"pt",
"ro",
"ru",
"scn",
"sco",
"sga",
"sh",
"sl",
"sq",
"sv",
"sw",
"syc",
"szl",
"tg",
"th",
"tl",
"tpw",
"tr",
"tyv",
"ug",
"uk",
"vi",
"vo",
"wlm",
"yi",
"yrl",
"yue",
"zlw-mas"
}
--[=[
This should list the diphthongs of a language (in the form of Lua patterns),
provided they do *NOT* contain semivowel symbols such as /j w ɰ ɥ/ or vowels
with nonsyllabic diacritics such as /i̯ u̯/. For example, list /au/ or /aʊ/,
but do not list /aw/ or /au̯/. The data in this table is used to count the
number of syllables in a word. [[Module:syllables]] automatically knows how
to correctly handle semivowel symbols and nonsyllabic diacritics.
Any language listed here will automatically have categories of the form
"LANG #-syllable words" generated. In addition, any language listed below under
`langs_to_generate_syllable_count_categories` will also have such categories
generated.
NOTE: There are some additional languages that have these categories.
For example:
* Thai words have these categories added by [[Module:th-pron]].]=]
data.diphthongs = {
["cs"] = { -- [[w:Czech phonology#Diphthongs]]
"[aeo]u",
},
["de"] = {
"a[ɪʊ]",
"ɔ[ʏɪ]",
},
["en"] = { -- from [[Appendix:English pronunciation]] mostly, but /ʌɪ/ is from the OED
"[aɑæeɛoɔʌ][ɪi]",
"[ɑɒæo]e",
"[əɐ]ʉ",
"[aɒəoɔæ]ʊ",
"æo",
"[ɛeɪiɔʊʉ]ə", -- /iə/ is a diphthong in NZE, but a disyllabic sequence in GA.
-- /ɪə/ is both a disyllabic sequence and a diphthong in old-fashioned RP.
"[aʌ][ʊɪ]ə", -- May be a disyllabic sequence in some or all dialects?
},
["grc"] = {
"[aeyo]i",
"[ae]u",
"[ɛɔa]ː[iu]",
},
["hrx"] = {
"aɪ̯",
"aʊ̯",
"oɪ̯",
"eʊ̯",
},
["is"] = { -- [[w:Icelandic phonology#Vowels]]
"[aeɔœʏ]i", -- diphthongs as the module generates them
"[ao]u", -- diphthongs as the module generates them
"ø[iɪy]", -- additional forms that may occur; Wikipedia is oddly specific about the second element: ei and ai, but øɪ.
},
["it"] = {
"[aeɛoɔu]i",
"[aeɛioɔ]u",
},
["lb"] = {
"[iu]ə",
"[ɜoæɑ]ɪ",
"[əæɑ]ʊ",
},
["lt"] = {
"ɐɪ", "ɒʊ", "ɛɪ", "ɛʊ", "ʊɪ", "ɔɪ", "ɔʊ", -- Simple diphthongs (unstressed forms)
"iɛ", "uɔ", -- Complex diphthongs
"ɑˑɪ", "ɑˑʊ", "æˑɪ", "æˑʊ", "oˑɪ", -- Falling tone (acute)
"ɐɪˑ", "ɒʊˑ", "ɛɪˑ", "ɛʊˑ", "ʊɪˑ", -- Rising tone (tilde) - lengthened second element
-- Note: Mixed diphthongs (e.g., ɐlˑ, æˑn, ʊl, etc.) are omitted since they are inherently monosyllabic
},
}
--[=[
This should list any languages for which categories of the form
"LANG #-syllable words", e.g. [[:Category:Russian 3-syllable words]], should be
generated. Do not list languages here if they have an entry above under
`data.diphthongs`; such languages are automatically added to this list.]=]
local langs_to_generate_syllable_count_categories = list_to_set{
"ar", -- Arabic has diphthongs, but they are transcribed
-- with semivowel symbols.
"ary", -- Moroccan Arabic has diphthongs, but they are transcribed
-- with semivowel symbols.
"bg", -- Bulgarian has diphthongs with /j/ and marginally with /w/,
-- but these are semivowels.
"ca", -- Catalan has diphthongs, but they are generally transcribed using
-- /w/ and /j/, so do not need to be listed (see [[w:Catalan language#Diphthongs and triphthongs]].
"eo",
"es", -- Spanish has diphthongs, but they are transcribed with i̯ etc.
"eu", -- Basque has dipthongs, but they are transcribed with i̯ and u̯.
"fi", -- Finnish has diphthongs, but they are now automatically transcribed with
-- the nonsyllabic diacritic
"fr", -- French has diphthongs, but they are transcribed
-- with semivowel symbols: [[w:French phonology#Glides and diphthongs]].
"hnn",
"id", -- Indonesian has diphthongs, but they are transcribed with i̯ or /j/ etc.
"ka",
"kne",
"kmr",
"ku",
"la", -- All diphthongs transcribed with e̯ or /j/ etc.
"mk",
"ms", -- Malay has diphthongs, but they are transcribed with i̯ or /j/ etc.
"mt", -- Maltese has diphthongs, but they are transcribed
-- with semivowel symbols.
"pl", -- No diphthongs, properly speaking; sequences of a vowel and /w/ or /j/ though.
"pt", -- Portuguese has diphthongs, but they are transcribed with i̯ or /j/ etc.
"rsk", -- No diphthongs but there are sequences of vowel and /j/ or /w/.
"ru", -- No diphthongs, properly speaking; sequences of a vowel and /j/ though.
"sk", -- Slovak has rising diphthongs, /i̯e, i̯a, i̯u, u̯o/, which are probably always spelled with the nonsyllabic diacritic, so do not need to be listed.
"sl", -- No diphthongs, properly speaking; sequences of a vowel, /j/ and /w/ though
"sq", -- [[w:Albanian language#Vowels]] doesn't mention anything about diphthongs.
"szy", -- All diphthongs are transcribed with /j/ or /w/
"tl", -- Tagalog has diphthongs, but they are transcribed with i̯ or /j/ etc
"tsg",
"ug", -- No diphthongs.
}
-- Also add languages listed under `data.diphthongs`.
for langcode, _ in pairs(data.diphthongs) do
langs_to_generate_syllable_count_categories[langcode] = true
end
data.langs_to_generate_syllable_count_categories = langs_to_generate_syllable_count_categories
-- Languages to use the phonetic not phonemic notation to compute syllable counts.
data.langs_to_use_phonetic_notation = list_to_set{
"bg",
"es",
"id",
"la",
"lt",
"mk",
"ms",
"rsk",
"ru",
}
-- Languages to use the phonetic or phonemic notation to compute syllable counts, whichever is available.
data.langs_to_use_phonetic_or_phonemic_notation = list_to_set{
-- [[Module:is-IPA]] generates [...] but many manual pronuns use /.../.
"is",
}
-- Non-standard or obsolete IPA symbols.
data.nonstandard = {
--[[ The following symbols consist of more than one character,
so we can't put them in the line below. ]]
"ɑ̢", "ɔ̗", "ɔ̖",
"[?ƍσƺƪƞƛłščžǰǧǯẋⱻʚω∅ØȣᴀᴇⱻQKPT]"
}
-- See valid IPA characters at [[Module:IPA/data/symbols]].
data.phonemes = {}
data.phonemes["dz"] = {
"m", "n", "ŋ",
"p", "t", "ʈ", "k",
"pʰ", "tʰ", "ʈʰ", "kʰ",
"t͡s", "t͡ɕ",
"t͡sʰ", "t͡ɕʰ",
"w", "s", "z", "ɬ", "l", "r", "ɕ", "ʑ", "j", "h",
"ɑ", "e", "i", "o", "u",
"ɑː", "eː", "ɛː", "iː", "oː", "øː", "uː", "yː",
"ɑ˥", "e˥", "i˥", "o˥", "u˥",
"ɑː˥", "eː˥", "ɛː˥", "iː˥", "oː˥", "øː˥", "uː˥", "yː˥",
"m˥", "n˥", "ŋ˥", "p˥", "k˥", "k̚˥", "w˥", "l˥", "r˥", "ɕ˥", "j˥", ")˥",
"ɑ˩", "e˩", "i˩", "o˩", "u˩",
"ɑː˩", "eː˩", "ɛː˩", "iː˩", "oː˩", "øː˩", "uː˩", "yː˩",
"m˩", "n˩", "ŋ˩", "p˩", "k˩", "k̚˩", "w˩", "l˩", "r˩", "ɕ˩", "j˩", ")˩",
".", ",", "-",
}
data.phonemes["eo"] = {
"a", "b", "d", "d͡ʒ", "d͡z", "e", "f", "h", "i", "j", "k",
"l", "m", "n", "o", "p", "r", "s", "t", "t͡s", "t͡ʃ",
"u", "u̯", "v", "w", "x", "z", "ɡ", "ʃ", "ʒ",
"ˈ", ".", " ", "-", "u̯", "i̯"
}
data.phonemes["hy"] = {
"ɑ", "b", "ɡ", "d", "e", "z", "ə", "tʰ", "ʒ", "i", "l", "χ", "t͡s",
"k", "h", "d͡z", "ʁ", "t͡ʃ", "m", "j", "n", "ʃ", "ɔ", "t͡ʃʰ", "p", "d͡ʒ",
"r", "s", "v", "t", "ɾ", "t͡sʰ", "v", "pʰ", "kʰ", "o", "f", "ŋɡ", "ŋk",
"ŋχ", "u", "œ", "ʏ", "ˈ", "ˌ", ".", " ", "ː",
}
data.phonemes["nl"] = {
"m", "n", "ŋ",
"p", "b", "t", "d", "k", "ɡ",
"f", "v", "s", "z", "ʃ", "ʒ", "x", "ɣ", "ɦ",
"ʋ", "l", "j", "r",
"ɪ", "ʏ", "ɛ", "ə", "ɔ", "ɑ",
"i", "iː", "y", "yː", "u", "uː", "eː", "øː", "oː", "ɛː", "œː", "ɔː", "aː",
"ɛi̯", "œy̯", "ɔi̯", "ɑu̯", "ɑi̯",
"iu̯", "yu̯", "ui̯", "eːu̯", "oːi̯", "aːi̯",
"ˈ", "ˌ", ".", " ", "-",
}
data.phonemes["mt"] = {
"m", "n",
"p", "t", "k", "ʔ",
"b", "d", "ɡ",
"t͡s", "t͡ʃ",
"d͡z", "d͡ʒ",
"f", "s", "ʃ", "ħ",
"v", "z", "ʒ", "ɣ",
"l", "j", "w",
"r",
"ɪ", "ɛ", "ɔ", "a", "u",
"ɛˤ", "ɔˤ", "aˤ", "əˤ",
"ɛˤː", "ɔˤː", "aˤː", "əˤː", "ɪˤː",
"iː", "ɪː", "ɛː", "ɔː", "aː", "uː",
"ˈ", "ˌ", ".", " ", "‿", "-"
}
return data
9j3yfr5dzmr70htnh6pfy97jzb11aph
मॉड्यूल:IPA/data/symbols
828
303057
487744
477490
2026-09-02T14:51:22Z
SM7
6218
updating...
487744
Scribunto
text/plain
local data = {}
--[=[ Valid IPA symbols.
Currently almost all values of "title" and "link" keys
are just the comments that were used in [[Module:IPA]].
The "link" fields should be checked (those that start with an uppercase letter are checked). ]=]
--[=[
local phones = {}
-- Vowels.
phones["i"] = {
close = true,
front = true,
unrounded = true,
vowel = true,
}
phones["e"] = {
["close-mid"] = true,
front = true,
unrounded = true,
vowel = true,
}
phones["ɛ"] = {
["open-mid"] = true,
front = true,
unrounded = true,
vowel = true,
}
phones["æ"] = {
["near-open"] = true,
front = true,
unrounded = true,
vowel = true,
}
phones["a"] = {
open = true,
front = true,
unrounded = true,
vowel = true,
}
phones["y"] = {
close = true,
front = true,
rounded = true,
vowel = true,
}
phones["ø"] = {
["close-mid"] = true,
front = true,
rounded = true,
vowel = true,
}
phones["œ"] = {
["open-mid"] = true,
front = true,
rounded = true,
vowel = true,
}
phones["ɶ"] = {
open = true,
front = true,
rounded = true,
vowel = true,
}
phones["ɪ"] = {
["near-close"] = true,
["near-front"] = true,
unrounded = true,
vowel = true,
}
phones["ʏ"] = {
["near-close"] = true,
["near-front"] = true,
rounded = true,
vowel = true,
}
phones["ɨ"] = {
close = true,
central = true,
unrounded = true,
vowel = true,
}
phones["ᵻ"] = {
["near-close"] = true,
central = true,
unrounded = true,
vowel = true,
}
phones["ɘ"] = {
["close-mid"] = true,
central = true,
unrounded = true,
vowel = true,
}
phones["ɜ"] = {
["open-mid"] = true,
central = true,
unrounded = true,
vowel = true,
}
phones["ɝ"] = {
rhotic = true,
["open-mid"] = true,
central = true,
unrounded = true,
vowel = true,
}
phones["ə"] = {
mid = true,
central = true,
vowel = true,
}
phones["ɚ"] = {
rhotic = true,
mid = true,
central = true,
vowel = true,
}
phones["ɐ"] = {
["near-open"] = true,
central = true,
vowel = true,
}
phones["ʉ"] = {
close = true,
central = true,
rounded = true,
vowel = true,
}
phones["ᵿ"] = {
["near-close"] = true,
central = true,
rounded = true,
vowel = true,
}
phones["ɵ"] = {
["close-mid"] = true,
central = true,
rounded = true,
vowel = true,
}
phones["ɞ"] = {
["open-mid"] = true,
central = true,
rounded = true,
vowel = true,
}
phones["ʊ"] = {
["near-close"] = true,
["near-back"] = true,
rounded = true,
vowel = true,
}
phones["ɯ"] = {
close = true,
back = true,
unrounded = true,
vowel = true,
}
phones["ɤ"] = {
["close-mid"] = true,
back = true,
unrounded = true,
vowel = true,
}
phones["ʌ"] = {
["open-mid"] = true,
back = true,
unrounded = true,
vowel = true,
}
phones["ɑ"] = {
open = true,
back = true,
unrounded = true,
vowel = true,
}
phones["u"] = {
close = true,
back = true,
rounded = true,
vowel = true,
}
phones["o"] = {
["close-mid"] = true,
back = true,
rounded = true,
vowel = true,
}
phones["ɔ"] = {
["open-mid"] = true,
back = true,
rounded = true,
vowel = true,
}
phones["ɒ"] = {
open = true,
back = true,
rounded = true,
vowel = true,
}
-- Nasals.
phones["m"] = {
voiced = true,
bilabial = true,
nasal = true,
}
phones["ɱ"] = {
voiced = true,
labiodental = true,
nasal = true,
}
phones["n"] = {
voiced = true,
alveolar = true,
nasal = true,
}
phones["ɳ"] = {
voiced = true,
retroflex = true,
nasal = true,
}
phones["ɲ"] = {
voiced = true,
palatal = true,
nasal = true,
}
phones["ŋ"] = {
voiced = true,
velar = true,
nasal = true,
}
phones["𝼇"] = {
voiced = true,
velodorsal = true,
nasal = true,
}
phones["ɴ"] = {
voiced = true,
uvular = true,
nasal = true,
}
-- Plosives.
phones["p"] = {
voiceless = true,
bilabial = true,
plosive = true,
}
phones["b"] = {
voiced = true,
bilabial = true,
plosive = true,
}
phones["t"] = {
voiceless = true,
alveolar = true,
plosive = true,
}
phones["d"] = {
voiced = true,
alveolar = true,
plosive = true,
}
phones["ʈ"] = {
voiceless = true,
retroflex = true,
plosive = true,
}
phones["ɖ"] = {
voiced = true,
retroflex = true,
plosive = true,
}
phones["c"] = {
voiceless = true,
palatal = true,
plosive = true,
}
phones["ɟ"] = {
voiced = true,
palatal = true,
plosive = true,
}
phones["k"] = {
voiceless = true,
velar = true,
plosive = true,
}
phones["ɡ"] = {
voiced = true,
velar = true,
plosive = true,
}
phones["𝼃"] = {
voiceless = true,
velodorsal = true,
plosive = true,
}
phones["𝼁"] = {
voiced = true,
velodorsal = true,
plosive = true,
}
phones["q"] = {
voiceless = true,
uvular = true,
plosive = true,
}
phones["ɢ"] = {
voiced = true,
uvular = true,
plosive = true,
}
phones["ꞯ"] = {
voiceless = true,
["upper-pharyngeal"] = true,
plosive = true,
}
phones["𝼂"] = {
voiced = true,
["upper-pharyngeal"] = true,
plosive = true,
}
phones["ʡ"] = {
epiglottal = true,
plosive = true,
}
phones["ʔ"] = {
glottal = true,
plosive = true,
}
-- Fricatives.
phones["ɸ"] = {
voiceless = true,
bilabial = true,
fricative = true,
}
phones["β"] = {
voiced = true,
bilabial = true,
fricative = true,
}
phones["ʍ"] = {
voiceless = true,
["labial-velar"] = true,
fricative = true,
}
phones["f"] = {
voiceless = true,
labiodental = true,
fricative = true,
}
phones["v"] = {
voiced = true,
labiodental = true,
fricative = true,
}
phones["θ"] = {
voiceless = true,
dental = true,
["non-sibilant"] = true,
fricative = true,
}
phones["ð"] = {
voiced = true,
dental = true,
["non-sibilant"] = true,
fricative = true,
}
phones["s"] = {
voiceless = true,
alveolar = true,
sibilant = true,
fricative = true,
}
phones["z"] = {
voiced = true,
alveolar = true,
sibilant = true,
fricative = true,
}
phones["ɬ"] = {
voiceless = true,
alveolar = true,
lateral = true,
fricative = true,
}
phones["ɮ"] = {
voiced = true,
alveolar = true,
lateral = true,
fricative = true,
}
phones["ʃ"] = {
voiceless = true,
postalveolar = true,
sibilant = true,
fricative = true,
}
phones["ʒ"] = {
voiced = true,
postalveolar = true,
sibilant = true,
fricative = true,
}
phones["ʂ"] = {
voiceless = true,
retroflex = true,
sibilant = true,
fricative = true,
}
phones["ʐ"] = {
voiced = true,
retroflex = true,
sibilant = true,
fricative = true,
}
phones["ꞎ"] = {
voiceless = true,
retroflex = true,
lateral = true,
fricative = true,
}
phones["𝼅"] = {
voiced = true,
retroflex = true,
lateral = true,
fricative = true,
}
phones["ɕ"] = {
voiceless = true,
["alveolo-palatal"] = true,
sibilant = true,
fricative = true,
}
phones["ʑ"] = {
voiced = true,
["alveolo-palatal"] = true,
sibilant = true,
fricative = true,
}
phones["ç"] = {
voiceless = true,
palatal = true,
fricative = true,
}
phones["ʝ"] = {
voiced = true,
palatal = true,
fricative = true,
}
phones["𝼆"] = {
voiceless = true,
palatal = true,
lateral = true,
fricative = true,
}
phones["ɧ"] = {
voiceless = true,
["palatal-velar"] = true,
fricative = true,
}
phones["x"] = {
voiceless = true,
velar = true,
fricative = true,
}
phones["ɣ"] = {
voiced = true,
velar = true,
fricative = true,
}
phones["𝼄"] = {
voiceless = true,
velar = true,
lateral = true,
fricative = true,
}
phones["ʩ"] = {
voiceless = true,
velopharyngeal = true,
fricative = true,
}
phones["χ"] = {
voiceless = true,
uvular = true,
fricative = true,
}
phones["ʁ"] = {
voiced = true,
uvular = true,
fricative = true,
}
phones["ħ"] = {
voiceless = true,
pharyngeal = true,
fricative = true,
}
phones["ʕ"] = {
voiced = true,
pharyngeal = true,
fricative = true,
}
phones["ʜ"] = {
voiceless = true,
epiglottal = true,
fricative = true,
}
phones["ʢ"] = {
voiced = true,
epiglottal = true,
fricative = true,
}
phones["h"] = {
voiceless = true,
glottal = true,
fricative = true,
}
phones["ɦ"] = {
voiced = true,
glottal = true,
fricative = true,
}
-- Approximants.
phones["ʋ"] = {
voiced = true,
labiodental = true,
approximant = true,
}
phones["ɥ"] = {
voiced = true,
["labial–palatal"] = true,
approximant = true,
}
phones["w"] = {
voiced = true,
["labial–velar"] = true,
approximant = true,
}
phones["ɹ"] = {
voiced = true,
alveolar = true,
approximant = true,
}
phones["ꭨ"] = {
["velarized or pharyngealized"] = true,
voiced = true,
alveolar = true,
approximant = true,
}
phones["l"] = {
voiced = true,
alveolar = true,
lateral = true,
approximant = true,
}
phones["ɫ"] = {
["velarized or pharyngealized"] = true,
voiced = true,
alveolar = true,
lateral = true,
approximant = true,
}
phones["ɻ"] = {
voiced = true,
retroflex = true,
approximant = true,
}
phones["ɭ"] = {
voiced = true,
retroflex = true,
lateral = true,
approximant = true,
}
phones["j"] = {
voiced = true,
palatal = true,
approximant = true,
}
phones["ʎ"] = {
voiced = true,
palatal = true,
lateral = true,
approximant = true,
}
phones["ɰ"] = {
voiced = true,
velar = true,
approximant = true,
}
phones["ʟ"] = {
voiced = true,
velar = true,
lateral = true,
approximant = true,
}
-- Flaps.
phones["ⱱ"] = {
voiced = true,
labiodental = true,
flap = true,
}
phones["ɾ"] = {
voiced = true,
alveolar = true,
flap = true,
}
phones["ɺ"] = {
voiced = true,
alveolar = true,
lateral = true,
flap = true,
}
phones["ɽ"] = {
voiced = true,
retroflex = true,
flap = true,
}
phones["𝼈"] = {
voiced = true,
retroflex = true,
lateral = true,
flap = true,
}
-- Trills.
phones["ʙ"] = {
voiced = true,
bilabial = true,
trill = true,
}
phones["r"] = {
voiced = true,
alveolar = true,
trill = true,
}
phones["𝼀"] = {
voiceless = true,
velopharyngeal = true,
trill = true,
}
phones["ʀ"] = {
voiced = true,
uvular = true,
trill = true,
}
phones["ᴙ"] = {
voiced = true,
pharyngeal = true,
trill = true,
}
-- Clicks.
phones["ʘ"] = {
bilabial = true,
click = true,
}
phones["ǀ"] = {
dental = true,
click = true,
}
phones["ǃ"] = {
alveolar = true,
click = true,
}
phones["𝼊"] = {
retroflex = true,
click = true,
}
phones["ǂ"] = {
palatal = true,
click = true,
}
phones["ʞ"] = {
velar = true,
click = true,
}
phones["ǁ"] = {
lateral = true,
click = true,
}
-- Implosives.
phones["ɓ"] = {
voiced = true,
bilabial = true,
implosive = true,
}
phones["ɗ"] = {
voiced = true,
alveolar = true,
implosive = true,
}
phones["ᶑ"] = {
voiced = true,
retroflex = true,
implosive = true,
}
phones["ʄ"] = {
voiced = true,
palatal = true,
implosive = true,
}
phones["ɠ"] = {
voiced = true,
velar = true,
implosive = true,
}
phones["ʛ"] = {
voiced = true,
uvular = true,
implosive = true,
}
-- Percussives.
phones["ʬ"] = {
bilabial = true,
percussive = true,
}
phones["ʭ"] = {
bidental = true,
percussive = true,
}
phones["¡"] = {
sublaminal = true,
["lower-alveolar"] = true,
percussive = true,
}
]=]
local u = require("Module:string/char")
data[1] = {
-- PULMONIC CONSONANTS
-- nasal
["m"] = {
title = "bilabial nasal",
link = "w:Bilabial nasal",
},
["ɱ"] = {
title = "labiodental nasal",
link = "w:Labiodental nasal",
},
["n"] = {
title = "alveolar nasal",
link = "w:Alveolar nasal",
},
["ɳ"] = {
title = "retroflex nasal",
link = "w:Retroflex nasal",
},
["ɲ"] = {
title = "palatal nasal",
link = "w:Palatal nasal",
},
["ŋ"] = {
title = "velar nasal",
link = "w:Velar nasal",
},
["ɴ"] = {
title = "uvular nasal",
link = "w:Uvular nasal",
},
-- plosive
["p"] = {
title = "voiceless bilabial plosive",
link = "w:Voiceless bilabial stop",
},
["b"] = {
title = "voiced bilabial plosive",
link = "w:Voiced bilabial stop",
},
["t"] = {
title = "voiceless alveolar plosive",
link = "w:Voiceless alveolar stop",
},
["d"] = {
title = "voiced alveolar plosive",
link = "w:Voiced alveolar stop",
},
["ʈ"] = {
title = "voiceless retroflex plosive",
link = "w:Voiceless retroflex stop",
},
["ɖ"] = {
title = "voiced retroflex plosive",
link = "w:Voiced retroflex stop",
},
["c"] = {
title = "voiceless palatal plosive",
link = "w:Voiceless palatal stop",
},
["ɟ"] = {
title = "voiced palatal plosive",
link = "w:Voiced palatal stop",
},
["k"] = {
title = "voiceless velar plosive",
link = "w:Voiceless velar stop",
},
["ɡ"] = {
title = "voiced velar plosive",
link = "w:Voiced velar stop",
},
["q"] = {
title = "voiceless uvular plosive",
link = "w:Voiceless uvular stop",
},
["ɢ"] = {
title = "voiced uvular plosive",
link = "w:Voiced uvular stop",
},
["ʡ"] = {
title = "epiglottal plosive",
link = "w:Epiglottal stop",
},
["ʔ"] = {
title = "glottal stop",
link = "w:Glottal stop",
},
-- fricative
["ɸ"] = {
title = "voiceless bilabial fricative",
link = "w:Voiceless bilabial fricative",
},
["β"] = {
title = "voiced bilabial fricative",
link = "w:Voiced bilabial fricative",
},
["f"] = {
title = "voiceless labiodental fricative",
link = "w:Voiceless labiodental fricative",
},
["v"] = {
title = "voiced labiodental fricative",
link = "w:Voiced labiodental fricative",
},
["θ"] = {
title = "voiceless dental fricative",
link = "w:Voiceless dental fricative",
},
["ð"] = {
title = "voiced dental fricative",
link = "w:Voiced dental fricative",
},
["s"] = {
title = "voiceless alveolar fricative",
link = "w:Voiceless alveolar fricative",
},
["z"] = {
title = "voiced alveolar fricative",
link = "w:Voiced alveolar fricative",
},
["ʃ"] = {
title = "voiceless postalveolar fricative",
link = "w:Voiceless palato-alveolar sibilant",
},
["ʒ"] = {
title = "voiced postalveolar fricative",
link = "w:Voiced palato-alveolar sibilant",
},
["ʂ"] = {
title = "voiceless retroflex fricative",
link = "w:Voiceless retroflex sibilant",
},
["ʐ"] = {
title = "voiced retroflex fricative",
link = "w:Voiced retroflex sibilant",
},
["ɕ"] = {
title = "voiceless alveolo-palatal fricative",
link = "w:Voiceless alveolo-palatal sibilant",
},
["ʑ"] = {
title = "voiced alveolo-palatal fricative",
link = "w:Voiced alveolo-palatal sibilant",
},
["ç"] = {
title = "voiceless palatal fricative",
link = "w:Voiceless palatal fricative",
},
["ʝ"] = {
title = "voiced palatal fricative",
link = "w:Voiced palatal fricative",
},
["x"] = {
title = "voiceless velar fricative",
link = "w:Voiceless velar fricative",
},
["ɣ"] = {
title = "voiced velar fricative",
link = "w:Voiced velar fricative",
},
["χ"] = {
title = "voiceless uvular fricative",
link = "w:Voiceless uvular fricative",
},
["ʁ"] = {
title = "voiced uvular fricative",
link = "w:Voiced uvular fricative",
},
["ħ"] = {
title = "voiceless pharyngeal fricative",
link = "w:Voiceless pharyngeal fricative",
},
["ʕ"] = {
title = "voiced pharyngeal fricative",
link = "w:Voiced pharyngeal fricative",
},
["ʜ"] = {
title = "voiceless epiglottal fricative",
link = "w:Voiceless epiglottal fricative",
},
["ʢ"] = {
title = "voiced epiglottal fricative",
link = "w:Voiced epiglottal fricative",
},
["h"] = {
title = "voiceless glottal fricative",
link = "w:Voiceless glottal fricative",
},
["ɦ"] = {
title = "voiced glottal fricative",
link = "w:Voiced glottal fricative",
},
-- approximant
["ʋ"] = {
title = "labiodental approximant",
link = "w:Labiodental approximant",
},
["ɹ"] = {
title = "alveolar approximant",
link = "w:Alveolar approximant",
},
["ɻ"] = {
title = "retroflex approximant",
link = "w:Retroflex approximant",
},
["j"] = {
title = "palatal approximant",
link = "w:Palatal approximant",
},
["ɰ"] = {
title = "velar approximant",
link = "w:Velar approximant",
},
-- tap, flap
["ⱱ"] = {
title = "labiodental tap",
link = "w:Labiodental flap",
},
["ɾ"] = {
title = "alveolar flap",
link = "w:Alveolar flap",
},
["ɽ"] = {
title = "retroflex flap",
link = "w:Retroflex flap",
},
-- trill
["ʙ"] = {
title = "bilabial trill",
link = "w:Bilabial trill",
},
["r"] = {
title = "alveolar trill",
link = "w:Alveolar trill",
},
["ʀ"] = {
title = "uvular trill",
link = "w:Uvular trill",
},
["ᴙ"] = {
title = "epiglottal trill",
link = "w:Epiglottal trill",
},
-- lateral fricative
["ɬ"] = {
title = "voiceless alveolar lateral fricative",
link = "w:Voiceless alveolar lateral fricative",
},
["ɮ"] = {
title = "voiced alveolar lateral fricative",
link = "w:Voiced alveolar lateral fricative",
},
-- no precomposed Unicode character --TOMOVE
--["ɬ̢"] = {title = "voiceless retroflex lateral fricative", link = "w:voiceless retroflex lateral fricative"},
-- no precomposed Unicode character --TOMOVE:3
--["ʎ̝̊"] = {title = "voiceless palatal lateral fricative", link = "w:voiceless palatal lateral fricative"},
-- no precomposed Unicode character --TOMOVE:3
--["ʟ̝̊"] = {title = "voiceless velar lateral fricative", link = "w:voiceless velar lateral fricative"},
-- no precomposed Unicode character --TOMOVE
--["ʟ̝"] = {title = "voiced velar lateral fricative", link = "w:voiced velar lateral fricative"},
-- lateral approximant
["l"] = {
title = "alveolar lateral approximant",
link = "w:Alveolar lateral approximant",
},
["ɭ"] = {
title = "retroflex lateral approximant",
link = "w:Retroflex lateral approximant",
},
["ʎ"] = {
title = "palatal lateral approximant",
link = "w:Palatal lateral approximant",
},
["ʟ"] = {
title = "velar lateral approximant",
link = "w:Velar lateral approximant",
},
-- lateral flap
["ɺ"] = {
title = "alveolar lateral flap",
link = "w:Alveolar lateral flap",
},
--["ɭ̆"] = {title = "retroflex lateral flap", link = "w:retroflex lateral flap"}, -- no precomposed Unicode character --TOMOVE
--["ɺ˞"] = {title = "retroflex lateral flap", link = "w:retroflex lateral flap"}, -- no precomposed Unicode character --TOMOVE
-- NON-PULMONIC CONSONANTS
-- clicks
["ʘ"] = {
title = "bilabial click",
link = "w:Bilabial clicks",
},
["ǀ"] = {
title = "dental click",
link = "w:Dental clicks",
},
["ǃ"] = {
title = "postalveolar click",
link = "w:Alveolar clicks",
},
["𝼊"] = {
title = "subapical retroflex",
link = "w:Retroflex clicks",
}, -- NOT IN X-SAMPA
["ǂ"] = {
title = "palatal click",
link = "w:Palatal clicks",
},
["ǁ"] = {
title = "alveolar lateral click",
link = "w:Lateral clicks",
},
-- implosives
["ɓ"] = {
title = "voiced bilabial implosive",
link = "w:Voiced bilabial implosive",
},
["ɗ"] = {
title = "voiced alveolar implosive",
link = "w:Voiced alveolar implosive",
},
-- NOT IN X-SAMPA
["ᶑ"] = {
title = "retroflex implosive",
link = "w:Voiced retroflex implosive",
},
["ʄ"] = {
title = "voiced palatal implosive",
link = "w:Voiced palatal implosive",
},
["ɠ"] = {
title = "voiced velar implosive",
link = "w:Voiced velar implosive",
},
["ʛ"] = {
title = "voiced uvular implosive",
link = "w:Voiced uvular implosive",
},
-- ejectives
["ʼ"] = {
title = "ejective",
link = "w:Ejective consonant",
},
-- CO-ARTICULATED CONSONANTS
["ʍ"] = {
title = "voiceless labial-velar fricative",
link = "w:Voiceless labio-velar approximant",
},
["w"] = {
title = "labial-velar approximant",
link = "w:Labio-velar approximant",
},
["ɥ"] = {
title = "labial-palatal approximant",
link = "w:Labialized palatal approximant",
},
["ɧ"] = {
title = "voiceless palatal-velar fricative",
link = "w:Sj-sound",
},
-- should be handled in [[Module:IPA]] and not through this table
-- BRACKETS
--[[
-- ["//"] = {
title = "morphophonemic",
link = "w:morphophonemic",
},
["/"] = {
title = "phonemic",
link = "w:phonemic",
},
["["] = {
title = "phonetic",
link = "w:phonetic",
},
["["] = {
title = "phonetic",
link = "w:phonetic",
},
["〈"] = {
title = "orthographic",
link = "w:orthographic",
},
["〉"] = {
title = "orthographic",
link = "w:orthographic",
},
["⟨"] = {
title = "orthographic",
link = "w:orthographic",
},
["⟩"] = {
title = "orthographic",
link = "w:orthographic",
},
]]
-- VOWELS
-- close
["i"] = {
title = "close front unrounded vowel",
link = "w:Close front unrounded vowel",
},
["y"] = {
title = "close front rounded vowel",
link = "w:Close front rounded vowel",
},
["ɨ"] = {
title = "close central unrounded vowel",
link = "w:Close central unrounded vowel",
},
["ʉ"] = {
title = "close central rounded vowel",
link = "w:Close central rounded vowel",
},
["ɯ"] = {
title = "close back unrounded vowel",
link = "w:Close back unrounded vowel",
},
["u"] = {
title = "close back rounded vowel",
link = "w:Close back rounded vowel",
},
-- near close
["ɪ"] = {
title = "near-close near-front unrounded vowel",
link = "w:Near-close near-front unrounded vowel",
},
["ʏ"] = {
title = "near-close near-front rounded vowel",
link = "w:Near-close near-front rounded vowel",
},
["ᵻ"] = {
title = "near-close central unrounded vowel",
link = "w:Near-close central unrounded vowel",
},
-- (alternative) --TOMOVE
--[[
["ɪ̈"] = {
title = "near-close central unrounded vowel",
link = "w:near-close central unrounded vowel",
}, ]]
["ᵿ"] = {
title = "near-close central rounded vowel",
link = "w:Near-close central rounded vowel",
},
--[[
(alternative) TOMOVE
["ʊ̈"] = {
title = "near-close central rounded vowel",
link = "w:near-close central rounded vowel",
},
]]
["ʊ"] = {
title = "near-close near-back rounded vowel",
link = "w:Near-close near-back rounded vowel",
},
--close mid
["e"] = {
title = "close-mid front unrounded vowel",
link = "w:Close-mid front unrounded vowel",
},
["ø"] = {
title = "close-mid front rounded vowel",
link = "w:Close-mid front rounded vowel",
},
["ɘ"] = {
title = "close-mid central unrounded vowel",
link = "w:Close-mid central unrounded vowel",
},
["ɵ"] = {
title = "close-mid central rounded vowel",
link = "w:Close-mid central rounded vowel",
},
["ɤ"] = {
title = "close-mid back unrounded vowel",
link = "w:Close-mid back unrounded vowel",
},
["o"] = {
title = "close-mid back rounded vowel",
link = "w:Close-mid back rounded vowel",
},
-- mid
["ə"] = {
title = "schwa",
link = "w:Schwa",
},
["ɚ"] = {
title = "schwa+r",
link = "w:R-colored vowel",
},
-- open mid
["ɛ"] = {
title = "open-mid front unrounded vowel",
link = "w:Open-mid front unrounded vowel",
},
["œ"] = {
title = "open-mid front rounded vowel",
link = "w:Open-mid front rounded vowel",
},
["ɜ"] = {
title = "open-mid central unrounded vowel",
link = "w:Open-mid central unrounded vowel",
},
["ɝ"] = {
title = "open-mid central unrounded vowel+r",
link = "w:R-colored vowel",
},
["ɞ"] = {
title = "open-mid central rounded vowel",
link = "w:Open-mid central rounded vowel",
},
["ʌ"] = {
title = "open-mid back unrounded vowel",
link = "w:Open-mid back unrounded vowel",
},
["ɔ"] = {
title = "open-mid back rounded vowel",
link = "w:Open-mid back rounded vowel",
},
-- near open
["æ"] = {
title = "near-open front unrounded vowel",
link = "w:Near-open front unrounded vowel",
},
["ɐ"] = {
title = "near-open central vowel",
link = "w:Near-open central vowel",
},
-- open
["a"] = {
title = "open front unrounded vowel",
link = "w:Open front unrounded vowel",
},
["ɶ"] = {
title = "open front rounded vowel",
link = "w:Open front rounded vowel",
},
["ɑ"] = {
title = "open back unrounded vowel",
link = "w:Open back unrounded vowel",
},
["ɒ"] = {
title = "open back rounded vowel",
link = "w:Open back rounded vowel",
},
-- SUPRASEGMENTALS
["ˈ"] = {title = "primary stress", link = "w:Stress (linguistics)", XSAMPA = "\""},
--[[
["???"] = {
title = "extra stress: no Unicode char; double primary stress instead",
link = "w:extra stress: no Unicode char; double primary stress instead",
XSAMPA = ""
}, --TOMOVE:3 ]]
["ˌ"] = {
title = "secondary stress",
link = "w:Secondary stress",
},
["ː"] = {
title = "long",
link = "w:Length (phonetics)",
},
["ˑ"] = {
title = "half long",
link = "w:Length (phonetics)",
},
["̆"] = {
title = "extra-short",
link = "w:Length (phonetics)",
},
--[[
["%."] = {
title = "syllable break",
link = "w:syllable break",
},
]]
--TOMOVE
["‿"] = {
title = "linking mark (absence of a break)",
link = "w:Tie (typography)#International_Phonetic_Alphabet",
},
[" "] = {
title = "separator",
link = "w:separator",
},
-- TONE
-- level tones
["˥"] = {
title = "top",
link = "w:Tone letter",
},
["˦"] = {
title = "high",
link = "w:Tone letter",
},
["˧"] = {
title = "mid",
link = "w:Tone letter",
},
["˨"] = {
title = "low",
link = "w:Tone letter",
},
["˩"] = {
title = "bottom",
link = "w:Tone letter",
},
["̋"] = {
title = "extra high tone",
link = "w:Tone letter",
},
["́"] = {
title = "high tone",
link = "w:Tone letter",
},
["̄"] = {
title = "mid tone",
link = "w:Tone letter",
},
["̀"] = {
title = "low tone",
link = "w:Tone letter",
},
["̏"] = {
title = "extra low tone",
link = "w:Tone letter",
},
-- tone terracing
["ꜛ"] = {
title = "upstep",
link = "w:Upstep",
},
["ꜜ"] = {
title = "downstep",
link = "w:Downstep",
},
-- contour tones
["̌"] = {
title = "rising tone",
link = "w:Tone (linguistics)",
},
["̂"] = {
title = "falling tone",
link = "w:Tone (linguistics)",
},
["᷄"] = {
title = "high rising tone",
link = "w:Tone (linguistics)",
},
["᷅"] = {
title = "low rising tone",
link = "w:Tone (linguistics)",
},
["᷇"] = {
title = "high falling tone",
link = "w:Tone (linguistics)",
},
["᷆"] = {
title = "low falling tone",
link = "w:Tone (linguistics)",
},
["᷈"] = {
title = "rising falling tone (peaking)",
link = "w:Tone (linguistics)",
},
["᷉"] = {
title = "dipping",
link = "w:Tone (linguistics)",
}, -- [extrapolated from the chart -- please confirm]
-- intonation
["|"] = {
title = "minor (foot) group",
link = "w:Prosodic unit",
},
["‖"] = {
title = "major (intonation) group",
link = "w:Prosodic unit",
},
["↗"] = {
title = "global rise",
link = "w:Intonation (linguistics)",
},
["↘"] = {
title = "global fall",
link = "w:Intonation (linguistics)",
},
-- DIACRITICS
-- syllabicity & releases
["̩"] = {
title = "syllabi ",
link = "w:Syllabic consonant",
withdescender = "̍"
}, -- (or "_="
["̯"] = {
title = "non-syllabic",
link = "w:Semivowel",
withdescender = "̑"
},
["ʰ"] = {
title = "aspirated",
link = "w:Aspirated consonant",
},
["ⁿ"] = {
title = "nasal release",
link = "w:Nasal release",
},
["ˡ"] = {
title = "lateral release",
link = "w:Lateral release (phonetics)",
},
["̚"] = {
title = "no audible release",
link = "w:No audible release",
},
-- phonation
["̥"] = {
title = "voiceless",
link = "w:Voicelessness",
withdescender = "̊"
},
["̬"] = {
title = "voiced",
link = "w:Voice (phonetics)",
},
["̤"] = {
title = "breathy voice",
link = "w:Breathy voice",
},
["̰"] = {
title = "creaky voice",
link = "w:Creaky voice",
},
["᷽"] = {
title = "strident",
link = "w:Strident vowel",
},
-- primary articulation
["̪"] = {
title = "dental",
link = "w:Dental consonant",
},
["̺"] = {
title = "apical",
link = "w:Apical consonant",
},
["̻"] = {
title = "laminal",
link = "w:Laminal consonant",
},
["̟"] = {
title = "advanced",
link = "w:Relative articulation#Advanced_and_retracted",
withdescender = "˖"
},
["̠"] = {
title = "retracted",
link = "w:Relative articulation#Retracted",
withdescender = "˗"
},
["̼"] = {
title = "linguolabial",
link = "w:Linguolabial consonant",
},
["̈"] = {
title = "centralized",
link = "w:Relative articulation#Centralized_vowels",
XSAMPA = "_\""
},
["̽"] = {
title = "mid-centralized",
link = "Relative articulation#Mid-centralized_vowel",
},
["̞"] = {
title = "lowered",
link = "w:Relative articulation#Raised_and_lowered",
withdescender = "˕"
},
["̝"] = {
title = "raised",
link = "w:Relative articulation#Raised_and_lowered",
withdescender = "˔"
},
["͡"] = {
title = "coarticulated",
link = "w:Co-articulated consonant",
},
["͈"] = {
title = "strong articulation",
link = "w:Fortis and lenis",
},
-- secondary articulation
["ʷ"] = {
title = "labialized",
link = "w:Labialization",
},
["ʲ"] = {
title = "palatalized",
link = "w:Palatalization (phonetics)",
},
["ˠ"] = {
title = "velarized",
link = "w:Velarization",
},
["ˤ"] = {
title = "pharyngealized",
link = "w:Pharyngealization",
},
-- also see _e
["ɫ"] = {
title = "velarized alveolar lateral approximant",
link = "w:Alveolar lateral approximant",
},
["̴"] = {
title = "velarized or pharyngealized; also see 5",
link = "w:Velarization",
},
["̹"] = {
title = "more rounded",
link = "w:Roundedness",
},
["̜"] = {
title = "less rounded",
link = "w:Roundedness",
},
["̃"] = {
title = "nasalization",
link = "w:Nasalization",
},
["˞"] = {
title = "rhotacization in vowels, retroflexion in consonants",
link = "w:R-colored vowel",
},
["̘"] = {
title = "advanced tongue root",
link = "w:Advanced and retracted tongue root",
},
["̙"] = {
title = "retracted tongue root",
link = "w:Advanced and retracted tongue root",
},
}
data[2] = {
-- TODO
--["%("] = {},
--["%)"] = {},
["ːː"] = {
title = "extra long",
link = "w:Length (phonetics)",
},
["r̥"] = {title = "voiceless alveolar trill", link = "w:Voiceless alveolar trill"},
["ɬ’"] = {title = "alveolar lateral ejective fricative", link = "w:Alveolar lateral ejective fricative"},
}
data[3] = {
["t͡s"] = {title = "voiceless alveolar sibilant affricate", link = "w:Voiceless alveolar affricate"},
["d͡z"] = {title = "voiced alveolar sibilant affricate", link = "w:Voiced alveolar affricate"},
["t͡ʃ"] = {title = "voiceless palato-alveolar affricate", link = "w:Voiceless palato-alveolar affricate", descender = true},
["d͡ʒ"] = {title = "voiced palato-alveolar affricate", link = "w:Voiced palato-alveolar affricate"},
["ʈ͡ʂ"] = {title = "voiceless retroflex affricate", link = "w:Voiceless retroflex affricate", descender = true},
["ɖ͡ʐ"] = {title = "voiced retroflex affricate", link = "w:Voiced retroflex affricate, descender = true"},
["t͡ɕ"] = {title = "voiceless alveolo-palatal affricate", link = "w:Voiceless alveolo-palatal affricate"},
["d͡ʑ"] = {title = "voiced alveolo-palatal affricate", link = "w:Voiced alveolo-palatal affricate"},
["c͡ç"] = {title = "voiceless palatal affricate", link = "w:Voiceless palatal affricate, descender = true"},
["ɟ͡ʝ"] = {title = "voiced palatal affricate", link = "w:Voiced palatal affricate, descender = true"},
["k͡x"] = {title = "voiceless velar affricate", link = "w:Voiceless velar affricate"},
["ɡ͡ɣ"] = {title = "voiced velar affricate", link = "w:Voiced velar affricate, descender = true"},
}
data[4] = {
["ǃ͡qʼ"] = {title = "alveolar linguo-glottalic stop", link = "w:Ejective-contour clicks, descender = true"},
["ǁ͡χʼ"] = {title = "lateral linguo-glottalic affricate (homorganic)", link = "w:Ejective-contour clicks", descender = true},
}
data[5] = {
["k͡ʟ̝̊"] = {title = "voiceless velar lateral affricate", link = "w:Voiceless velar lateral affricate"},
["ᶢǀ͡qʼ"] = {title = "voiced dental linguo-glottalic stop", link = "w:Ejective-contour clicks"},
["ǂ͡kxʼ"] = {title = "palatal linguo-glottalic affricate (heterorganic)", link = "w:Ejective-contour clicks"},
}
data[6] = {
["k͡ʟ̝̊ʼ"] = {title = "velar lateral ejective affricate", link = "w:Velar lateral ejective affricate"},
["ᶢʘ͡kxʼ"] = {title = "voiced labial linguo-glottalic affricate", link = "w:Ejective-contour clicks"},
}
data.separator_escapes = {
["⁽"] = "(", ["⁾"] = ")",
["₍"] = "(", ["₎"] = ")",
["ˈ"] = "\1", ["ˌ"] = "\2",
["ː"] = ":", ["ˑ"] = ";",
}
-- acute and grave tone marks
local diacritics = u(
-- grave, acute, circumflex, tilde, macron, breve
0x300, 0x301, 0x302, 0x303, 0x304, 0x306,
-- diaeresis, ring above, double acute, caron, vertical line above, double grave, left tack
0x308, 0x30A, 0x30B, 0x30C, 0x30D, 0x30F, 0x318,
-- right tack, left angle, left half ring below, up tack below, down tack below, plus sign below
0x319, 0x31A, 0x31C, 0x31D, 0x31E, 0x31F,
-- minus sign below, rhotic hook below, dot below, diaeresis below, ring below, vertical line below, bridge below
0x320, 0x322, 0x323, 0x324, 0x325, 0x329, 0x32A,
-- caron below, inverted breve below
0x32C, 0x32F,
-- tilde below, combining tilde overlay, right half ring below, inverted bridge below, square below, seagull below, x above
0x330, 0x334, 0x339, 0x33A, 0x33B, 0x33C, 0x33D,
-- grave tone mark, acute tone mark, bridge above, equals sign below, double vertical line below
0x340, 0x341, 0x346, 0x347, 0x348,
-- left angle below, not tilde above, homothetic above, almost equal above, left right arrow below
0x349, 0x34A, 0x34B, 0x34C, 0x34D,
-- upwards arrow below, left arrowhead below, right arrowhead below
0x34E, 0x354, 0x355,
-- double rightwards arrow below, combining Latin small letter a
0x362, 0x361,
-- macron–acute, grave–macron, macron–grave, acute–macron, grave–acute–grave, acute–grave–acute
0x1DC4, 0x1DC5, 0x1DC6, 0x1DC7, 0x1DC8, 0x1DC9)
data.diacritics = diacritics
data.vowels = "iyɨʉɯuɪᵻʏʊᵿeøɘɵɤoəɚɛœɜɝɞʌɔæɐaɶɑɒäëïöüÿ"
local tones = "˥˦˧˨˩꜒꜓꜔꜕꜖꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑¹²³⁴⁵⁶⁷⁸⁹⁰"
data.tones = tones
local superscripts = u(0xA0) .. " ⁰¹²³⁴⁵⁶⁷⁸⁹ᵃ𐞃ᵄᵅᶛᵇ𐞄𐞅ᶜᶝᵈᶞ𐞋𐞌𐞍ᵉᵊᵋ𐞎ᶟᵌ𐞏𐞑ᶠᶢ𐞒𐞓𐞔ˠʰ𐞕𐞖ʱ𐞗ⁱᶦᶤʲᶨᶡ𐞘ᵏˡᶫꭞ𐞛ᶩ𐞞𐞠𐞡ᵐᶬⁿᶰᶮᶯᵑᵒ𐞢ꟹ𐞣ᵓᶱᵖᶲ𐞥ʳ𐞪ʴ𐞦𐞧ʵ𐞨𐞩ʶˢᶳᶴᵗ𐞯ᵘᶶᶣᵚᶭᶷᵛᶹ𐞰ᶺʷꭩˣʸ𐞲ᶻᶼᶽᶾˀˤ𐞳𐞴𐞶𐞷𐞸𐞹𐞵ᵝᶿᵡ˞⁻𐞁𐞂"
data.superscripts = superscripts
-- An array of patterns of valid character sequences.
data.valid = {
"⁽[" .. superscripts .. "]+⁾",
"[ %(%)%%<>{|}%-→~⁓%.◌abcdefhijklmnopqrstuvwxyz¡àáâãāăēäæçèéêëĕěħìíîïĩīĭĺḿǹńňðòóôõöōŏőœøŕùúûüũūŭűýÿŷŋ"
.. "ǀǁǂǃǎǐǒǔřǖǘǚǜǟǣǽǿȁȅȉȍȕȫȭȳɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɪᵻɫɬɭɮɯɰɱɲɳɴɵɶɸɹɺ𝼈ɻɽɾʀʁʂʃʄʈʉʊᵿʋṽʌʍʎ𝼆ʏʐʑʒʔʕʘʞʙʛʜʝʟʡʢ𝼊ʬʭ"
.. "ʼˈˌːˑˣ˔˕ˬ͗˭ˇ˖β͜θχᴙᶑ᷽ḁḛḭḯṍṏṳṵṹṻạẹẽịọụỳỵỹ‖․‥…‿↑↓↗↘ⱱꜛꜜꟸ𝆏𝆑˗ˋˊ–⸨⸩⁽⁾" .. diacritics .. tones .. superscripts .. "]+"
}
-- Character sequences which are valid only in a particular language.
-- These can be either a single pattern (as a string), or an array of patterns (as a table).
data.per_lang_valid = {
["egy"] = "V+", -- V for uncertain vowel
["okm"] = "[LHR!WT]+", -- irregular verb morphophonemes
}
-- Characters to add VARIATION SELECTOR-15 (U+FE0E) after.
-- These are characters with emoji variants that are used by default by some clients.
-- Adding VS15 after them instructs them to draw the characters as text instead.
data.add_vs15 = "↗↘"
data.invalid = {
["!"] = "ǃ",
["ꜝ"] = "ꜜ",
["ꜞ"] = "ꜛ",
["ꜟ"] = "ꜛ",
["'"] = "ˈ",
["’"] = "ʼ",
[":"] = "ː",
-- Confusable Latin letters
["B"] = "ʙ",
["g"] = "ɡ",
["G"] = "ɢ",
["Ɠ"] = "ʛ",
["H"] = "ʜ",
["ı"] = "ɪ",
["I"] = "ɪ",
["L"] = "ʟ",
["N"] = "ɴ",
["Œ"] = "ɶ",
["Q"] = "ꞯ",
["R"] = "ʀ",
["∫"] = "ʃ",
["⨎"] = "ǂ", -- due to confusion with obsolete 𝼋 below
["ß"] = "β",
["ẞ"] = "β",
["Y"] = "ʏ",
["Ə"] = "ə",
["ǝ"] = "ə",
["Ɂ"] = "ʔ",
["ɂ"] = "ʔ",
["ˁ"] = "ˤ",
-- Confusable Greek letters
["α"] = "ɑ",
["γ"] = "ɣ",
["δ"] = "ð",
["ε"] = "ɛ",
["Η"] = "ʜ",
["η"] = "ŋ",
["ι"] = "ɪ",
["λ"] = "ʎ",
["υ"] = "ʋ",
["Ψ"] = "𝼊",
["ψ"] = "𝼊",
["Φ"] = "ɸ",
["ϕ"] = "ɸ",
["ꭓ"] = "χ", -- Actually Latin, since IPA uses the Greek letter(!)
-- Confusable Cyrillic letters
["ӕ"] = "æ",
["Ә"] = "ə",
["ә"] = "ə",
["В"] = "ʙ",
["в"] = "ʙ",
["е"] = "e",
["З"] = "ɜ",
["з"] = "ɜ",
["Ѕ"] = "s",
["ѕ"] = "s",
["і"] = "i",
["ј"] = "j",
["Н"] = "ʜ",
["н"] = "ʜ",
["О"] = "o",
["о"] = "o",
["р"] = "p",
["с"] = "c",
["у"] = "y",
["Ү"] = "ʏ",
["ү"] = "ʏ",
["Ф"] = "ɸ",
["ф"] = "ɸ",
["х"] = "x",
["Һ"] = "h",
["һ"] = "h",
["Я"] = "ᴙ",
["я"] = "ᴙ",
["Ѱ"] = "𝼊",
["ѱ"] = "𝼊",
["Ѵ"] = "ⱱ",
["ѵ"] = "ⱱ",
["Ҁ"] = "ʕ",
["ҁ"] = "ʕ",
-- Palatalization
["ᶀ"] = "bʲ",
["ꞔ"] = "cʲ",
["ᶁ"] = "dʲ",
["ȡ"] = "d̠ʲ",
["d̂"] = "d̠ʲ",
["ᶂ"] = "fʲ",
["ᶃ"] = "ɡʲ",
["ꞕ"] = "hʲ",
["ᶄ"] = "kʲ",
["ᶅ"] = "lʲ",
["ȴ"] = "l̠ʲ",
["l̂"] = "l̠ʲ",
["𝼓"] = "ɬʲ",
["ᶆ"] = "mʲ",
["ᶇ"] = "nʲ",
["ȵ"] = "n̠ʲ",
["n̂"] = "n̠ʲ",
["𝼔"] = "ŋʲ",
["ᶈ"] = "pʲ",
["ᶉ"] = "rʲ",
["𝼕"] = "ɹʲ",
["𝼖"] = "ɾʲ",
["ᶊ"] = "sʲ",
["𝼞"] = "ɕ",
["𐞺"] = "ᶝ",
["ᶋ"] = "ʃʲ",
["ʆ"] = "ʃʲ",
["ƫ"] = "tʲ",
["ȶ"] = "t̠ʲ",
["t̂"] = "t̠ʲ",
["ᶌ"] = "vʲ",
["ᶍ"] = "xʲ",
["ᶎ"] = "zʲ",
["𝼘"] = "ʒʲ",
["ʓ"] = "ʒʲ",
-- Retroflex
["𝼝"] = "ʈ͡ʂ",
["𝼥"] = "ɖ",
["𝼦"] = "ɭ",
["𝼧"] = "ɳ",
["𝼨"] = "ɽ",
["𝼩"] = "ʂ",
["𝼪"] = "ʈ",
-- Rhotic vowels
["ᶏ"] = "a˞",
["ᶐ"] = "ɑ˞",
["ᶒ"] = "e˞",
["ə˞"] = "ɚ",
["ᶕ"] = "ɚ",
["ᶓ"] = "ɛ˞",
["ɜ˞"] = "ɝ",
["ᶔ"] = "ɝ",
["ᶖ"] = "i˞",
["𝼚"] = "ɨ˞",
["𝼛"] = "o˞",
["ᶗ"] = "ɔ˞",
["ᶙ"] = "u˞",
-- Syllabic approximants
["ɿ"] = "ɹ̩",
["ʅ"] = "ɻ̩",
["ʮ"] = "ɹ̩ʷ",
["ʯ"] = "ɻ̩ʷ",
-- Clicks
["ʗ"] = "ǃ",
["𝼋"] = "ǂ",
["ʇ"] = "ǀ",
["ʖ"] = "ǁ",
["‼"] = "𝼊",
-- Voiceless implosives
["ƈ"] = "ʄ̊",
["ƙ"] = "ɠ̊",
["ƥ"] = "ɓ̥",
["ʠ"] = "ʛ̥",
["ƭ"] = "ɗ̥",
["𝼉"] = "ᶑ̥",
-- Monographs
["ꜰ"] = "ɸ",
["ɩ"] = "ɪ",
["ɼ"] = "r̝",
["ᴜ"] = "ʊ",
["ɷ"] = "ʊ",
["𐞤"] = "ᶷ",
["ƛ"] = "t͡ɬ",
["ƻ"] = "d͡z",
["ƾ"] = "t͡s",
-- Digraphs
["ȸ"] = "b̪",
["ʣ"] = "d͡z",
["ʥ"] = "d͡ʑ",
["ꭦ"] = "ɖ͡ʐ",
["ʤ"] = "d͡ʒ",
["𝼒"] = "d͡ʒʲ",
["𝼙"] = "d͡ᶚ",
["ʪ"] = "ɬ͡s",
["ʫ"] = "ɮ͡z",
["ȹ"] = "p̪",
["ʦ"] = "t͡s",
["ʨ"] = "t͡ɕ",
["ꭧ"] = "ʈ͡ʂ",
["ʧ"] = "t͡ʃ",
["𝼗"] = "t͡ʃʲ",
["𝼜"] = "t͡ᶘ",
-- Deprecated or confusable diacritics
["̫"] = "ʷ",
["͂"] = "̃",
["᫇"] = "ʷ",
["⸋"] = "̚",
["̱"] = "̠", -- COMBINING MACRON BELOW (U+0331) -> COMBINING MINUS SIGN BELOW (U+0320)
-- Precomposed characters with deprecated or confusable diacritics; the left is a precomposed
-- version of a lowercase letter with COMBINING MACRON BELOW and the right is the equivalent
-- using COMBINING MINUS SIGN BELOW
["ḇ"] = "b̠",
["ḏ"] = "d̠",
["ẖ"] = "h̠",
["ḵ"] = "k̠",
["ḻ"] = "l̠",
["ṉ"] = "n̠",
["ṟ"] = "r̠",
["ṯ"] = "t̠",
["ẕ"] = "z̠",
}
return data
mjopki8sklky9m3kv63kzgka1usuiki
मॉड्यूल:IPA/tracking
828
303058
487755
470049
2026-09-02T15:17:37Z
SM7
6218
updating...
487755
Scribunto
text/plain
local export = {}
--[[
symb is what is tracked. It can be a literal symbol or a Lua pattern.
If it is a table, tracking is added for any of the symbols in the list.
cat is the subtemplate that is added to the default path "IPA/" + language code + "/".
]]
local U = require("Module:string/char")
local syllabic = U(0x329)
-- The validity of this table is checked by documentation function
-- in [[Module:User:Erutuon/sandbox]].
export.tracking = {
en = {
{
symb = "iə",
cat = "ambig",
},
{
symb = { "ɪi", "ʊu", "ɪj", "ʊw" },
cat = "eeoo",
},
{
symb = { "r" },
cat = "plain r",
},
},
cs = {
{
symb = "[mnrl]" .. syllabic,
cat = "syllabic-consonant",
},
},
ps = {
{
symb = "ɤ",
cat = "Pashto",
},
},
fa = {
{
symb = "ʔ",
cat = "glottal-stop",
},
},
{
{
symb = "",
cat = "",
},
},
}
function export.run_tracking(IPA, lang)
if not IPA or IPA == "" then
return
end
lang = lang:getCode()
if not export.tracking[lang] then
return
end
for i, arguments in ipairs(export.tracking[lang]) do
local symbols = arguments.symb
local category = arguments.cat
if type(symbols) == "string" then
symbols = { symbols }
end
for _, symbol in pairs(symbols) do
if mw.ustring.find(IPA, symbol) then
require("Module:debug/track")("IPA/" .. lang .. "/" .. category)
end
end
end
end
return export
se04v8uivjuynpeoe4fnp0a4t96kccz
मॉड्यूल:rhymes
828
304114
487753
475429
2026-09-02T15:13:10Z
SM7
6218
updating...
487753
Scribunto
text/plain
local export = {}
local force_cat = false -- for testing
local rhymes_styles_css_module = "Module:rhymes/styles.css"
local IPA_module = "Module:IPA"
local parameters_module = "Module:parameters"
local parameter_utilities_module = "Module:parameter utilities"
local pron_qualifier_module = "Module:pron qualifier"
local script_utilities_module = "Module:script utilities"
local string_utilities_module = "Module:string utilities"
local TemplateStyles_module = "Module:TemplateStyles"
local utilities_module = "Module:utilities"
local rhymes_data = require("Module:rhymes/data")
local concat = table.concat
local insert = table.insert
local function rsplit(text, pattern)
return require(string_utilities_module).split(text, pattern)
end
local function track(page)
require("Module:debug/track")("तुकांत/" .. page)
return true
end
local function tag_rhyme(rhyme, lang)
local formatted_rhyme, cats, err
formatted_rhyme, cats, err = require(IPA_module).format_IPA(lang, rhyme, "raw")
return formatted_rhyme, cats, err
end
local function make_rhyme_link(lang, link_rhyme, display_rhyme)
local retval, cats
local prefix = "[[तुकांत:"
if rhymes_data.link_to_category_langs[lang:getCode()] then
prefix = "[[:श्रेणी:तुकांत:"
end
if not link_rhyme then
retval = concat{prefix, lang:getCanonicalName(), "|", lang:getCanonicalName(), "]]"}
cats = {}
else
local formatted_rhyme, err
formatted_rhyme, cats, err = tag_rhyme(display_rhyme or link_rhyme, lang)
retval = concat{prefix, lang:getCanonicalName(), "/", link_rhyme, "|", formatted_rhyme, "]]", err}
end
return retval, cats
end
--[==[
Implementation of {{tl|rhymes row}}.
]==]
function export.show_row(frame)
local args = require(parameters_module).process(
frame.getParent and frame:getParent().args or frame,
{
[1] = {required = true, type = "full language"},
[2] = {required = true},
[3] = {},
}
)
if not args[1] then
return "[[Rhymes:English/aɪmz|<span class=\"IPA\">-aɪmz</span>]]"
end
-- Discard cleanup categories from make_rhyme_link().
return (make_rhyme_link(args[1], args[2], "-" .. args[2])) .. (args[3] and (" (''" .. args[3] .. "'')") or "")
end
do
local function add_syllable_categories(categories, lang, rhyme, num_syl)
local prefix = "तुकांत:" .. lang .. "/" .. rhyme
insert(categories, prefix)
if num_syl then
for _, n in ipairs(num_syl) do
local c
if n > 1 then
c = prefix .. "/" .. n .. " सिलेबल"
else
c = prefix .. "/1 सिलेबल"
end
insert(categories, c)
end
end
end
--[==[
Meant to be called from a module. `data` is a table containing the following fields:
* `lang`: language object for the rhymes;
* `rhymes`: a list of rhymes, each described by an object which specifies the rhyme, optional number of syllables, and
optional left and right regular and accent qualifier fields:
** `rhyme`: the rhyme itself;
** `num_syl`: {nil} or a list of numbers, specifying the number of syllables of the word with this rhyme; optional and
currently used only for categorization; if omitted, defaults to the top-level `num_syl`;
** `separator`: {nil} or the string used to separate this rhyme from the preceding one when displayed; defaults to the
top-level `separator`;
** `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]]
and displayed directly before the rhyme in question;
** `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the rhyme in question;
** `qualifiers`: {nil} or a list of qualifier strings; also displayed on the left; for compatibility purposes only, do
not use in new code;
** `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in
[[Module:accent qualifier]] and displayed directly before the rhyme in question;
** `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the rhyme in question;
** `refs`: {nil} or a list of references or reference specs to add directly after the rhyme; the value of a list item is
either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or a
template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the
reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}})
and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section;
** `nocat`: if {true}, suppress categorization for this rhyme only;
* `num_syl`: {nil} or a list of numbers, specifying the number of syllables for all rhymes; optional and currently used
only for categorization; overridable at the individual rhyme level;
* `separator`: {nil} or a string, specifying the separator displayed before all rhymes but the first; by default,
{", "}; overridable at the individual rhyme level;
* `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]]
and displayed before the initial caption;
* `qq`: {nil} or a list of right regular qualifier strings, displayed after all rhymes;
* `qualifiers`: {nil} or a list of left regular qualifier strings; for compatibility purposes only, do not use in new
code;
* `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in
[[Module:accent qualifier]] and dispalyed before the initial caption;
* `aa`: {nil} or a list of right accent qualifier strings, displayed after all rhymes;
* `sort`: {nil} or sort key;
* `caption`: {nil} or string specifying the caption to use, in place of {"Rhymes"}; a colon and space is automatically
added after the caption;
* `nocaption`: if {true}, suppress the caption display;
* `nocat`: if {true}, suppress categorization;
* `force_cat`: if {true}, force categorization even on non-mainspace pages.
If both regular and accent qualifiers on the same side and at the same level are specified, the accent qualifiers
precede the regular qualifiers on both left and right.
'''WARNING''': Destructively modifies the objects inside the `rhymes` field.
Note that the number of syllables is currently used only for categorization; if present, an extra category will
be added such as [[:Category:Rhymes:Italian/ino/3 syllables]] in addition to [[:Category:Rhymes:Italian/ino]].
]==]
function export.format_rhymes(data)
local langname = data.lang:getFullName()
local parts = {}
local categories = {}
local overall_sep = data.separator or ", "
for i, r in ipairs(data.rhymes) do
local rhyme = r.rhyme
local link, link_cats = make_rhyme_link(data.lang, rhyme, "-" .. rhyme)
if not r.nocat and not data.nocat then
for _, cat in ipairs(link_cats) do
insert(categories, cat)
end
end
if r.qualifiers then
track("old-qualifiers")
end
if r.q and r.q[1] or r.qq and r.qq[1] or r.qualifiers and r.qualifiers[1]
or r.a and r.a[1] or r.aa and r.aa[1] or r.refs and r.refs[1] then
link = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = link,
q = r.q,
qq = r.qq,
qualifiers = r.qualifiers,
a = r.a,
aa = r.aa,
refs = r.refs,
}
end
insert(parts, r.separator or i > 1 and overall_sep or "")
insert(parts, link)
if not r.nocat and not data.nocat then
add_syllable_categories(categories, langname, rhyme, r.num_syl or data.num_syl)
end
end
local text = concat(parts)
if not data.nocaption then
text = (data.caption or "तुकांत") .. ": " .. text
end
if data.q and data.q[1] or data.qq and data.qq[1] or data.a and data.a[1] or data.aa and data.aa[1] then
text = require(pron_qualifier_module).format_qualifiers {
lang = data.lang,
text = text,
q = data.q,
qq = data.qq,
a = data.a,
aa = data.aa,
}
end
if categories[1] then
local categories = require(utilities_module).format_categories(categories, data.lang, data.sort, nil,
force_cat or data.force_cat)
text = text .. categories
end
return text
end
end
--[==[
Implementation of {{tl|rhymes}}.
]==]
function export.show(frame)
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
local lang_param = compat and "lang" or 1
local plain = {}
local boolean = {type = "boolean"}
local params = {
[lang_param] = {required = true, type = "language", default = "hi"},
[1 + offset] = {list = true, required = true, disallow_holes = true, default = "aɪmz"},
["caption"] = plain,
["nocaption"] = boolean,
["nocat"] = boolean,
["sort"] = plain,
}
local m_param_utils = require(parameter_utilities_module)
local param_mods = m_param_utils.construct_param_mods {
{
param = "s",
item_dest = "num_syl",
separate_no_index = true,
type = "number",
sublist = true,
},
{group = {"q", "a", "ref"}},
}
local rhymes, args = m_param_utils.parse_list_with_inline_modifiers_and_separate_params {
params = params,
param_mods = param_mods,
raw_args = parent_args,
termarg = 1 + offset,
term_dest = "rhyme",
track_module = "rhymes",
}
local lang = args[lang_param]
local data = {
lang = lang,
rhymes = rhymes,
num_syl = args.s.default,
caption = args.caption,
nocaption = args.nocaption,
nocat = args.nocat,
sort = args.sort,
q = args.q.default,
qq = args.qq.default,
a = args.a.default,
aa = args.aa.default,
}
return export.format_rhymes(data)
end
--[==[
Implementation of {{tl|rhymes nav}}.
]==]
function export.show_nav(frame)
local args = require(parameters_module).process(
frame:getParent().args,
{
[1] = {required = true, type = "full language", default = "und"},
[2] = {list = true, allow_holes = true},
["nocat"] = {type = "boolean"},
}
)
local lang = args[1]
local langname = lang:getCanonicalName()
local parts = args[2]
-- Create steps
-- FIXME: We should probably use format_categories() in [[Module:utilities]] rather than constructing categories
-- manually.
local categories = {}
-- Here and below, we ignore any cleanup categories coming out of make_rhyme_link() by adding an extra set of parens
-- around the call to make_rhyme_link() to cause the second argument (the categories) to be ignored. {{rhymes nav}}
-- is run on a rhymes page so it's not clear we want the page to be added to any such categories, if they exist.
local steps = {"[[Wiktionary:Rhymes|Rhymes]]", (make_rhyme_link(lang))}
if #parts > 0 then
local last = parts[#parts]
parts[#parts] = nil
local prefix = ""
for i, part in ipairs(parts) do
prefix = prefix .. part
parts[i] = prefix
end
for _, part in ipairs(parts) do
insert(steps, (make_rhyme_link(lang, part .. "-", "-" .. part .. "-")))
end
if last == "-" then
insert(steps, (make_rhyme_link(lang, prefix, "-" .. prefix)))
insert(categories, "[[Category:" .. langname .. " तुकांत" .. (prefix == "" and "" or "/" .. prefix .. "-") .. "| ]]")
elseif mw.title.getCurrentTitle().text == langname .. "/" .. prefix .. last .. "-" then -- DO NOT replace with mw.loadData("Module:headword/data").pagename as we need the root portion
insert(steps, (make_rhyme_link(lang, prefix .. last .. "-", "-" .. prefix .. last .. "-")))
insert(categories, "[[Category:" .. langname .. " तुकांत/" .. prefix .. last .. "-|-]]")
else
insert(steps, (make_rhyme_link(lang, prefix .. last, "-" .. prefix .. last)))
insert(categories, "[[Category:" .. langname .. " तुकांत" .. (prefix == "" and "" or "/" .. prefix .. "-") .. "|" .. last .. "]]")
end
elseif lang:getCode() ~= "und" then
insert(categories, "[[Category:" .. langname .. " तुकांत| ]]")
end
if mw.title.getCurrentTitle().nsText == "तुकांत" then
frame:callParserFunction("DISPLAYTITLE",
mw.title.getCurrentTitle().fullText:gsub(
"/(.+)$",
function (rhyme)
return "/" .. (tag_rhyme(rhyme, lang)) -- ignore cleanup categories
end))
end
local templateStyles = require(TemplateStyles_module)(rhymes_styles_css_module)
local ol = mw.html.create("ol")
for _, step in ipairs(steps) do
ol:node(mw.html.create("li"):wikitext(step))
end
local div = mw.html.create("div")
:attr("role", "navigation")
:attr("aria-label", "Breadcrumb")
:addClass("ts-rhymesBreadcrumbs")
:node(ol)
local formatted_cats = args.nocat and "" or concat(categories)
return templateStyles .. tostring(div) .. formatted_cats
end
return export
are6gnmps5oiwn03zvwnbz12pu6ke3y
मॉड्यूल:audio
828
304141
487762
475458
2026-09-02T16:04:06Z
SM7
6218
updating...
487762
Scribunto
text/plain
local export = {}
local headword_data_module = "Module:headword/data"
local IPA_module = "Module:IPA"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameters_module = "Module:parameters"
local qualifier_module = "Module:qualifier"
local references_module = "Module:references"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_styles_module = "Module:TemplateStyles"
local utilities_module = "Module:utilities"
local audio_styles_css = "audio/styles.css"
local function track(page)
require("Module:debug/track")("audio/" .. page)
return true
end
local function wrap_qualifier_css(text, suffix)
return require(qualifier_module).wrap_qualifier_css(text, suffix)
end
--[==[
Display a box that can be used to play an audio file. `data` is a table containing the following fields:
* `lang` ('''required'''): language object for the audio files;
* `file` ('''required'''): file containing the audio;
* `caption`: Caption to display before the audio box; normally {"Audio"}, and does not usually need to be changed;
* `nocaption`: If specified, don't display the caption;
* `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]]
and displayed before the audio box and after the caption (and any accent qualifiers);
* `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the audio box (and after any
accent qualifiers);
* `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in
[[Module:accent qualifier]] and displayed before the audio box and after the caption;
* `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the homophone in question;
* `refs`: {nil} or a list of references or reference specs to add directly after the audio box; the value of a list item
is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or
a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the
reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}})
and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section;
* `text`: Text of the audio snippet; if specified, should be an object of the form passed to {full_link()} in
[[Module:links]], including a `lang` field containing the language of the text (usually the same as `data.lang`);
displayed before the audio box, after any regular and accent qualifiers;
* `IPA`: IPA of the audio snippet, or a list of IPA specs; if specified, should be surrounded by slashes or brackets,
and will be processed using {format_IPA_multiple()} in [[Module:IPA]] and displayed before the audio box, after any
regular and accent qualifiers and after the text of the audio snippet, if given;
* `nocat`: If true, suppress categorization;
* `sort`: Sort key for categorization.
]==]
function export.format_audio(data)
local langname = data.lang:getFullName()
local cats = { langname .. " terms with audio pronunciation" }
local function format_a(a)
if a and a[1] then
return require(labels_module).show_labels {
lang = data.lang,
labels = a,
mode = "accent",
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
return nil
end
local function format_q(q)
if q and q[1] then
return require(qualifier_module).format_qualifier(q, false, false)
end
return nil
end
local function make_td_if(text)
if text == "" then
return text
end
return "<td>" .. text .. "</td>"
end
-- Generate the full text preceding the audio box.
local pretext_parts = {}
local function ins(text)
table.insert(pretext_parts, text)
end
local formatted_accent_labels, formatted_qualifiers, formatted_text, formatted_ipa
formatted_accent_labels = format_a(data.a)
formatted_qualifiers = format_q(data.q)
if data.text then
formatted_text = require(links_module).full_link(data.text, "term", true)
end
if data.IPA then
local ipa_cats
local ipa = data.IPA
if type(ipa) == "string" then
ipa = {ipa}
end
local ipa_items = {}
for _, ipa_item in ipairs(ipa) do
table.insert(ipa_items, {pron = ipa_item})
end
formatted_ipa, ipa_cats = require(IPA_module).format_IPA_multiple(data.lang, ipa_items, nil, "no count", "raw")
if ipa_cats[1] then
require(table_module).extend(cats, ipa_cats)
end
end
local has_qual = formatted_accent_labels or formatted_qualifiers
if not data.nocaption then
-- Track uses of caption (3=). Over time as we eliminate most of them, we can use this to find and
-- eliminate the remainder.
if data.caption then
track("caption")
end
ins(data.caption or "Audio")
if has_qual then
ins(" " .. wrap_qualifier_css("(", "brac"))
end
end
if formatted_accent_labels then
ins(formatted_accent_labels)
if formatted_qualifiers then
ins(wrap_qualifier_css(",", "comma") .. " ")
end
end
if formatted_qualifiers then
ins(formatted_qualifiers)
end
if has_qual then
if not data.nocaption then
ins(wrap_qualifier_css(")", "brac"))
end
end
if (formatted_text or formatted_ipa) and (has_qual or not data.nocaption) then
ins(wrap_qualifier_css(";", "semicolon") .. " ")
end
if formatted_text then
ins(formatted_text)
if formatted_ipa then
ins(" ")
end
end
ins(formatted_ipa)
if not data.nocaption then
ins(wrap_qualifier_css(":", "colon"))
end
local pretext = make_td_if(table.concat(pretext_parts))
-- Generate the full text following the audio box.
local posttext_parts = {}
local function ins(text)
table.insert(posttext_parts, text)
end
local formatted_post_accent_labels = format_a(data.aa)
local formatted_post_qualifiers = format_q(data.qq)
local formatted_references = data.refs and require(references_module).format_references(data.refs) or nil
if formatted_references then
ins(formatted_references)
end
if formatted_post_accent_labels or formatted_post_qualifiers then
if formatted_references then
ins(" ")
end
ins(wrap_qualifier_css("(", "brac"))
if formatted_post_accent_labels then
ins(formatted_post_accent_labels)
if formatted_post_qualifiers then
ins(wrap_qualifier_css(",", "comma") .. " ")
end
end
if formatted_post_qualifiers then
ins(formatted_post_qualifiers)
end
ins(wrap_qualifier_css(")", "brac"))
end
if data.bad then
table.insert(cats, langname .. " terms with nonstandard or incorrect audio pronunciations")
ins(" " .. require(qualifier_module).wrap_css("Note: this pronunciation may be nonstandard or incorrect: " .. data.bad, "bad-audio-note"))
end
local posttext = make_td_if(table.concat(posttext_parts))
local template = [=[
<tr>%s<td class="audiofile">[[File:%s|noicon|175px]]</td><td class="audiometa" style="font-size: 80%%;">([[:File:%s|file]])</td>%s</tr>]=]
local text = template:format(pretext, data.file, data.file, posttext)
text = '<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse; margin: 0;">' .. text .. "</table>"
local stylesheet = require(template_styles_module)(audio_styles_css)
local categories =
data.nocat and "" or
cats[1] and require(utilities_module).format_categories(cats, data.lang, data.sort) or ""
return stylesheet .. text .. categories
end
--[==[
FIXME: Old entry point for formatting multiple audios in a single table. Not used anywhere and needs rewriting to the
standard of format_audio().
Meant to be called from a module. `data` is a table containing the following fields:
<pre>
{
lang = LANGUAGE_OBJECT,
audios = {{file = "FILENAME", qualifiers = nil or {"QUALIFIER", "QUALIFIER", ...}}, ...},
caption = nil or "CAPTION"
}
</pre>
Here:
* `lang` is a language object.
* `audios` is the list of audio files to display. FILENAME is the name of the audio file without a namespace.
QUALIFIER is a qualifier string to display after the specific audio file in question, formatted using
{format_qualifier()} in [[Module:qualifier]].
* `caption`, if specified, adds a caption before the audio file.
]==]
function export.format_multiple_audios(data)
local audiocats = { data.lang:getFullName() .. " terms with audio pronunciation" }
local rows = { }
local caption = data.caption
for _, audio in ipairs(data.audios) do
local qualifiers = audio.qualifiers
local function repl(key)
if key == "file" then
return audio.file
elseif key == "caption" then
if not caption then return "" end
return "<td rowspan=" .. #data.audios .. ">" .. caption .. ":</td>"
elseif key == "qualifiers" then
if not qualifiers or not qualifiers[1] then return "" end
return "<td>" .. require(qualifier_module).format_qualifier(qualifiers) .. "</td>"
end
end
local template = [=[
<tr>{{{caption}}}
<td class="audiofile">[[File:{{{file}}}|noicon|175px]]</td>
<td class="audiometa" style="font-size: 80%;">([[:File:{{{file}}}|file]])</td>
{{{qualifiers}}}</tr>]=]
local text = (mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl))
table.insert(rows, text)
caption = nil
end
local function repl(key)
if key == "rows" then
return table.concat(rows, "\n")
end
end
local template = [=[
<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse;">
{{{rows}}}
</table>
]=]
local stylesheet = require(template_styles_module)(audio_styles_css)
local text = mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl)
local categories =
data.nocat and "" or
#audiocats > 0 and require(utilities_module).format_categories(audiocats, data.lang, data.sort) or ""
-- remove newlines due to HTML generator bug in MediaWiki(?) - newlines in tables cause list items to not end correctly
text = mw.ustring.gsub(text, "\n", "")
return stylesheet .. text .. categories
end
--[==[
Construct the `text` object passed into {format_audio()}, from raw-ish arguments (essentially, the output of {process()}
in [[Module:parameters]]). On entry, `args` contains the following fields:
* `lang` ('''required'''): Language object.
* `text`: Text. If this isn't defined and neither are any of `gloss`, `tr`, `ts`, `pos`, `lit` or `genders`, the
function returns {nil}.
* `gloss`: Gloss of text.
* `tr`: Manual transliteration of text.
* `ts`: Transcription of text.
* `pos`: Part of speech of text.
* `lit`: Literal meaning of text.
* `genders`: List of gender/number spec(s) of text.
* `sc`: Optional script object of text (rarely needs to be set).
* `pagename`: Pagename; used in place of `text` when `text` is unset but other text-related parameters are set.
If not specified, taken from the actual pagename.
]==]
function export.construct_audio_textobj(args)
local textobj
if args.text or args.gloss or args.tr or args.ts or args.pos or args.lit or args.genders and args.genders[1] then
local text = args.text or args.pagename or mw.loadData("Module:headword/data").pagename
textobj = {
lang = args.lang,
alt = wrap_qualifier_css("“", "quote") .. text .. wrap_qualifier_css("”", "quote"),
gloss = args.gloss,
tr = args.tr,
ts = args.ts,
pos = args.pos,
lit = args.lit,
genders = args.genders,
sc = args.sc,
}
end
return textobj
end
--[==[
Entry point for {{tl|audio}} template.
]==]
function export.show(frame)
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
local params = {
[compat and "lang" or 1] = {required = true, type = "language", default = "en"},
[1 + offset] = {required = true, default = "Example.ogg"},
[2 + offset] = {},
["q"] = {type = "qualifier"},
["qq"] = {type = "qualifier"},
["a"] = {type = "labels"},
["aa"] = {type = "labels"},
["ref"] = {type = "references"},
["IPA"] = {sublist = true},
["text"] = {},
["t"] = {},
["gloss"] = {alias_of = "t"},
["tr"] = {},
["ts"] = {},
["pos"] = {},
["lit"] = {},
["g"] = {sublist = true},
["sc"] = {type = "script"},
["bad"] = {},
["nocat"] = {type = "boolean"},
["sort"] = {},
["pagename"] = {},
}
local args = require(parameters_module).process(parent_args, params)
local lang = args[compat and "lang" or 1]
-- Needed in construct_audio_textobj().
args.lang = lang
local textobj = export.construct_audio_textobj(args)
local caption = args[2 + offset]
local nocaption
if caption == "-" then
caption = nil
nocaption = true
end
if caption then
-- Remove final colon if given, to avoid two colons.
caption = caption:gsub(":$", "")
end
local data = {
lang = lang,
file = args[1 + offset],
caption = caption,
nocaption = nocaption,
q = args.q,
qq = args.qq,
a = args.a,
aa = args.aa,
refs = args.ref,
text = textobj,
IPA = args.IPA,
bad = args.bad,
nocat = args.nocat,
sort = args.sort,
}
return export.format_audio(data)
end
return export
akem8fdq9thdv6zx89zo3kwaky8a452
487763
487762
2026-09-02T16:08:25Z
SM7
6218
localization
487763
Scribunto
text/plain
local export = {}
local headword_data_module = "Module:headword/data"
local IPA_module = "Module:IPA"
local labels_module = "Module:labels"
local links_module = "Module:links"
local parameters_module = "Module:parameters"
local qualifier_module = "Module:qualifier"
local references_module = "Module:references"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_styles_module = "Module:TemplateStyles"
local utilities_module = "Module:utilities"
local audio_styles_css = "audio/styles.css"
local function track(page)
require("Module:debug/track")("audio/" .. page)
return true
end
local function wrap_qualifier_css(text, suffix)
return require(qualifier_module).wrap_qualifier_css(text, suffix)
end
--[==[
Display a box that can be used to play an audio file. `data` is a table containing the following fields:
* `lang` ('''required'''): language object for the audio files;
* `file` ('''required'''): file containing the audio;
* `caption`: Caption to display before the audio box; normally {"Audio"}, and does not usually need to be changed;
* `nocaption`: If specified, don't display the caption;
* `q`: {nil} or a list of left regular qualifier strings, formatted using {format_qualifier()} in [[Module:qualifier]]
and displayed before the audio box and after the caption (and any accent qualifiers);
* `qq`: {nil} or a list of right regular qualifier strings, displayed directly after the audio box (and after any
accent qualifiers);
* `a`: {nil} or a list of left accent qualifier strings, formatted using {format_qualifiers()} in
[[Module:accent qualifier]] and displayed before the audio box and after the caption;
* `aa`: {nil} or a list of right accent qualifier strings, displayed directly after the homophone in question;
* `refs`: {nil} or a list of references or reference specs to add directly after the audio box; the value of a list item
is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or
a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the
reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}})
and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section;
* `text`: Text of the audio snippet; if specified, should be an object of the form passed to {full_link()} in
[[Module:links]], including a `lang` field containing the language of the text (usually the same as `data.lang`);
displayed before the audio box, after any regular and accent qualifiers;
* `IPA`: IPA of the audio snippet, or a list of IPA specs; if specified, should be surrounded by slashes or brackets,
and will be processed using {format_IPA_multiple()} in [[Module:IPA]] and displayed before the audio box, after any
regular and accent qualifiers and after the text of the audio snippet, if given;
* `nocat`: If true, suppress categorization;
* `sort`: Sort key for categorization.
]==]
function export.format_audio(data)
local langname = data.lang:getFullName()
local cats = { langname .. " टर्म ऑडियो उच्चारण के साथ" }
local function format_a(a)
if a and a[1] then
return require(labels_module).show_labels {
lang = data.lang,
labels = a,
mode = "accent",
nocat = true,
open = false,
close = false,
no_track_already_seen = true,
}
end
return nil
end
local function format_q(q)
if q and q[1] then
return require(qualifier_module).format_qualifier(q, false, false)
end
return nil
end
local function make_td_if(text)
if text == "" then
return text
end
return "<td>" .. text .. "</td>"
end
-- Generate the full text preceding the audio box.
local pretext_parts = {}
local function ins(text)
table.insert(pretext_parts, text)
end
local formatted_accent_labels, formatted_qualifiers, formatted_text, formatted_ipa
formatted_accent_labels = format_a(data.a)
formatted_qualifiers = format_q(data.q)
if data.text then
formatted_text = require(links_module).full_link(data.text, "टर्म", true)
end
if data.IPA then
local ipa_cats
local ipa = data.IPA
if type(ipa) == "string" then
ipa = {ipa}
end
local ipa_items = {}
for _, ipa_item in ipairs(ipa) do
table.insert(ipa_items, {pron = ipa_item})
end
formatted_ipa, ipa_cats = require(IPA_module).format_IPA_multiple(data.lang, ipa_items, nil, "no count", "raw")
if ipa_cats[1] then
require(table_module).extend(cats, ipa_cats)
end
end
local has_qual = formatted_accent_labels or formatted_qualifiers
if not data.nocaption then
-- Track uses of caption (3=). Over time as we eliminate most of them, we can use this to find and
-- eliminate the remainder.
if data.caption then
track("caption")
end
ins(data.caption or "ऑडियो")
if has_qual then
ins(" " .. wrap_qualifier_css("(", "brac"))
end
end
if formatted_accent_labels then
ins(formatted_accent_labels)
if formatted_qualifiers then
ins(wrap_qualifier_css(",", "comma") .. " ")
end
end
if formatted_qualifiers then
ins(formatted_qualifiers)
end
if has_qual then
if not data.nocaption then
ins(wrap_qualifier_css(")", "brac"))
end
end
if (formatted_text or formatted_ipa) and (has_qual or not data.nocaption) then
ins(wrap_qualifier_css(";", "semicolon") .. " ")
end
if formatted_text then
ins(formatted_text)
if formatted_ipa then
ins(" ")
end
end
ins(formatted_ipa)
if not data.nocaption then
ins(wrap_qualifier_css(":", "colon"))
end
local pretext = make_td_if(table.concat(pretext_parts))
-- Generate the full text following the audio box.
local posttext_parts = {}
local function ins(text)
table.insert(posttext_parts, text)
end
local formatted_post_accent_labels = format_a(data.aa)
local formatted_post_qualifiers = format_q(data.qq)
local formatted_references = data.refs and require(references_module).format_references(data.refs) or nil
if formatted_references then
ins(formatted_references)
end
if formatted_post_accent_labels or formatted_post_qualifiers then
if formatted_references then
ins(" ")
end
ins(wrap_qualifier_css("(", "brac"))
if formatted_post_accent_labels then
ins(formatted_post_accent_labels)
if formatted_post_qualifiers then
ins(wrap_qualifier_css(",", "comma") .. " ")
end
end
if formatted_post_qualifiers then
ins(formatted_post_qualifiers)
end
ins(wrap_qualifier_css(")", "brac"))
end
if data.bad then
table.insert(cats, langname .. " terms with nonstandard or incorrect audio pronunciations")
ins(" " .. require(qualifier_module).wrap_css("Note: this pronunciation may be nonstandard or incorrect: " .. data.bad, "bad-audio-note"))
end
local posttext = make_td_if(table.concat(posttext_parts))
local template = [=[
<tr>%s<td class="audiofile">[[File:%s|noicon|175px]]</td><td class="audiometa" style="font-size: 80%%;">([[:File:%s|file]])</td>%s</tr>]=]
local text = template:format(pretext, data.file, data.file, posttext)
text = '<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse; margin: 0;">' .. text .. "</table>"
local stylesheet = require(template_styles_module)(audio_styles_css)
local categories =
data.nocat and "" or
cats[1] and require(utilities_module).format_categories(cats, data.lang, data.sort) or ""
return stylesheet .. text .. categories
end
--[==[
FIXME: Old entry point for formatting multiple audios in a single table. Not used anywhere and needs rewriting to the
standard of format_audio().
Meant to be called from a module. `data` is a table containing the following fields:
<pre>
{
lang = LANGUAGE_OBJECT,
audios = {{file = "FILENAME", qualifiers = nil or {"QUALIFIER", "QUALIFIER", ...}}, ...},
caption = nil or "CAPTION"
}
</pre>
Here:
* `lang` is a language object.
* `audios` is the list of audio files to display. FILENAME is the name of the audio file without a namespace.
QUALIFIER is a qualifier string to display after the specific audio file in question, formatted using
{format_qualifier()} in [[Module:qualifier]].
* `caption`, if specified, adds a caption before the audio file.
]==]
function export.format_multiple_audios(data)
local audiocats = { data.lang:getFullName() .. " टर्म ऑडियो उच्चारण के साथ" }
local rows = { }
local caption = data.caption
for _, audio in ipairs(data.audios) do
local qualifiers = audio.qualifiers
local function repl(key)
if key == "file" then
return audio.file
elseif key == "caption" then
if not caption then return "" end
return "<td rowspan=" .. #data.audios .. ">" .. caption .. ":</td>"
elseif key == "qualifiers" then
if not qualifiers or not qualifiers[1] then return "" end
return "<td>" .. require(qualifier_module).format_qualifier(qualifiers) .. "</td>"
end
end
local template = [=[
<tr>{{{caption}}}
<td class="audiofile">[[File:{{{file}}}|noicon|175px]]</td>
<td class="audiometa" style="font-size: 80%;">([[:File:{{{file}}}|file]])</td>
{{{qualifiers}}}</tr>]=]
local text = (mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl))
table.insert(rows, text)
caption = nil
end
local function repl(key)
if key == "rows" then
return table.concat(rows, "\n")
end
end
local template = [=[
<table class="audiotable" style="vertical-align: middle; display: inline-block; list-style: none; line-height: 1em; border-collapse: collapse;">
{{{rows}}}
</table>
]=]
local stylesheet = require(template_styles_module)(audio_styles_css)
local text = mw.ustring.gsub(template, "{{{([a-z0-9_:]+)}}}", repl)
local categories =
data.nocat and "" or
#audiocats > 0 and require(utilities_module).format_categories(audiocats, data.lang, data.sort) or ""
-- remove newlines due to HTML generator bug in MediaWiki(?) - newlines in tables cause list items to not end correctly
text = mw.ustring.gsub(text, "\n", "")
return stylesheet .. text .. categories
end
--[==[
Construct the `text` object passed into {format_audio()}, from raw-ish arguments (essentially, the output of {process()}
in [[Module:parameters]]). On entry, `args` contains the following fields:
* `lang` ('''required'''): Language object.
* `text`: Text. If this isn't defined and neither are any of `gloss`, `tr`, `ts`, `pos`, `lit` or `genders`, the
function returns {nil}.
* `gloss`: Gloss of text.
* `tr`: Manual transliteration of text.
* `ts`: Transcription of text.
* `pos`: Part of speech of text.
* `lit`: Literal meaning of text.
* `genders`: List of gender/number spec(s) of text.
* `sc`: Optional script object of text (rarely needs to be set).
* `pagename`: Pagename; used in place of `text` when `text` is unset but other text-related parameters are set.
If not specified, taken from the actual pagename.
]==]
function export.construct_audio_textobj(args)
local textobj
if args.text or args.gloss or args.tr or args.ts or args.pos or args.lit or args.genders and args.genders[1] then
local text = args.text or args.pagename or mw.loadData("Module:headword/data").pagename
textobj = {
lang = args.lang,
alt = wrap_qualifier_css("“", "quote") .. text .. wrap_qualifier_css("”", "quote"),
gloss = args.gloss,
tr = args.tr,
ts = args.ts,
pos = args.pos,
lit = args.lit,
genders = args.genders,
sc = args.sc,
}
end
return textobj
end
--[==[
Entry point for {{tl|audio}} template.
]==]
function export.show(frame)
local parent_args = frame:getParent().args
local compat = parent_args.lang
local offset = compat and 0 or 1
local params = {
[compat and "lang" or 1] = {required = true, type = "language", default = "en"},
[1 + offset] = {required = true, default = "Example.ogg"},
[2 + offset] = {},
["q"] = {type = "qualifier"},
["qq"] = {type = "qualifier"},
["a"] = {type = "labels"},
["aa"] = {type = "labels"},
["ref"] = {type = "references"},
["IPA"] = {sublist = true},
["text"] = {},
["t"] = {},
["gloss"] = {alias_of = "t"},
["tr"] = {},
["ts"] = {},
["pos"] = {},
["lit"] = {},
["g"] = {sublist = true},
["sc"] = {type = "script"},
["bad"] = {},
["nocat"] = {type = "boolean"},
["sort"] = {},
["pagename"] = {},
}
local args = require(parameters_module).process(parent_args, params)
local lang = args[compat and "lang" or 1]
-- Needed in construct_audio_textobj().
args.lang = lang
local textobj = export.construct_audio_textobj(args)
local caption = args[2 + offset]
local nocaption
if caption == "-" then
caption = nil
nocaption = true
end
if caption then
-- Remove final colon if given, to avoid two colons.
caption = caption:gsub(":$", "")
end
local data = {
lang = lang,
file = args[1 + offset],
caption = caption,
nocaption = nocaption,
q = args.q,
qq = args.qq,
a = args.a,
aa = args.aa,
refs = args.ref,
text = textobj,
IPA = args.IPA,
bad = args.bad,
nocat = args.nocat,
sort = args.sort,
}
return export.format_audio(data)
end
return export
2v2s1ab6b8g04hjzga4p1u44idh93au
मॉड्यूल:interproject
828
304234
487847
487529
2026-09-02T20:09:23Z
SM7
6218
updating...
487847
Scribunto
text/plain
local export = {}
local m_links = require("Module:links")
local m_params = require("Module:parameters")
local en_utilities_module = "Module:en-utilities"
local parse_interface_module = "Module:parse interface"
local parse_utilities_module = "Module:parse utilities"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local wikimedia_languages_module = "Module:wikimedia languages"
local full_link = m_links.full_link
local concat = table.concat
local insert = table.insert
local boolean_param = {type = "boolean"}
local function track(page)
require("Module:debug/track")("interproject/" .. page)
end
local disambiguation_data
local function get_disambiguation_format_string(language)
if not disambiguation_data then
disambiguation_data = mw.loadData("Module:interproject/data/disambiguation")
end
return disambiguation_data[language] or "%s (disambiguation)"
end
-- Split an argument on comma, but not comma followed by whitespace, or backslash + comma, or comma inside of brackets.
local function split_on_comma(val)
if val:find(",") then
return require(parse_interface_module).split_on_comma(val)
else
return {val}
end
end
-- Join one or more items using commas, with "and" between the last two items.
local function join_on_comma(val)
if val[2] then
return require(table_module).serialCommaJoin(val)
else
return val[1]
end
end
-- Replace + with the pagename, but replace \+ with +.
local function substitute_plus(val, pagename)
if not val then
return val
end
if val:find("%+") then
val = val:gsub("%\\%+", "\1"):gsub("%+", require(string_utilities_module).replacement_escape(pagename)):
gsub("\1", "+")
end
return val
end
local function process_links(linkdata, prefix, name, wmlang, sc)
local links = {}
local iplinks = {}
for _, link in ipairs(linkdata) do
local this_wmlang = link.wmlang or wmlang
local this_prefix = prefix .. ":" .. (this_wmlang:getCode() == "en" and "" or this_wmlang:getCode() .. ":")
local lang = this_wmlang:getWiktionaryLanguage()
local ipalt = name .. " " .. (this_wmlang:getCode() == "en" and "" or "<sup>" .. this_wmlang:getCode() ..
"</sup>")
link.lang = lang
link.sc = sc
link.track_sc = true
link.no_nonstandard_sc_cat = true
link.tr = "-"
-- Strip diacritics according to Wiktionary language principles. This isn't done automatically with Wikipedia
-- links but seems a good idea to do. Prefix the link with a colon to override this. We try to separate the
-- fragment before doing this to avoid the term getting converted to an unsupported title, and don't do any
-- diacritic stripping on non-mainspace Wikipedia links.
if link.term:find("^:") then
link.term = link.term:sub(2)
elseif not link.term:find(":") then
-- Apply some Wikipedia-style transformations before calling stripDiacritics() to avoid problems with
-- the punctuation getting stripped.
local term, fragment = m_links.get_fragment(link.term:gsub("_", " "):gsub("%?", "%%3F"):gsub("!", "%%21"))
-- FIXME: This isn't sustainable and has to be removed.
local stripped_term = lang:stripDiacritics(term)
if stripped_term ~= term then
link.alt = link.alt or link.term
link.term = stripped_term .. (fragment and "#" .. fragment or "")
end
end
if link.fragment ~= nil then
link.alt = (link.alt or link.term) .. " § " .. link.fragment
end
if link.alt == link.term then
link.alt = nil
end
link.term = this_prefix .. link.term
insert(iplinks, "<span class=\"interProject\">[[" .. mw.ustring.gsub(link.term, "'''?", "") .. "|" .. ipalt ..
"]]</span>")
insert(links, full_link(link, "bold"))
end
return links, iplinks
end
local function parse_one_wikipedia_link(val, pagename, default_wmlang, link_prefix)
local origval = val
local rest, dab = val:match("^(.*)<(dab!?)>$")
val = rest or val
local langcode, rest = val:match("^([a-z][a-z-]+):(.*)$")
if rest and not rest:find("^ ") then
val = rest
else
langcode = nil
end
local wmlang
if langcode then
wmlang = require(wikimedia_languages_module).getByCodeWithFallback(langcode)
if not wmlang then
error(("Unrecogized Wikimedia or Wiktionary code '%s': %s"):format(langcode,
-- FIXME, move escape_wikicode() elsewhere
require(parse_utilities_module).escape_wikicode(origval)))
end
else
wmlang = default_wmlang
end
local link, label = val:match("^%[%[(.-)|(.*)%]%]$")
if not link then
link = val:match("^%[%[(.*)%]%]$")
end
link = link or val
local rest, fragment = link:match("^(.-)#(.*)$")
link = rest or link
if link == "" then
link = "+"
end
link = substitute_plus(link, pagename)
label = substitute_plus(label, pagename)
fragment = substitute_plus(fragment, pagename)
local user_specified_label = not not label
label = label or link
if label == "" then
-- implement pipe trick
rest = link:match("^(.+) %(.-%)$")
if rest then
label = rest
else
label = link:gsub(",.*$", "")
end
end
if dab == "dab" or dab == "dab!" then
link = get_disambiguation_format_string(wmlang:getCode()):format(link)
end
if dab == "dab!" then
label = get_disambiguation_format_string(wmlang:getCode()):format(label)
end
if user_specified_label and fragment then
link = link .. "#" .. fragment
fragment = nil
end
return {wmlang = wmlang, term = link_prefix .. link, alt = label, fragment = fragment}
end
local function parse_wikipedia_links(val, pagename, default_wmlang, link_prefix)
local raw_links = split_on_comma(val)
for i, raw_link in ipairs(raw_links) do
raw_links[i] = parse_one_wikipedia_link(raw_link, pagename, default_wmlang, link_prefix)
default_wmlang = raw_links[i].wmlang
end
return raw_links
end
-- FIXME: From [[Module:zh/templates]] implementation of old {{zh-wp}}; do we want something like this?
--local wp_data = {
-- ["zh"] = { "Written Standard Chinese<sup>[[w:Written vernacular Chinese|?]]</sup>", "zh" },
-- ["cdo"] = { "Eastern Min", "cdo" },
-- ["gan"] = { "Gan", "zh" },
-- ["hak"] = { "Hakka", "hak" },
-- ["lzh"] = { "Classical", "zh" },
-- ["nan"] = { "Southern Min", "nan" },
-- ["wuu"] = { "Wu", "zh" },
-- ["yue"] = { "Cantonese", "zh" },
--}
local function format_wikipedia_box(frame, linkdata, linktype, slim, sc)
local wmlangcode, multibox
for i, linkspec in ipairs(linkdata) do
if i == 1 then
wmlangcode = linkspec.wmlang:getCode()
elseif wmlangcode ~= linkspec.wmlang:getCode() then
multibox = true
break
end
end
if slim and not multibox then
for _, linkspec in ipairs(linkdata) do
if linktype == "category" then
linkspec.alt = "Category:" .. linkspec.alt
elseif linktype == "portal" then
linkspec.alt = "Portal:" .. linkspec.alt
end
end
end
if not linkdata[2] then
linktype = require(en_utilities_module).add_indefinite_article(linktype)
else
linktype = require(en_utilities_module).pluralize(linktype)
end
local links, iplinks = process_links(linkdata, "w", "Wikipedia", nil, sc)
local div_prefix = "<div class=\"interproject-box sister-wikipedia sister-project noprint floatright\">"
local template_extension = frame:extensionTag("templatestyles", "", {src="Module:interproject/style.css"})
if multibox then
local result = {
div_prefix ..
"<div style=\"float: left;\">[[File:Wikipedia-logo.png|32px|none|link=|alt=]]</div>" ..
"<div style=\"margin-left: 40px;\">[[Wikipedia]] has " .. linktype .. " on:<ul>"
}
for i, linkspec in ipairs(linkdata) do
local annotation = " <span style=\"font-size:80%\">(" .. linkspec.wmlang:getCanonicalName() .. ")</span>"
insert(result, "<li>" .. links[i] .. annotation .. "</li>")
end
insert(result, "</ul></div></div>" .. template_extension)
return concat(result)
elseif slim then
local wmlang = linkdata[1].wmlang
return
div_prefix ..
"<div style=\"float: left;\">[[File:Wikipedia-logo.png|14px|none| ]]</div>" ..
"<div style=\"margin-left: 15px;\">" ..
" " ..
join_on_comma(links) ..
" on " ..
(wmlang:getCode() == "en" and "" or wmlang:getCanonicalName() .. " ") ..
"Wikipedia" ..
"</div></div>" .. template_extension
else
local wmlang = linkdata[1].wmlang
return
div_prefix ..
"<div style=\"float: left;\" class=\"interproject-box-logo\">[[File:Wikipedia-logo-v2.svg|x40px|none|link=|alt=]]</div>" ..
"<div style=\"margin-left: 60px;\">" ..
wmlang:getCanonicalName() .. " [[Wikipedia]] has " .. linktype .. " on:" ..
"<div style=\"margin-left: 10px;\">" .. join_on_comma(links) .. "</div>" ..
"</div>" .. concat(iplinks) .. "</div>" .. template_extension
end
end
function export.wikipedia_box(frame)
local params = {
[1] = true,
["cat"] = true,
["category"] = {alias_of = "cat"},
["i"] = boolean_param,
["lang"] = {type = "Wikimedia language", fallback = true, default = "en"},
["portal"] = true,
["sc"] = {type = "script"},
["pagename"] = true,
-- make old parameters throw an explanatory error; FIXME: eventually remove these.
[2] = {replaced_by = false, instead = "use a piped link in 1=, e.g. {{!((}}foo{{!}}bar{{))!}}"},
["mul"] = {replaced_by = false, instead = "use comma-separated items in 1="},
["mullabel"] = {replaced_by = false, instead = "use a piped link in 1=, e.g. {{!((}}foo{{!}}bar{{))!}}"},
["mulcat"] = {replaced_by = false, instead = "use comma-separated items in cat="},
["mulcatlabel"] = {replaced_by = false, instead = "use a piped link in cat=, e.g. {{!((}}foo{{!}}bar{{))!}}"},
["section"] = {replaced_by = false, instead = "use the syntax 'article#Section' in 1="},
}
local parargs = frame:getParent().args
local args = m_params.process(parargs, params)
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local sc = args.sc
local linkdata, linktype
if parargs.lang then
-- Tracking for old use of lang= instead of a language prefix.
track("old-wp")
end
if (args[1] and 1 or 0) + (args.cat and 1 or 0) + (args.portal and 1 or 0) > 1 then
error("Can't specify more than one of 1=, cat= and portal=")
end
local rawval, link_prefix
if args.cat then
linktype = "category"
link_prefix = "Category:"
rawval = args.cat
elseif args.portal then
linktype = "portal"
link_prefix = "Portal:"
rawval = args.portal
else
linktype = "article"
link_prefix = ""
rawval = args[1] or ""
end
linkdata = parse_wikipedia_links(rawval, pagename, args.lang, link_prefix)
return format_wikipedia_box(frame, linkdata, linktype, frame.args.slim, sc)
end
function export.projectlink(frame, compat)
local required = {required = true}
local iparams = {
["prefix"] = required,
["name"] = required,
["image"] = required,
["requirelang"] = boolean_param,
["compat"] = boolean_param,
}
local iargs = m_params.process(frame.args, iparams)
compat = compat or iargs.compat
local lang_required = iargs.requirelang or false
local lang_param = compat and "lang" or 1
local term_param = compat and 1 or 2
local alt_param = compat and 2 or 3
local params = {
[lang_param] = {type = "Wikimedia language", method = "fallback", required = lang_required, default = "en"},
[term_param] = true,
[alt_param] = true,
["i"] = boolean_param,
["nodot"] = true,
["sc"] = {type = "script"},
["section"] = true
}
local args = m_params.process(frame:getParent().args, params)
local wmlang = args[lang_param]
local sc = args["sc"]
local term = args[term_param] or mw.loadData("Module:headword/data").pagename
local linkdata = {term = term, alt = args[alt_param], fragment = args["section"]}
if args["i"] then
local prefixed = "''"
if (iargs["prefix"] == "commons:Category") then
prefixed = "Category:" .. prefixed
end
if linkdata.alt then
linkdata.alt = prefixed .. linkdata.alt .. "''"
else
-- While it is true that the link module automatically removes italics from terms,
-- linkdata.term is used outside this module too (image link and "interProject" link)
linkdata.alt = prefixed .. linkdata.term .. "''"
end
end
local links, iplinks = process_links({linkdata}, iargs["prefix"], iargs["name"], wmlang, sc)
return
"[[Image:" .. iargs["image"] .. "|15px|link=" .. iargs["prefix"] .. ":" .. (wmlang:getCode() == "en" and "" or wmlang:getCode() .. ":") .. term .. "]] " ..
concat(links, " and ") ..
" on " ..
(wmlang:getCode() == "en" and "" or "the " .. wmlang:getCanonicalName() .. " ") ..
" " .. iargs["name"] .. (args["nodot"] and "" or ".") ..
concat(iplinks)
end
return export
k4cs1tn4v37029w3ia8qq4zkyfpvwnz
मॉड्यूल:labels/data/lang
828
304265
487746
477418
2026-09-02T14:55:11Z
SM7
6218
updating...
487746
Scribunto
text/plain
-- Table listing all of the languages with lang-specific labels modules.
local langs_with_lang_specific_modules = {
["ab"] = true,
["acm"] = true,
["ady"] = true,
["ae"] = true,
["af"] = true,
["afb"] = true,
["aht"] = true,
["aii"] = true,
["ain"] = true,
["ajp"] = true,
["ak"] = true,
["akk"] = true,
["amf"] = true,
["an"] = true,
["ang"] = true,
["apc"] = true,
["ar"] = true,
["arc"] = true,
["arq"] = true,
["arz"] = true,
["as"] = true,
["ast"] = true,
["av"] = true,
["ayl"] = true,
["az"] = true,
["bar"] = true,
["bcl"] = true,
["be"] = true,
["bew"] = true,
["bg"] = true,
["bho"] = true,
["bn"] = true,
["bo"] = true,
["br"] = true,
["bsh"] = true,
["bua"] = true,
["byk"] = true,
["ca"] = true,
["car"] = true,
["cbk"] = true,
["ceb"] = true,
["cel-pro"] = true,
["ch"] = true,
["cho"] = true,
["chr"] = true,
["cim"] = true,
["ckb"] = true,
["cop"] = true,
["cpg"] = true,
["cpi"] = true,
["crh"] = true,
["crp-cpr"] = true,
["cs"] = true,
["csb"] = true,
["cu"] = true,
["cy"] = true,
["da"] = true,
["dcc"] = true,
["de"] = true,
["dlm"] = true,
["dng"] = true,
["dnj"] = true,
["dum"] = true,
["dv"] = true,
["egl"] = true,
["egy"] = true,
["el"] = true,
["en"] = true,
["enm"] = true,
["es"] = true,
["et"] = true,
["eu"] = true,
["evn"] = true,
["fa"] = true,
["fax"] = true,
["ff"] = true,
["fi"] = true,
["fo"] = true,
["fr"] = true,
["fro"] = true,
["frp"] = true,
["frr"] = true,
["fur"] = true,
["fy"] = true,
["ga"] = true,
["gd"] = true,
["gem-pro"] = true,
["gl"] = true,
["gmq-oda"] = true,
["gmq-pro"] = true,
["gmw-bgh"] = true,
["gmw-cfr"] = true,
["gmw-ecg"] = true,
["gmw-pro"] = true,
["gmw-rfr"] = true,
["gmy"] = true,
["goh"] = true,
["grc"] = true,
["grk-ita"] = true,
["gsw"] = true,
["gu"] = true,
["gug"] = true,
["guw"] = true,
["ha"] = true,
["haa"] = true,
["haw"] = true,
["he"] = true,
["hi"] = true,
["hit"] = true,
["hrx"] = true,
["hsb"] = true,
["ht"] = true,
["hu"] = true,
["hy"] = true,
["id"] = true,
["idb"] = true,
["ilo"] = true,
["inc-apa"] = true,
["inc-ash"] = true,
["inc-ohi"] = true,
["is"] = true,
["it"] = true,
["iu"] = true,
["izh"] = true,
["ja"] = true,
["jbo"] = true,
["jje"] = true,
["jut"] = true,
["jv"] = true,
["ka"] = true,
["kbd"] = true,
["kca-eas"] = true,
["kca-nor"] = true,
["kca-sou"] = true,
["kea"] = true,
["kho"] = true,
["kix"] = true,
["klj"] = true,
["kls"] = true,
["kmr"] = true,
["kn"] = true,
["kne"] = true,
["ko"] = true,
["kok"] = true,
["kpt"] = true,
["kpv"] = true,
["krc"] = true,
["krl"] = true,
["kry"] = true,
["kw"] = true,
["kzw"] = true,
["la"] = true,
["lad"] = true,
["li"] = true,
["lij"] = true,
["lis"] = true,
["liv"] = true,
["lld"] = true,
["lmo"] = true,
["lrl"] = true,
["lv"] = true,
["lzz"] = true,
["mak"] = true,
["mch"] = true,
["mco"] = true,
["mh"] = true,
["mhd"] = true,
["mic"] = true,
["mk"] = true,
["ml"] = true,
["mlm"] = true,
["mn"] = true,
["mns-cen"] = true,
["mns-nor"] = true,
["mns-sou"] = true,
["moh"] = true,
["mr"] = true,
["ms"] = true,
["mt"] = true,
["mui"] = true,
["mul"] = true,
["mus"] = true,
["mvi"] = true,
["mwl"] = true,
["my"] = true,
["nap"] = true,
["nb"] = true,
["nds"] = true,
["ne"] = true,
["new"] = true,
["nhn"] = true,
["nhx"] = true,
["niv"] = true,
["nl"] = true,
["nn"] = true,
["non"] = true,
["nrf"] = true,
["nrn"] = true,
["nv"] = true,
["oc"] = true,
["oj"] = true,
["oko"] = true,
["okz"] = true,
["onb"] = true,
["os"] = true,
["osc"] = true,
["ota"] = true,
["otk"] = true,
["pa"] = true,
["pam"] = true,
["paw"] = true,
["peh"] = true,
["phl"] = true,
["pl"] = true,
["pms"] = true,
["pnt"] = true,
["poz-pro"] = true,
["ppl"] = true,
["pra"] = true,
["ps"] = true,
["pt"] = true,
["qu"] = true,
["qwc"] = true,
["qwm"] = true,
["rcf"] = true,
["rgn"] = true,
["rm"] = true,
["rmc"] = true,
["rml"] = true,
["rmn"] = true,
["rmy"] = true,
["ro"] = true,
["roa-bbn"] = true,
["roa-leo"] = true,
["roa-ona"] = true,
["roa-opt"] = true,
["rom"] = true,
["rsk"] = true,
["ru"] = true,
["rue"] = true,
["rup"] = true,
["rw"] = true,
["rys"] = true,
["ryu"] = true,
["sa"] = true,
["saj"] = true,
["sc"] = true,
["scl"] = true,
["scn"] = true,
["sco"] = true,
["sd"] = true,
["se"] = true,
["sel-sou"] = true,
["sgh"] = true,
["sh"] = true,
["shi"] = true,
["sjd"] = true,
["sjs"] = true,
["sk"] = true,
["skr"] = true,
["sl"] = true,
["sla-pro"] = true,
["smi-pro"] = true,
["sn"] = true,
["sq"] = true,
["srn"] = true,
["su"] = true,
["sux"] = true,
["sv"] = true,
["sw"] = true,
["szl"] = true,
["ta"] = true,
["taa"] = true,
["tay"] = true,
["te"] = true,
["tet"] = true,
["tfn"] = true,
["tg"] = true,
["th"] = true,
["tkr"] = true,
["tl"] = true,
["tmh"] = true,
["tpw"] = true,
["tr"] = true,
["trk-pro"] = true,
["tsg"] = true,
["tt"] = true,
["tuw-sol"] = true,
["tyv"] = true,
["udi"] = true,
["udm"] = true,
["uk"] = true,
["ur"] = true,
["urj-fin-pro"] = true,
["uz"] = true,
["vot"] = true,
["war"] = true,
["vec"] = true,
["vi"] = true,
["vo"] = true,
["xcl"] = true,
["xh"] = true,
["xme-ker"] = true,
["xmf"] = true,
["xpg"] = true,
["xqa"] = true,
["xum"] = true,
["ycr"] = true,
["yi"] = true,
["yo"] = true,
["yok-bvy"] = true,
["yok-dly"] = true,
["yok-kry"] = true,
["yok-nvy"] = true,
["yok-svy"] = true,
["yok-tky"] = true,
["yrk-tun"] = true,
["yrl"] = true,
["za"] = true,
["xbo"] = true,
["zh"] = true,
["zle-ono"] = true,
["zle-ort"] = true,
["zls-chs"] = true,
["zlw-ocs"] = true,
["zlw-opl"] = true,
["zlw-osk"] = true,
["zlw-slv"] = true,
["zu"] = true,
}
return {
langs_with_lang_specific_modules = langs_with_lang_specific_modules,
}
lkqksfcuw1x2kj4t43eisbfne0c3a0d
मॉड्यूल:parse utilities
828
304307
487752
475624
2026-09-02T15:08:37Z
SM7
6218
updating...
487752
Scribunto
text/plain
local export = {}
local fun_is_callable_module = "Module:fun/isCallable"
local languages_module = "Module:languages"
local parameters_module = "Module:parameters"
local string_char_module = "Module:string/char"
local string_utilities_module = "Module:string utilities"
local table_insert_if_not_module = "Module:table/insertIfNot"
local assert = assert
local concat = table.concat
local dump = mw.dumpObject
local error = error
local insert = table.insert
local ipairs = ipairs
local list_to_text = mw.text.listToText
local pairs = pairs
local require = require
local sort = table.sort
local type = type
local ugsub = mw.ustring.gsub
local function convert_val(...)
convert_val = require(parameters_module).convert_val
return convert_val(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function insert_if_not(...)
insert_if_not = require(table_insert_if_not_module)
return insert_if_not(...)
end
local function is_callable(...)
is_callable = require(fun_is_callable_module)
return is_callable(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function u(...)
u = require(string_char_module)
return u(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
--[==[ intro:
In order to understand the following parsing code, you need to understand how inflected text specs work. They are
intended to work with inflected text where individual words to be inflected may be followed by inflection specs in
angle brackets. The format of the text inside of the angle brackets is up to the individual language and part-of-speech
specific implementation. A real-world example is as follows: `<nowiki>[[медичний|меди́чна]]<+> [[сестра́]]<*,*#.pr></nowiki>`.
This is the inflection of the Ukrainian multiword expression {{m|uk|меди́чна сестра́||nurse|lit=medical sister}},
consisting of two words: the adjective {{m|uk|меди́чна||medical|pos=feminine singular}} and the noun {{m|uk|сестра́||sister}}.
The specs in angle brackets follow each word to be inflected; for example, `<+>` means that the preceding word should be
declined as an adjective.
The code below works in terms of balanced expressions, which are bounded by delimiters such as `< >` or `[ ]`. The
intention is to allow separators such as spaces to be embedded inside of delimiters; such embedded separators will not
be parsed as separators. For example, Ukrainian noun specs allow footnotes in brackets to be inserted inside of angle
brackets; something like `меди́чна<+> сестра́<pr.[this is a footnote]>` is legal, as is
`<nowiki>[[медичний|меди́чна]]<+> [[сестра́]]<pr.[this is an <i>italicized footnote</i>]></nowiki>`, and the parsing code
should not be confused by the embedded brackets, spaces or angle brackets.
The parsing is done by two functions, which work in close concert: {parse_balanced_segment_run()} and
{split_alternating_runs()}. To illustrate, consider the following:
{parse_balanced_segment_run("foo<M.proper noun> bar<F>", "<", ">")} =<br />
{ {"foo", "<M.proper noun>", " bar", "<F>", ""}}
then
{split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ")} =<br />
{ {{"foo", "<M.proper noun>", ""}, {"bar", "<F>", ""}}}
Here, we start out with a typical inflected text spec `foo<M.proper noun> bar<F>`, call {parse_balanced_segment_run()} on
it, and call {split_alternating_runs()} on the result. The output of {parse_balanced_segment_run()} is a list where
even-numbered segments are bounded by the bracket-like characters passed into the function, and odd-numbered segments
consist of the surrounding text. {split_alternating_runs()} is called on this, and splits '''only''' the odd-numbered
segments, grouping all segments between the specified character. Note that the inner lists output by
{split_alternating_runs()} are themselves in the same format as the output of {parse_balanced_segment_run()}, with
bracket-bounded text in the even-numbered segments. Hence, such lists can be passed again to {split_alternating_runs()}.
]==]
--[==[
Parse a string containing matched instances of parens, brackets or the like. Return a list of strings, alternating
between textual runs not containing the open/close characters and runs beginning and ending with the open/close
characters. For example,
{parse_balanced_segment_run("foo(x(1)), bar(2)", "(", ")") = {"foo", "(x(1))", ", bar", "(2)", ""}}
]==]
function export.parse_balanced_segment_run(segment_run, open, close)
return split(segment_run, "(%b" .. open .. close .. ")")
end
-- The following is an equivalent, older implementation that does not use %b (written before I was aware of %b).
--[=[
function export.parse_balanced_segment_run(segment_run, open, close)
local break_on_open_close = split(segment_run, "([%" .. open .. "%" .. close .. "])")
local text_and_specs = {}
local level = 0
local seg_group = {}
for i, seg in ipairs(break_on_open_close) do
if i % 2 == 0 then
if seg == open then
insert(seg_group, seg)
level = level + 1
else
assert(seg == close)
insert(seg_group, seg)
level = level - 1
if level < 0 then
error("Unmatched " .. close .. " sign: '" .. segment_run .. "'")
elseif level == 0 then
insert(text_and_specs, concat(seg_group))
seg_group = {}
end
end
elseif level > 0 then
insert(seg_group, seg)
else
insert(text_and_specs, seg)
end
end
if level > 0 then
error("Unmatched " .. open .. " sign: '" .. segment_run .. "'")
end
return text_and_specs
end
]=]
--[==[
Like parse_balanced_segment_run() but accepts multiple sets of delimiters. For example,
{parse_multi_delimiter_balanced_segment_run("foo[bar(baz[bat])], quux<glorp>", {{"[", "]"}, {"(", ")"}, {"<", ">"}}) =
{"foo", "[bar(baz[bat])]", ", quux", "<glorp>", ""}}.
Each element in the list of delimiter pairs is a string specifying an equivalence class of possible delimiter
characters. You can use this, for example, to allow either "[" or "&#91;" to be treated equivalently, with either
one closed by either "]" or "&#93;". To do this, first replace "&#91;" and "&#93;" with single Unicode
characters such as U+FFF0 and U+FFF1, and then specify a two-character string containing "[" and U+FFF0 as the opening
delimiter, and a two-character string containing "]" and U+FFF1 as the corresponding closing delimiter.
If `no_error_on_unmatched` is given and an error is found during parsing, a string is returned containing the error
message instead of throwing an error.
]==]
function export.parse_multi_delimiter_balanced_segment_run(segment_run, delimiter_pairs, no_error_on_unmatched)
local escaped_delimiter_pairs = {}
local open_to_close_map = {}
local open_close_items = {}
local open_items = {}
for _, open_close in ipairs(delimiter_pairs) do
local open, close = open_close[1], open_close[2]
open = open:gsub("([%[%]%%%%-])", "%%%1")
close = close:gsub("([%[%]%%%%-])", "%%%1")
insert(open_close_items, open)
insert(open_close_items, close)
insert(open_items, open)
open = "[" .. open .. "]"
close = "[" .. close .. "]"
open_to_close_map[open] = close
insert(escaped_delimiter_pairs, {open, close})
end
local open_close_pattern = "([" .. concat(open_close_items) .. "])"
local open_pattern = "([" .. concat(open_items) .. "])"
local break_on_open_close = split(segment_run, open_close_pattern)
local text_and_specs = {}
local level = 0
local seg_group = {}
local open_at_level_zero
for i, seg in ipairs(break_on_open_close) do
if i % 2 == 0 then
insert(seg_group, seg)
if level == 0 then
if not umatch(seg, open_pattern) then
local errmsg = "Unmatched close sign " .. seg .. ": '" .. segment_run .. "'"
if no_error_on_unmatched then
return errmsg
else
error(errmsg)
end
end
assert(open_at_level_zero == nil)
for _, open_close in ipairs(escaped_delimiter_pairs) do
local open = open_close[1]
if umatch(seg, open) then
open_at_level_zero = open
break
end
end
if open_at_level_zero == nil then
error(("Internal error: Segment %s didn't match any open regex"):format(seg))
end
level = level + 1
elseif umatch(seg, open_at_level_zero) then
level = level + 1
elseif umatch(seg, open_to_close_map[open_at_level_zero]) then
level = level - 1
assert(level >= 0)
if level == 0 then
insert(text_and_specs, concat(seg_group))
seg_group = {}
open_at_level_zero = nil
end
end
elseif level > 0 then
insert(seg_group, seg)
else
insert(text_and_specs, seg)
end
end
if level > 0 then
local errmsg = "Unmatched open sign " .. open_at_level_zero .. ": '" .. segment_run .. "'"
if no_error_on_unmatched then
return errmsg
else
error(errmsg)
end
end
return text_and_specs
end
--[==[
Check whether a term contains top-level HTML. We want to distinguish inline modifiers from HTML. We assume an inline
modifier is either a boolean modifier like `<bor>` or a prefix modifier like `<tr:Miryem>`. All other things inside of
angle brackets, e.g. `<nowiki><span class="foo"></nowiki>`, `<nowiki></span></nowiki>`, `<nowiki><br/></nowiki>`, etc.,
should be flagged as HTML (typically caused by wrapping an argument in {{tl|m|...}}, {{tl|af|...}} or similar, but
sometimes specified directly, e.g. `<nowiki><sup>6</sup></nowiki>`). By default, we assume the tag in an inline modifier
contains either letters, numbers, hyphens or underscore (but not spaces), and must either stand alone or be followed by
a colon, leading to a default HTML-checking pattern of {"<[%w_%-]*[^%w_%-:>]"}. But this can be modified; e.g.
[[Module:tl-pronunciation]] allows modifiers of the form `<<var>pos</var>^<var>defn</var>>` or
`<<var>pos</var>,<var>pos</var>,<var>pos</var>^<var>defn</var>>`, and would need to use its own HTML pattern. It's
important we restrict the check for HTML to top-level to allow for generated HTML inside of e.g. qualifier tags, such as
`<nowiki>foo<q:similar to {{m|fr|bar}}></nowiki>`.
]==]
function export.term_contains_top_level_html(term, html_pattern)
html_pattern = html_pattern or "<[%w_%-]*[^%w_%-:>]"
-- If no HTML anywhere, the answer is no.
if not term:find(html_pattern) then
return false
end
-- Otherwise, we have to call parse_balanced_segment_run() and check alternate runs at top level.
local runs = export.parse_balanced_segment_run(term, "<", ">")
for i = 2, #runs, 2 do
if runs[i]:find("^" .. html_pattern) then
return true
end
end
return false
end
--[==[
Check whether a term appears to have already been passed through `full_link()`. Passing it again will mangle it in
various ways; at best it will have unnecessary lang/script wrapping, which might do nothing but might result in
overly large fonts or other issues. We also check for uses of {{tl|ja-r/args}}, {{tl|ryu-r/args}} or {{tl|ko-l/args}},
which will be manged by `full_link()`. If this check succeeds, use the text raw instead of passing through
`full_link()`.
]==]
function export.term_already_linked(term)
return term:find("<span") or term:find("{{ja%-r|") or term:find("{{ryu%-r|") or term:find("{{ko%-l|")
end
--[==[
Split a list of alternating textual runs of the format returned by `parse_balanced_segment_run` on `splitchar`. This
only splits the odd-numbered textual runs (the portions between the balanced open/close characters). The return value
is a list of lists, where each list contains an odd number of elements, where the even-numbered elements of the sublists
are the original balanced textual run portions. For example, if we do
{parse_balanced_segment_run("foo<M.proper noun> bar<F>", "<", ">") =
{"foo", "<M.proper noun>", " bar", "<F>", ""}}
then
{split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ") =
{{"foo", "<M.proper noun>", ""}, {"bar", "<F>", ""}}}
Note that we did not touch the text "<M.proper noun>" even though it contains a space in it, because it is an
even-numbered element of the input list. This is intentional and allows for embedded separators inside of
brackets/parens/etc. Note also that the inner lists in the return value are of the same form as the input list (i.e.
they consist of alternating textual runs where the even-numbered segments are balanced runs), and can in turn be passed
to split_alternating_runs().
If `preserve_splitchar` is passed in, the split character is included in the output, as follows:
{split_alternating_runs({"foo", "<M.proper noun>", " bar", "<F>", ""}, " ", true) =
{{"foo", "<M.proper noun>", ""}, {" "}, {"bar", "<F>", ""}}}
Consider what happens if the original string has multiple spaces between brackets, and multiple sets of brackets
without spaces between them.
{parse_balanced_segment_run("foo[dated][low colloquial] baz-bat quux xyzzy[archaic]", "[", "]") =
{"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}}
then
{split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz-bat quux xyzzy", "[archaic]", ""}, "[ %-]") =
{{"foo", "[dated]", "", "[low colloquial]", ""}, {"baz"}, {"bat"}, {"quux"}, {"xyzzy", "[archaic]", ""}}}
If `preserve_splitchar` is passed in, the split character is included in the output,
as follows:
{split_alternating_runs({"foo", "[dated]", "", "[low colloquial]", " baz bat quux xyzzy", "[archaic]", ""}, "[ %-]", true) =
{{"foo", "[dated]", "", "[low colloquial]", ""}, {" "}, {"baz"}, {"-"}, {"bat"}, {" "}, {"quux"}, {" "}, {"xyzzy", "[archaic]", ""}}}
As can be seen, the even-numbered elements in the outer list are one-element lists consisting of the separator text.
]==]
function export.split_alternating_runs(segment_runs, splitchar, preserve_splitchar)
local grouped_runs = {}
local run = {}
for i, seg in ipairs(segment_runs) do
if i % 2 == 0 then
insert(run, seg)
else
local parts = split(seg, preserve_splitchar and "(" .. splitchar .. ")" or splitchar)
insert(run, parts[1])
for j=2,#parts do
insert(grouped_runs, run)
run = {parts[j]}
end
end
end
if #run > 0 then
insert(grouped_runs, run)
end
return grouped_runs
end
--[==[
After calling `parse_multi_delimiter_balanced_segment_run()`, rejoin delimiter-bounded textual runs (i.e. textual runs
surrounded by certain matched delimiters) with the runs on either side. This can be used when some of the matched
delimiters are specified only in order to ensure that delimiters inside of other delimiters aren't parsed. As an
example, [[Module:object usage]] calls
{m_parse_utilities.parse_multi_delimiter_balanced_segment_run(object, {{"[", "]"}, {"(", ")"}, {"<", ">"}})} but the
actual syntax of {{tl|+obj}} only uses parens and angle brackets as delimiters. Square brackets are included so that
internal links are treated as units (i.e. parens and angle brackets occurring inside of them aren't parsed), but beyond
that we don't treat square brackets as delimiters, so we want to rejoin square-bracket-delimited textual runs with
adjacent runs before further parsing.
There are two primary workflows when using this function:
# If you only care about balanced delimiters occurring inside of other balanced delimiters (e.g. in the above example
with [[Module:object usage]], you can call `rejoin_delimited_runs()` directly after
`parse_multi_delimiter_balanced_segment_run()`.
# However, if you care about single delimiters such as commas and slashes occurring inside of balanced delimiters (e.g.
if you allow multiple comma-separated terms, e.g. of which can have associated inline modifiers, and you don't want
commas inside of internal links to be treated as delimiters), you need to call `rejoin_delimited_runs()` ''after''
calling `split_alternating_runs()`. This is used, for example, in `parse_inline_modifiers()` for exactly this reason,
when a `splitchar` is provided.
`data` is an object of properties. Currently there are two: `runs` (the output of calling
`parse_multi_delimiter_balanced_segment_run()`, i.e. a list of textual runs, where even-numbered elements begin and end
with a matched delimiter and odd-numbered elements are surrounding text) and `delimiter_pattern` (a Lua pattern matching
delimited textual runs that we want to rejoin with the surrounding text). `delimiter_pattern` should normally be
anchored at the beginning; e.g. {"^%["} would be the correct pattern to use when rejoining square-bracket-delimited
textual runs, as described above.
]==]
function export.rejoin_delimited_runs(data)
local joined_runs = {}
local i = 1
while i <= #data.runs do
local run = data.runs[i]
if i % 2 == 0 and run:find(data.delimiter_pattern) then
joined_runs[#joined_runs] = joined_runs[#joined_runs] .. run .. data.runs[i + 1]
i = i + 2
else
insert(joined_runs, run)
i = i + 1
end
end
return joined_runs
end
function export.strip_spaces(text)
return (ugsub(text, "^%s*(.-)%s*$", "%1"))
end
--[==[
Apply an arbitrary function `frob` to the "raw-text" segments in a split run set (the output of
split_alternating_runs()). We leave alone stuff within balanced delimiters (footnotes, inflection specs and the
like), as well as splitchars themselves if present. `preserve_splitchar` indicates whether splitchars are present
in the split run set. `frob` is a function of one argument (the string to frob) and should return one argument (the
frobbed string). We operate by only frobbing odd-numbered segments, and only in odd-numbered runs if
preserve_splitchar is given.
]==]
function export.frob_raw_text_alternating_runs(split_run_set, frob, preserve_splitchar)
for i, run in ipairs(split_run_set) do
if not preserve_splitchar or i % 2 == 1 then
for j, segment in ipairs(run) do
if j % 2 == 1 then
run[j] = frob(segment)
end
end
end
end
end
--[==[
Like split_alternating_runs() but applies an arbitrary function `frob` to "raw-text" segments in the result (i.e.
not stuff within balanced delimiters such as footnotes and inflection specs, and not splitchars if present). `frob`
is a function of one argument (the string to frob) and should return one argument (the frobbed string).
]==]
function export.split_alternating_runs_and_frob_raw_text(run, splitchar, frob, preserve_splitchar)
local split_runs = export.split_alternating_runs(run, splitchar, preserve_splitchar)
export.frob_raw_text_alternating_runs(split_runs, frob, preserve_splitchar)
return split_runs
end
--[==[
FIXME: Older entry point. Call `split_alternating_runs_and_frob_raw_text()` in [[Module:parse utilities]] directly.
Like `split_alternating_runs()` but strips spaces from both ends of the odd-numbered elements (only in odd-numbered runs
if `preserve_splitchar` is given). Effectively we leave alone the footnotes and splitchars themselves, but otherwise
strip extraneous spaces. Spaces in the middle of an element are also left alone.
]==]
function export.split_alternating_runs_and_strip_spaces(segment_runs, splitchar, preserve_splitchar)
return export.split_alternating_runs_and_frob_raw_text(segment_runs, splitchar, export.strip_spaces, preserve_splitchar)
end
--[==[
Split the non-modifier parts of an alternating run (after parse_balanced_segment_run() is called) on a Lua pattern,
but not on certain sequences involving characters in that pattern (e.g. comma+whitespace). `splitchar` is the pattern
to split on; `preserve_splitchar` indicates whether to preserve the delimiter and is the same as in
split_alternating_runs(). `escape_fun` is called beforehand on each run of raw text and should return two values:
the escaped run and whether unescaping is needed. If any call to `escape_fun` indicates that unescaping is needed,
`unescape_fun` will be called on each run of raw text after splitting on `splitchar`. The return value of this
function is as in split_alternating_runs().
]==]
function export.split_alternating_runs_escaping(run, splitchar, preserve_splitchar, escape_fun, unescape_fun)
-- First replace comma with a temporary character in comma+whitespace sequences.
local need_unescape = false
for i in ipairs(run) do
if i % 2 == 1 and escape_fun then
local this_need_unescape
run[i], this_need_unescape = escape_fun(run[i])
need_unescape = need_unescape or this_need_unescape
end
end
if need_unescape then
return export.split_alternating_runs_and_frob_raw_text(run, splitchar, unescape_fun, preserve_splitchar)
else
return export.split_alternating_runs(run, splitchar, preserve_splitchar)
end
end
--[==[
Replace comma with a temporary char in comma + whitespace.
]==]
function export.escape_comma_whitespace(run, tempcomma)
tempcomma = tempcomma or u(0xFFF0)
local escaped = false
if run:find("\\,") then
-- FIXME: we should probably convert literal \\ to \ to allow people to put a backslash before a comma that
-- should be passed through; but maybe it's enough to use an HTML escape for the comma or backslash.
run = (run:gsub("\\,", tempcomma)) -- discard backslash before comma, doing its duty to protect the comma
escaped = true
end
if run:find(",%s") then
run = (run:gsub(",(%s)", tempcomma .. "%1"))
escaped = true
end
return run, escaped
end
--[==[
Undo the replacement of comma with a temporary char.
]==]
function export.unescape_comma_whitespace(run, tempcomma)
tempcomma = tempcomma or u(0xFFF0)
return (run:gsub(tempcomma, ","))
end
--[==[
Split the non-modifier parts of an alternating run (after parse_balanced_segment_run() is called) on comma, but not
on comma+whitespace. See `split_on_comma()` above for more information and the meaning of `tempcomma`.
]==]
function export.split_alternating_runs_on_comma(run, tempcomma)
tempcomma = tempcomma or u(0xFFF0)
-- Replace comma with a temporary char in comma + whitespace.
local function escape_comma_whitespace(seg)
return export.escape_comma_whitespace(seg, tempcomma)
end
-- Undo replacement of comma with a temporary char in comma + whitespace.
local function unescape_comma_whitespace(seg)
return export.unescape_comma_whitespace(seg, tempcomma)
end
return export.split_alternating_runs_escaping(run, ",", false, escape_comma_whitespace, unescape_comma_whitespace)
end
--[==[
Split text on a Lua pattern, but not on certain sequences involving characters in that pattern (e.g.
comma+whitespace). `splitchar` is the pattern to split on; `preserve_splitchar` indicates whether to preserve the
delimiter between split segments. `escape_fun` is called beforehand on the text and should return two values: the
escaped run and whether unescaping is needed. If the call to `escape_fun` indicates that unescaping is needed,
`unescape_fun` will be called on each run of text after splitting on `splitchar`. The return value of this a list
of runs, interspersed with delimiters if `preserve_splitchar` is specified.
]==]
function export.split_escaping(text, splitchar, preserve_splitchar, escape_fun, unescape_fun)
if not umatch(text, splitchar) then
return {text}
end
-- If there are square or angle brackets, we don't want to split on delimiters inside of them. To effect this, we
-- use parse_multi_delimiter_balanced_segment_run() to parse balanced brackets, then do delimiter splitting on the
-- non-bracketed portions of text using split_alternating_runs_escaping(), and concatenate back to a list of
-- strings. When calling parse_multi_delimiter_balanced_segment_run(), we make sure not to throw an error on
-- unbalanced brackets; in that case, we fall through to the code below that handles the case without brackets.
if text:find("[%[<]") then
local runs = export.parse_multi_delimiter_balanced_segment_run(text, {{"[", "]"}, {"<", ">"}},
"no error on unmatched")
if type(runs) ~= "string" then
local split_runs = export.split_alternating_runs_escaping(runs, splitchar, preserve_splitchar, escape_fun,
unescape_fun)
for i = 1, #split_runs do
split_runs[i] = concat(split_runs[i])
end
return split_runs
end
end
-- First escape sequences we don't want to count for splitting.
local need_unescape
if escape_fun then
text, need_unescape = escape_fun(text)
end
local parts = split(text, preserve_splitchar and "(" .. splitchar .. ")" or splitchar)
if need_unescape then
for i = 1, #parts, (preserve_splitchar and 2 or 1) do
parts[i] = unescape_fun(parts[i])
end
end
return parts
end
--[==[
Split text on comma, but not on comma+whitespace. This is similar to `mw.text.split(text, ",")` but will not split
on commas directly followed by whitespace, to handle embedded commas in terms (which are almost always followed by
a space). `tempcomma` is the Unicode character to temporarily use when doing the splitting; normally U+FFF0, but
you can specify a different character if you use U+FFF0 for some internal purpose.
]==]
function export.split_on_comma(text, tempcomma)
-- Don't do anything if no comma. Note that split_escaping() has a similar check at the beginning, so if there's a
-- comma we effectively do this check twice, but this is worth it to optimize for the common no-comma case.
if not text:find(",") then
return {text}
end
tempcomma = tempcomma or u(0xFFF0)
-- Replace comma with a temporary char in comma + whitespace.
local function escape_comma_whitespace(run)
return export.escape_comma_whitespace(run, tempcomma)
end
-- Undo replacement of comma with a temporary char in comma + whitespace.
local function unescape_comma_whitespace(run)
return export.unescape_comma_whitespace(run, tempcomma)
end
return export.split_escaping(text, ",", false, escape_comma_whitespace, unescape_comma_whitespace)
end
--[==[
Ensure that Wikicode (template calls, bracketed links, HTML, bold/italics, etc.) displays literally in error messages
by inserting a Unicode word-joiner symbol after all characters that may trigger Wikicode interpretation. Replacing
with equivalent HTML escapes doesn't work because they are displayed literally. I could not get this to work using
<nowiki>...</nowiki> (those tags display literally), using using {{#tag:nowiki|...}} (same thing) or using
mw.getCurrentFrame():extensionTag("nowiki", ...) (everything gets converted to a strip marker
`UNIQ--nowiki-00000000-QINU` or similar). FIXME: This is a massive hack; there must be a better way.
]==]
function export.escape_wikicode(term)
term = term:gsub("([%[<'{])", "%1" .. u(0x2060))
return term
end
function export.make_parse_err(arg_gloss)
return function(msg, stack_frames_to_ignore)
error(export.escape_wikicode(("%s: %s"):format(msg, arg_gloss)), stack_frames_to_ignore)
end
end
-- Parse a term that may include a link '[[LINK]]' or a two-part link '[[LINK|DISPLAY]]'. FIXME: Doesn't currently
-- handle embedded links like '[[FOO]] [[BAR]]' or [[FOO|BAR]] [[BAZ]]' or '[[FOO]]s'; if they are detected, it returns
-- the term unchanged and `nil` for the display form.
local function parse_bracketed_term(term, parse_err)
local inside = term:match("^%[%[(.*)%]%]$")
if inside then
if inside:find("%[%[") or inside:find("%]%]") then
-- embedded links, e.g. '[[FOO]] [[BAR]]'; FIXME: we should process them properly
return term, nil
end
local parts = split(inside, "|")
if #parts > 2 then
parse_err("Saw more than two parts inside a bracketed link")
end
return parts[1], parts[2]
end
return term, nil
end
--[==[
Parse a term that may have a language code (or possibly multiple plus-separated language codes, if
`data.allow_multiple` is given) preceding it (e.g. {la:minūtia} or {grc:[[σκῶρ|σκατός]]} or
{nan-hbl+hak:[[毋]][[知]]}). Return five arguments:
# the original prefixed term; in the case of a Wikipedia or Wikisource prefix followed by a two-part link, it is a
two-part link with the Wikipedia/Wikisource prefix moved inside the link; in the case of a Wikipedia or Wikisource
prefix followed by a redundant one-part link, the brackets are removed;
# the language object corresponding to the language code (possibly a family object if `data.allow_family` is given), or
a list of such objects if `data.allow_multiple` is given;
# the link if the unprefixed term is of the form <code>[[<var>link</var>|<var>display</var>]]</code> or of the form
<code>[[<var>link</var>]]</code>, otherwise the full unprefixed term;
# the display part if the term is of the form <code>[[<var>link</var>|<var>display</var>]]</code> or has a Wikipedia or
Wikisource prefix (in which case the part minus the prefix and any following language code will be returned, with
redundant brackets stripped), else {nil};
# {true} if the term has a Wikipedia/Wikisource prefix, else {false}.
Etymology-only languages are always allowed. This function also correctly handles Wikipedia prefixes (e.g.
{w:Abatemarco} or {w:it:Colle Val d'Elsa} or {lw:ru:Филарет}) and Wikisource prefixes (e.g. {s:Twelve O'Clock} or
{s:[[Walden/Chapter XVIII|Walden]]} or {s:fr:Perceval ou le conte du Graal} or {s:ro:[[Domnul Vucea|Mr. Vucea]]} or
{ls:ko:이상적 부인} or {ls:ko:[[조선 독립의 서#一. 槪論|조선 독립의 서]]}) and converts them into two-part links,
with the display form not including the Wikipedia or Wikisource prefix unless it was explicitly specified using a
two-part link as in {lw:ru:[[Филарет (Дроздов)|Митрополи́т Филаре́т]]} or
{ls:ko:[[조선 독립의 서#一. 槪論|조선 독립의 서]]}. The difference between {w:} ("Wikipedia") and {lw:} ("Wikipedia
link") is that the latter requires a language code and returns the corresponding language object; same for the
difference between {s:} ("Wikisource") and {ls:} ("Wikisource link").
NOTE: Embedded links are not correctly handled currently. If an embedded link is detected, the whole term is returned
as the link part (third argument), and the display part is nil. If you construct your own link from the link and
display parts, you must check for this.
The calling convention is to pass in a single argument `data` containing the following fields:
* `term`: The term to parse.
* `parse_err`: An optional function of one or two arguments to display an error. (The second argument to the function is
the number of stack frames to ignore when calling error(); if you declare your error function with only one argument,
things will still work fine.)
* `paramname`: If `parse_err` is omitted, this should be a string naming a parameter to display in the error message,
along with the term in question, and will be used to generate a `parse_err` function using `make_parse_err()`. (If
`paramname` is omitted, just the term itself appears in the error message.)
* `allow_multiple`: Allow multiple plus-separated language codes, e.g. {nan-hbl+hak:[[毋]][[知]]}. See above.
* `allow_family`: Allow family objects to appear in place of language codes.
* `allow_bad`: Don't throw an error on invalid language code prefixes; instead, include the prefix and colon as part of
the term. Note that if a prefix doesn't look like a language code (e.g. if it's a number), the code won't even try to
parse it as a language code, regardless of the `allow_bad` setting, but will always include it in the term.
* `lang_cache`: A table mapping language codes to language objects, where invalid language codes are indicated by the
value `false`. If this field is specified, the cache will be consulted before calling `getByCode()` in
[[Module:languages]], and the result cached. If not specified, no cache will be used.
]==]
function export.parse_term_with_lang(data)
local term = data.term
local parse_err = data.parse_err or
data.paramname and export.make_parse_err(("%s=%s"):format(data.paramname, term)) or
export.make_parse_err(term)
-- Parse off an initial language code (e.g. 'la:minūtia' or 'grc:[[σκῶρ|σκατός]]'). First check for Wikipedia
-- prefixes ('w:Abatemarco' or 'w:it:Colle Val d'Elsa' or 'lw:zh:邹衡') and Wikisource prefixes
-- ('s:ro:[[Domnul Vucea|Mr. Vucea]]' or 'ls:ko:이상적 부인'). Wikipedia/Wikisource language codes follow a similar
-- format to Wiktionary language codes (see below). Here and below we don't parse if there's a space after the
-- colon (happens e.g. if the user uses {{desc|...}} inside of {{col}}, grrr ...).
local termlang, foreign_wiki, actual_term = term:match("^(l?[ws]):([a-z][a-z][a-z-]*):([^ ].*)$")
if not termlang then
termlang, actual_term = term:match("^([ws]):([^ ].*)$")
end
if termlang then
local wiki_links = termlang:find("^l")
local base_wiki_prefix = termlang:find("w$") and "w:" or "s:"
local wiki_prefix = base_wiki_prefix .. (foreign_wiki and foreign_wiki .. ":" or "")
local link, display = parse_bracketed_term(actual_term, parse_err)
if link:find("%[%[") or display and display:find("%[%[") then
-- FIXME, this should be handlable with the right parsing code
parse_err("Cannot have embedded brackets following a Wikipedia (w:... or lw:...) link; expand the term to a fully bracketed term w:[[LINK|DISPLAY]] or similar")
end
local lang = wiki_links and get_lang(foreign_wiki, parse_err, "allow etym") or nil
local prefixed_link = wiki_prefix .. link
if display then
return ("[[%s|%s]]"):format(prefixed_link, display), lang, prefixed_link, display, true
else
-- Return the link minus any language codes as the fourth term (display form). Previously we returned `actual_term`
-- but this causes problems with redundant Wikipedia links of the form `w:[[Dragon Ball Z]]`. Don't generate a
-- two-part link so you can specify a display form in 3=. Note that the fourth and fifth params are currently only
-- used in [[Module:quote]].
return prefixed_link, lang, prefixed_link, link, true
end
end
-- Wiktionary language codes are in one of the following formats, where 'x' is a lowercase letter and 'X' an
-- uppercase letter:
-- xx
-- xxx
-- xxx-xxx
-- xxx-xxx-xxx (esp. for protolanguages)
-- xx-xxx (for etymology-only languages)
-- xx-xxx-xxx (maybe? for etymology-only languages)
-- xx-XX (for etymology-only languages, where XX is a country code, e.g. en-US)
-- xxx-XX (for etymology-only languages, where XX is a country code)
-- xx-xxx-XX (for etymology-only languages, where XX is a country code)
-- xxx-xxx-XX (for etymology-only langauges, where XX is a country code, e.g. nan-hbl-PH)
-- Things like xxx-x+ (e.g. cmn-pinyin, cmn-tongyong)
-- VL., LL., etc.
--
-- We check the for nonstandard Latin etymology language codes separately, and otherwise make only the following
-- assumptions:
-- (1) There are one to three hyphen-separated components.
-- (2) The last component can consist of two uppercase ASCII letters; otherwise, all components contain only
-- lowercase ASCII letters.
-- (3) Each component must have at least two letters.
-- (4) The first component must have two or three letters.
local function is_possible_lang_code(code)
-- Special hack for Latin variants, which can have nonstandard etym codes, e.g. VL., LL.
if code:find("^[A-Z]L%.$") then
return true
end
return code:find("^([a-z][a-z][a-z]?)$") or
code:find("^[a-z][a-z][a-z]?%-[A-Z][A-Z]$") or
code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+$") or
code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[A-Z][A-Z]$") or
code:find("^[a-z][a-z][a-z]?%-[a-z][a-z]+%-[a-z][a-z]+$")
end
local function get_by_code(code, allow_bad)
local lang
if data.lang_cache then
lang = data.lang_cache[code]
end
if lang == nil then
lang = get_lang(code, not allow_bad and parse_err or nil, "allow etym",
data.allow_family)
if data.lang_cache then
data.lang_cache[code] = lang or false
end
end
return lang or nil
end
if data.allow_multiple then
local termlang_spec
termlang_spec, actual_term = term:match("^([a-zA-Z.,+-]+):([^ ].*)$")
if termlang_spec then
termlang = split(termlang_spec, "[,+]")
local all_possible_code = true
for _, code in ipairs(termlang) do
if not is_possible_lang_code(code) then
all_possible_code = false
break
end
end
if all_possible_code then
local saw_nil = false
for i, code in ipairs(termlang) do
termlang[i] = get_by_code(code, data.allow_bad)
if not termlang[i] then
saw_nil = true
end
end
if saw_nil then
termlang = nil
else
term = actual_term
end
else
termlang = nil
end
end
else
termlang, actual_term = term:match("^([a-zA-Z.-]+):([^ ].*)$")
if termlang then
if is_possible_lang_code(termlang) then
termlang = get_by_code(termlang, data.allow_bad)
if termlang then
term = actual_term
end
else
termlang = nil
end
end
end
local link, display = parse_bracketed_term(term, parse_err)
return term, termlang, link, display, false
end
--[==[
Maybe parse any language prefix off of a given term and store the term and language(s) into a new or existing object.
This function is useful for implementing a `generate_obj` handler of `parse_inline_modifiers` that can support terms
with prefixed language(s). This wraps `parse_term_with_lang` and has the same handling of language prefixes as that
function. The calling convention is to pass in a single argument `data` containing the following fields (NOTE: you must
set `parse_lang_prefix` to get language-prefix-parsing behavior):
* `term`: The term to parse. This is the only required parameter.
* `parse_lang_prefix`: This must be specified in order for language prefixes to be recognized and parsed off.
* `termobj`: The existing object to store results into. If unspecified, a new object is created.
* `term_dest`: The field in `termobj` into which the term itself (minus any language prefix) is stored.
If unspecified, defaults to {"term"}.
* `parse_err`: An optional function of one or two arguments to display an error. (The second argument to the function is
the number of stack frames to ignore when calling error(); if you declare your error function with only one argument,
things will still work fine.)
* `paramname`: If `parse_err` is omitted, this should be a string naming a parameter to display in the error message,
along with the term in question, and will be used to generate a `parse_err` function using `make_parse_err()`. (If
`paramname` is omitted, just the term itself appears in the error message.)
* `allow_multiple_lang_prefixes`: Allow multiple plus-separated language codes, e.g. {nan-hbl+hak:[[毋]][[知]]}. See
`parse_term_with_lang` for more information.
* `allow_bad_lang_prefix`: Don't throw an error on invalid language code prefixes; instead, include the prefix and colon
as part of the term. Note that if a prefix doesn't look like a language code (e.g. if it's a number), the code won't
even try to parse it as a language code, regardless of this setting, but will always include it in the term.
* `allow_family_as_lang_prefix`: Allow family objects to appear in place of language codes.
* `lang_cache`: A table mapping language codes to language objects, where invalid language codes are indicated by the
value `false`. If this field is specified, the cache will be consulted before calling `getByCode()` in
[[Module:languages]], and the result cached. If not specified, no cache will be used.
The return value is the object in `data.termobj` (if non-{nil}) or a newly-created object (otherwise), with the
parsed-off term stored in the field named by the `data.term_dest` property (normally `.term`). If
`data.allow_multiple_lang_prefixes` was not given and a language prefix was parsed off, the corresponding language
object is stored into both `lang` and `termlang` (the storage into `termlang` is so that the presence of a language
prefix can specifically be determined in the event that `lang` is already set in an existing termobj). If
`data.allow_multiple_lang_prefixes` was given and one or more language prefixes were parsed off, the first such
language object is stored into `lang`, and the list of all language objects stored into `termlangs.
]==]
function export.generate_obj_maybe_parsing_lang_prefix(data)
local term = data.term
local term_dest = data.term_dest or "term"
local termobj = data.termobj or {}
if data.parse_lang_prefix and term:find(":", nil, true) then
local actual_term, termlangs = export.parse_term_with_lang {
term = term,
parse_err = data.parse_err,
paramname = data.paramname,
allow_bad = data.allow_bad_lang_prefix,
allow_multiple = data.allow_multiple_lang_prefixes,
allow_family = data.allow_family_as_lang_prefix,
lang_cache = data.lang_cache,
}
termobj[term_dest] = actual_term ~= "" and actual_term or nil
if termlangs then
-- If we couldn't parse a language code, don't overwrite an existing setting in `lang`
-- that may have originated from a separate |langN= param.
if data.allow_multiple_lang_prefixes then
termobj.termlangs = termlangs
termobj.lang = termlangs and termlangs[1] or nil
else
termobj.termlang = termlangs
termobj.lang = termlangs
end
end
else
termobj[term_dest] = term ~= "" and term or nil
end
return termobj
end
--[==[
Parse a term that may have inline modifiers attached (e.g. {rifiuti<q:plural-only>} or
{rinfusa<t:bulk cargo><lit:resupplying><qq:more common in the plural {{m|it|rinfuse}}>}).
* `arg` is the term to parse.
* `props` is an object holding further properties controlling how to parse the term (only `param_mods` and
`generate_obj` are required):
** `paramname` is the name of the parameter where `arg` comes from, or nil if this isn't available (it is used only in
error messages).
** `param_mods` is a table describing the allowed inline modifiers (see below).
** `generate_obj` is a function of one or two arguments that should parse the argument minus the inline modifiers and
return a corresponding parsed object (into which the inline modifiers will be rewritten). If declared with one
argument, that will be the raw value to parse; if declared with two arguments, the second argument will be the
`parse_err` function (see below).
** `parse_err` is an optional function of one argument (an error message) and should display the error message, along
with any desired contextual text (e.g. the argument name and value that triggered the error). If omitted, a default
function will be generated which displays the error along with the original value of `arg` (passed through
{escape_wikicode()} above to ensure that Wikicode (such as links) is displayed literally).
** `splitchar` is a Lua pattern. If specified, `arg` can consist of multiple delimiter-separated terms, each of which
may be followed by inline modifiers, and the return value will be a list of parsed objects instead of a single
object. Note that splitting on delimiters will not happen in certain protected sequences (by default
comma+whitespace; see below). The algorithm to split on delimiters is sensitive to inline modifier syntax and will
not be confused by delimiters inside of inline modifiers, which do not trigger splitting (whether or not contained
within protected sequences).
** `outer_container`, if specified, is used when multiple delimiter-separated terms are possible, and is the object
into which the list of per-term objects is stored (into the `terms` field) and into which any modifiers that are
given the `overall` property (see below) will be stored. If given, this value will be returned as the value of
{parse_inline_modifiers()}. If `outer_container` is not given, {parse_inline_modifiers()} will return the list of
per-term objects directly, and no modifier may have an `overall` property.
** `preserve_splitchar`, if specified, causes the actual delimiter matched by `splitchar` to be returned in the
parsed object describing the element that comes after the delimiter. The delimiter is stored in a key whose
name is controlled by `delimiter_key`, which defaults to "delimiter".
** `delimiter_key` controls the key into which the actual delimiter is written when `preserve_splitchar` is used.
See above.
** `escape_fun` and `unescape_fun` are as in split_escaping() and split_alternating_runs_escaping() above and
control the protected sequences that won't be split. By default, `escape_comma_whitespace` and
`unescape_comma_whitespace` are used, so that comma+whitespace sequences won't be split. Set to `false` to disable
escaping/unescaping.
** `pre_normalize_modifiers`, if specified, is a function of one argument, which can be used to "normalize" modifiers
prior to further parsing. This is used, for example, in [[Module:tl-pronunciation]] to convert modifiers of the
form `<noun^expectation; hope>` to `<t:noun^expectation; hope>`, so they can be processed as standard modifiers. It
is also used in [[Module:ar-verb]] to convert footnotes of the form `[rare]` to `<footnote:[rare]>`, to allow for
mixing bracketed footnotes and inline modifiers when overriding verbal nouns and such. It could similarly be used to
handle boolean modifiers like `<slb>` in {{tl|desc}} and convert them to a standard form `<slb:1>`. It runs just
before parsing out the modifier prefix and value, and is passed an object containing fields `modtext` (the
un-normalized modifier text, including surrounding angle brackets, or in some cases, text surrounded by other
delimiters such as square brackets, if `parse_inline_modifiers_from_segments()` is being called and the caller did
their own parsing of balanced segment runs) and `parse_err` (the passed-in or autogenerated function to signal an
error during parsing; a function of one argument, a message, which throws an error displaying that message). It
should return a single value, the normalized value of `modtext`, including surrounding angle brackets.
`param_mods` is a table describing allowed modifiers. The keys of the table are modifier prefixes and the values are
tables describing how to parse and store the associated modifier values. Here is a typical example, for an item that
takes the standard modifiers associated with `full_link()` in [[Module:links]], as well as left and right qualifiers
and labels:
{
local param_mods = {
alt = {},
t = {
-- [[Module:links]] expects the gloss in "gloss".
item_dest = "gloss",
},
gloss = {},
tr = {},
ts = {},
g = {
-- [[Module:links]] expects the genders in "g". `sublist = true` automatically splits on comma (optionally
-- with surrounding whitespace).
item_dest = "genders",
sublist = true,
},
pos = {},
lit = {},
id = {},
sc = {
-- Automatically parse as a script code and convert to a script object.
type = "script",
},
-- Qualifiers and labels
q = {
type = "qualifier",
},
qq = {
type = "qualifier",
},
l = {
type = "labels",
},
ll = {
type = "labels",
},
}
}
In the table values:
* `item_dest` specifies the destination key to store the object into (if not the same as the modifier key itself).
* `type`, `set`, `sublist` and `convert` have the same meaning as in [[Module:parameters]] and are used for converting
the object from the string form given by the user into the form needed for further processing. Note that `type` makes
use of additional properties that may be specified. Specifically, if {type = "language"}, the properties `family` and
`method` are also examined, and if {type = "family"} or {type = "script"}, the property `method` is examined.
* `store` describes how to store the converted modifier value into the parsed object. If omitted, the converted value
is simply written into the parsed object under the appropriate key; but an error is generated if the key already has
a value. (This means that multiple occurrences of a given modifier are allowed if `store` is given, but not
otherwise.) `store` can be one of the following:
** {"insert"}: the converted value is appended to the key's value using {insert()}; if the key has no value, it
is first converted to an empty list;
** {"insertIfNot"}: is similar but appends the value using {insertIfNot()} in [[Module:table]];
** {"insert-flattened"}, the converted value is assumed to be a list and the objects are appended one-by-one into the
key's existing value using {insert()};
** {"insertIfNot-flattened"} is similar but appends using {insertIfNot()} in [[Module:table]]; (WARNING: When using
{"insert-flattened"} and {"insertIfNot-flattened"}, if there is no existing value for the key, the converted value is
just stored directly. This means that future appends will side-effect that value, so make sure that the return value
of the conversion function for this key generates a fresh list each time.)
** a function of one argument, an object with the following properties:
*** `dest`: the object to write the value into;
*** `key`: the field where the value should be written;
*** `converted`: the (converted) value to write;
*** `raw_val`: the raw, user-specified value (a string);
*** `parse_err`: a function of one argument (an error string), which signals an error, and includes extra context in
the message about the modifier in question, the angle-bracket spec that includes the modifier in it, the overall
value, and (if `paramname` was given) the parameter holding the overall value.
* `overall` only applies if `splitchar` is given. In this case, the modifier applies to the entire argument rather than
to an individual term in the argument, and must occur after the last item separated by `splitchar`, instead of being
allowed to occur after any of them. The modifier will be stored into the outer container object, which must exist
(i.e. `outer_container` must have been given).
The return value of {parse_inline_modifiers()} depends on whether `splitchar` and `outer_container` have been given. If
neither is given, the return value is the object returned by `generate_obj`. If `splitchar` but not `outer_container` is
given, the return value is a list of per-term objects, each of which is generated by `generate_obj`. If both `splitchar`
and `outer_container` are given, the return value is the value of `outer_container` and the per-term objects are stored
into the `terms` field of this object.
]==]
function export.parse_inline_modifiers(arg, props)
local segments
local function rejoin_bracket_delimited_runs(segments)
return export.rejoin_delimited_runs {
runs = segments,
delimiter_pattern = "^%[.*%]$",
}
end
local rejoin_square_brackets_after_split = false
-- The following is an optimization. If we see a square bracket (normally a double square bracket internal link
-- [[...]]), we want to not treat delimiter characters inside (either <...> balanced delimiters or separators such
-- as commas) as delimiters. But this requires a more sophisticated and slower algorithm, and most of the time it
-- isn't needed because there are no square brackets. So we check for a square bracket and fall back to a simpler
-- algorithm otherwise (which, since it involves only a single balanced delimiter, can use the built-in %b() Lua
-- pattern syntax, which AFAIK is implemented in C).
if arg:find("%[") then
segments = export.parse_multi_delimiter_balanced_segment_run(arg, {{"[", "]"}, {"<", ">"}})
if not props.splitchar then
segments = rejoin_bracket_delimited_runs(segments)
else
rejoin_square_brackets_after_split = true
end
else
segments = export.parse_balanced_segment_run(arg, "<", ">")
end
local function verify_no_overall()
for _, mod_props in pairs(props.param_mods) do
if mod_props.overall then
error("Internal caller error: Can't specify `overall` for a modifier in `param_mods` unless `outer_container` property is given")
end
end
end
if not props.splitchar then
if props.outer_container then
error("Internal caller error: Can't specify `outer_container` property unless `splitchar` is given")
end
verify_no_overall()
return export.parse_inline_modifiers_from_segments {
group = segments,
group_index = nil,
separated_groups = nil,
arg = arg,
props = props,
}
else
local terms = {}
if props.outer_container then
props.outer_container.terms = terms
else
verify_no_overall()
end
local escape_fun = props.escape_fun
if escape_fun == nil then
escape_fun = export.escape_comma_whitespace
end
local unescape_fun = props.unescape_fun
if unescape_fun == nil then
unescape_fun = export.unescape_comma_whitespace
end
local separated_groups = export.split_alternating_runs_escaping(segments, props.splitchar,
props.preserve_splitchar, escape_fun, unescape_fun)
for j = 1, #separated_groups, (props.preserve_splitchar and 2 or 1) do
if rejoin_square_brackets_after_split then
separated_groups[j] = rejoin_bracket_delimited_runs(separated_groups[j])
end
local parsed = export.parse_inline_modifiers_from_segments {
group = separated_groups[j],
group_index = j,
separated_groups = separated_groups,
arg = arg,
props = props,
}
if props.preserve_splitchar and j > 1 then
parsed[props.delimiter_key or "delimiter"] = separated_groups[j - 1][1]
end
insert(terms, parsed)
end
if props.outer_container then
return props.outer_container
else
return terms
end
end
end
--[==[
Parse a single term that may have inline modifiers attached. This is a helper function of {parse_inline_modifiers()} but
is exported separately in case the caller needs to make their own call to {parse_balanced_segment_run()} (as in
[[Module:quote]], which splits on several matched delimiters simultaneously). It takes only a single argument, `data`,
which is an object with the following fields:
* `group`: A list of segments as output by {parse_balanced_segment_run()} (see the overall comment at the top of
[[Module:parse utilities]]), or one of the lists returned by calling {split_alternating_runs()}.
* `separated_groups`: The list of groups (each of which is of the form of `group`) describing all the terms in the
argument parsed by {parse_inline_modifiers()}, or {nil} if this isn't applicable (i.e. multiple terms aren't allowed
in the argument). Currently used only the check the number of groups in the list against `group_index`.
* `group_index`: The index into `separated_groups` where `group` can be found, or {nil} if not applicable (see below).
* `arg`: The original user-specified argument being parsed; used only for error messages and only when `props.parse_err`
is not specified.
* `props`: The `props` argument to {parse_inline_modifiers()}.
The return value is the object created by `generate_obj`, with properties filled in describing the modifiers of the
term in question. Note that `props.outer_container` and the `overall` setting of the `props.param_mods` structure are
respected, but `props.splitchar` is ignored because the splitting happens in the caller. Specifically, if there are any
modifiers with the `overall` setting, `props.separated_groups` and `props.group_index` must be given so that the
function is able to determine if the modifier is indeed attached to the last term, and `props.outer_container` must be
given because that is where such modifiers are stored. Otherwise, none of these settings need be given.
]==]
function export.parse_inline_modifiers_from_segments(data)
local props = data.props
local group = data.group
local function get_valid_prefixes()
local valid_prefixes = {}
for param_mod, mod_props in pairs(props.param_mods) do
if not mod_props.deprecated then
insert(valid_prefixes, param_mod)
end
end
sort(valid_prefixes)
return valid_prefixes
end
local function get_arg_gloss()
if props.paramname then
return ("%s=%s"):format(props.paramname, data.arg)
else
return data.arg
end
end
local parse_err = props.parse_err or export.make_parse_err(get_arg_gloss())
local term_obj = props.generate_obj(group[1], parse_err)
for k = 2, #group - 1, 2 do
if group[k + 1] ~= "" then
parse_err("Extraneous text '" .. group[k + 1] .. "' after modifier")
end
local group_k = group[k]
if props.pre_normalize_modifiers then
-- FIXME: For some use cases, we might have to pass more information.
group_k = props.pre_normalize_modifiers {
modtext = group_k,
parse_err = parse_err
}
end
local modtext = group_k:match("^<(.*)>$")
if not modtext then
parse_err("Internal error: Modifier '" .. group_k .. "' isn't surrounded by angle brackets")
end
local prefix, val = modtext:match("^([a-zA-Z0-9+_-]+):(.*)$")
if not prefix then
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. ":'"
end
parse_err(("Modifier %s%s lacks a prefix, should begin with one of %s"):format(
group_k, group_k ~= group[k] and (" (normalized from %s)"):format(group[k]) or "",
list_to_text(valid_prefixes)))
end
local prefix_parse_err
if props.parse_err then
prefix_parse_err = function(msg, stack_frames_to_ignore)
props.parse_err(("%s: modifier prefix '%s' in %s"):format(msg, prefix, group[k]),
stack_frames_to_ignore)
end
else
prefix_parse_err = export.make_parse_err(("modifier prefix '%s' in %s in %s"):format(
prefix, group[k], get_arg_gloss()))
end
if props.param_mods[prefix] then
local mod_props = props.param_mods[prefix]
if mod_props.replaced_by == false then
prefix_parse_err(
("Prefix has been removed and is no longer valid%s%s"):format(
mod_props.reason and ", " .. mod_props.reason or "",
mod_props.instead and "; instead, " .. mod_props.instead or "")
)
elseif mod_props.replaced_by then
prefix_parse_err(
("Prefix has been replaced by '%s'%s"):format(
mod_props.replaced_by, mod_props.reason and ", " .. mod_props.reason or "")
)
end
local key = mod_props.item_dest or prefix
local dest
if mod_props.overall then
if not data.separated_groups then
prefix_parse_err("Internal error: `data.separated_groups` not given when `overall` is seen")
end
if not props.outer_container then
-- This should have been caught earlier during validation in parse_inline_modifiers().
prefix_parse_err("Internal error: `props.outer_container` not given when `overall` is seen")
end
if data.group_index ~= #data.separated_groups then
prefix_parse_err("Prefix should occur after the last comma-separated term")
end
dest = props.outer_container
else
dest = term_obj
end
local converted = val
if mod_props.type or mod_props.set or mod_props.sublist or mod_props.convert then
-- WARNING: Here as an optimization we embed some knowledge of convert_val() in [[Module:parameters]],
-- specifically that if none of `type`, `set`, `sublist` and `convert` are set, the conversion is an
-- identity operation and can be skipped. (convert_val() also makes use of the fields `method` and
-- `family`, but only if `type` is set to certain values such as "language", "family" or "script", and
-- makes use of the field `required`, but only if `set` is set.) If this becomes problematic, consider
-- removing the optimization.
converted = convert_val(converted, prefix_parse_err, mod_props)
end
local store = props.param_mods[prefix].store
if not store then
if dest[key] then
prefix_parse_err("Prefix occurs twice")
end
dest[key] = converted
elseif store == "insert" then
if not dest[key] then
dest[key] = {converted}
else
insert(dest[key], converted)
end
elseif store == "insertIfNot" then
if not dest[key] then
dest[key] = {converted}
else
insert_if_not(dest[key], converted)
end
elseif store == "insert-flattened" then
if not dest[key] then
dest[key] = converted
else
for _, obj in ipairs(converted) do
insert(dest[key], obj)
end
end
elseif store == "insertIfNot-flattened" then
if not dest[key] then
dest[key] = converted
else
for _, obj in ipairs(converted) do
insert_if_not(dest[key], obj)
end
end
elseif type(store) == "string" then
prefix_parse_err(("Internal caller error: Unrecognized value '%s' for `store` property"):format(store))
elseif not is_callable(store) then
prefix_parse_err(("Internal caller error: Unrecognized type for `store` property %s"):format(dump(store)))
else
store{
dest = dest,
key = key,
converted = converted,
raw = val,
parse_err = prefix_parse_err
}
end
else
local valid_prefixes = get_valid_prefixes()
for i, valid_prefix in ipairs(valid_prefixes) do
valid_prefixes[i] = "'" .. valid_prefix .. "'"
end
prefix_parse_err("Unrecognized prefix, should be one of " ..
list_to_text(valid_prefixes))
end
end
return term_obj
end
return export
7m7efxuys6lveo94nvwye55dw2c55on
मॉड्यूल:languages/data/2
828
304604
487764
487638
2026-09-02T16:16:40Z
SM7
6218
localization...
487764
Scribunto
text/plain
local m_langdata = require("Module:languages/data")
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string utilities").char
return u(...)
end
local c = m_langdata.chars
local p = m_langdata.puaChars
local s = m_langdata.shared
-- Ideally, we want to move these into [[Module:languages/data]], but because (a) it's necessary to use require on that module, and (b) they're only used in this data module, it's less memory-efficient to do that at the moment. If it becomes possible to use mw.loadData, then these should be moved there.
s["de-Latn-sortkey"] = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.ringabove,
from = {"æ", "œ", "ß"},
to = {"ae", "oe", "ss"}
}
s["de-Latn-standardchars"] = "AaÄäBbCcDdEeFfGgHhIiJjKkLlMmNnOoÖöPpQqRrSsẞßTtUuÜüVvWwXxYyZz"
s["ka-stripdiacritics"] = {remove_diacritics = c.circ}
s["no-sortkey"] = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla,
remove_exceptions = {"å"},
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
}
s["no-standardchars"] = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÆæØøÅå" .. c.punc
s["sa-Deva-stripdiacritics"] = { -- Don't use remove_diacritics for accent marks, as १ and ३ should also be removed if (and only if) they carry any.
from = {"ॐ", "[१३]?[" .. c.anudatta .. c.udatta .. c.dsvarita .. c.tsvarita .. "]+"},
to = {"ओँ"},
}
s["tg-stripdiacritics"] = {remove_diacritics = c.grave .. c.acute}
s["tk-stripdiacritics"] = {remove_diacritics = c.macron}
local m = {}
m["aa"] = {
"Afar",
27811,
"cus-eas",
"Latn, Ethi",
strip_diacritics = {
Latn = {remove_diacritics = c.acute},
},
}
m["ab"] = {
"Abkhaz",
5111,
"cau-abz",
"Cyrl, Geor, Latn",
translit = {
Cyrl = "ab-translit",
-- Geor translit in [[Module:scripts/data]]
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.acute,
from = {"^а%-"},
to = {"а"},
},
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {
"х'ә", -- 3 chars
"гь", "гә", "ӷь", "ҕь", "ӷә", "ҕә", "дә", "ё", "жь", "жә", "ҙә", "ӡә", "ӡ'", "кь", "кә", "қь", "қә", "ҟь", "ҟә", "ҫә", "тә", "ҭә", "ф'", "хь", "хә", "х'", "ҳә", "ць", "цә", "ц'", "ҵә", "ҵ'", "шь", "шә", "џь", -- 2 chars
"ӷ", "ҕ", "ҙ", "ӡ", "қ", "ҟ", "ԥ", "ҧ", "ҫ", "ҭ", "ҳ", "ҵ", "ҷ", "ҽ", "ҿ", "ҩ", "џ", "ә", -- 1 char
"^а",
},
to = {
"х" .. p[4],
"г" .. p[1], "г" .. p[2], "г" .. p[5], "г" .. p[6], "г" .. p[7], "г" .. p[8], "д" .. p[1], "е" .. p[1], "ж" .. p[1], "ж" .. p[2], "з" .. p[2], "з" .. p[4], "з" .. p[5], "к" .. p[1], "к" .. p[2], "к" .. p[4], "к" .. p[5], "к" .. p[7], "к" .. p[8], "с" .. p[2], "т" .. p[1], "т" .. p[3], "ф" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[3], "х" .. p[6], "ц" .. p[1], "ц" .. p[2], "ц" .. p[3], "ц" .. p[5], "ц" .. p[6], "ш" .. p[1], "ш" .. p[2], "ы" .. p[3],
"г" .. p[3], "г" .. p[4], "з" .. p[1], "з" .. p[3], "к" .. p[3], "к" .. p[6], "п" .. p[1], "п" .. p[2], "с" .. p[1], "т" .. p[2], "х" .. p[5], "ц" .. p[4], "ч" .. p[1], "ч" .. p[2], "ч" .. p[3], "ы" .. p[1], "ы" .. p[2], "ь" .. p[1],
"",
}
},
},
}
m["ae"] = {
"Avestan",
29572,
"ira-cen",
"Avst, Gujr, Deva",
translit = {
Avst = "Avst-translit"
},
}
m["af"] = {
"Afrikaans",
14196,
"gmw-frk",
"Latn, Arab",
ancestors = "nl",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.ringabove .. c.cedilla .. "'",
from = {"['ʼ]n"},
to = {"n" .. p[1]}
}
},
}
m["ak"] = {
"Akan",
28026,
"alv-ctn",
"Latn",
}
m["am"] = {
"Amharic",
28244,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["an"] = {
"Aragonese",
8765,
"roa-nar",
"Latn",
}
m["ar"] = {
"Arabic",
13955,
"sem-arb",
"Arab, Hebr, Syrc, Brai, Nbat",
translit = {
Arab = "ar-translit"
},
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["as"] = {
"असमिया",
29401,
"inc-bas",
"as-Beng",
ancestors = "inc-mas",
translit = "as-translit",
}
m["av"] = {
"Avar",
29561,
"cau-ava",
"Cyrl, Latn, Arab",
ancestors = "oav",
translit = {
Cyrl = "cau-nec-translit",
Arab = "ar-translit",
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"],
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"гъ", "гь", "гӏ", "ё", "кк", "къ", "кь", "кӏ", "лъ", "лӏ", "тӏ", "хх", "хъ", "хь", "хӏ", "цӏ", "чӏ"},
to = {"г" .. p[1], "г" .. p[2], "г" .. p[3], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "к" .. p[4], "л" .. p[1], "л" .. p[2], "т" .. p[1], "х" .. p[1], "х" .. p[2], "х" .. p[3], "х" .. p[4], "ц" .. p[1], "ч" .. p[1]}
},
},
}
m["ay"] = {
"Aymara",
4627,
"sai-aym",
"Latn",
}
m["az"] = {
"Azerbaijani",
9292,
"trk-ogz",
"Latn, Cyrl, Arab",
ancestors = "trk-oat",
dotted_dotless_i = true,
strip_diacritics = {
Latn = {
from = {"ʼ"},
to = {"'"},
},
Arab = {
module = "ar-stripdiacritics",
["from"] = {
"ۆ",
"ۇ",
"وْ",
"ڲ",
"ؽ",
},
["to"] = {
"و",
"و",
"و",
"گ",
"ی",
},
},
},
display_text = {
Latn = {
from = {"'"},
to = {"ʼ"}
}
},
sort_key = {
Latn = {
from = {
"i", -- Ensure "i" comes after "ı".
"ç", "ə", "ğ", "x", "ı", "q", "ö", "ş", "ü", "w"
},
to = {
"i" .. p[1],
"c" .. p[1], "e" .. p[1], "g" .. p[1], "h" .. p[1], "i", "k" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1], "z" .. p[1]
}
},
Cyrl = {
from = {"ғ", "ә", "ы", "ј", "ҝ", "ө", "ү", "һ", "ҹ"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "и" .. p[2], "к" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1], "ч" .. p[1]}
},
},
}
m["ba"] = {
"Bashkir",
13389,
"trk-kbu",
"Cyrl",
translit = "ba-translit",
override_translit = true,
sort_key = {
from = {"ғ", "ҙ", "ё", "ҡ", "ң", "ө", "ҫ", "ү", "һ", "ә"},
to = {"г" .. p[1], "д" .. p[1], "е" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "с" .. p[1], "у" .. p[1], "х" .. p[1], "э" .. p[1]}
},
}
m["be"] = {
"Belarusian",
9091,
"zle",
"Cyrl, Latn",
ancestors = "zle-mbe",
translit = {
Cyrl = "be-translit",
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
},
Latn = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"Ć", "ć", "Ń", "ń", "Ś", "ś", "Ź", "ź"},
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
from = {"ґ", "ё", "і", "ў"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "у" .. p[1]}
},
Latn = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"Ć", "ć", "Ń", "ń", "Ś", "ś", "Ź", "ź"},
from = {"ć", "č", "dz", "dź", "dž", "ch", "ł", "ń", "ś", "š", "ŭ", "ź", "ž"},
to = {"c" .. p[1], "c" .. p[2], "d" .. p[1], "d" .. p[2], "d" .. p[3], "h" .. p[1], "l" .. p[1], "n" .. p[1], "s" .. p[1], "s" .. p[2], "u" .. p[1], "z" .. p[1], "z" .. p[2]}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзІіЙйКкЛлМмНнОоПпРрСсТтУуЎўФфХхЦцЧчШшЫыЬьЭэЮюЯя",
Latn = "AaBbCcĆćČčDdEeFfGgHhIiJjKkLlŁłMmNnŃńOoPpRrSsŚśŠšTtUuŬŭVvYyZzŹźŽž",
(c.punc:gsub("'", "")) -- Exclude apostrophe.
},
}
m["bg"] = {
"Bulgarian",
7918,
"zls",
"Cyrl",
ancestors = "cu-bgm",
translit = "bg-translit",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"%f[^%z%s]ѝ%f[%z%s]"},
},
sort_key = {
remove_diacritics = c.grave .. c.acute,
remove_exceptions = {"%f[^%z%s]ѝ%f[%z%s]"},
},
standard_chars = "АаБбВвГгДдЕеЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЬьЮюЯя" .. c.punc,
}
m["bh"] = {
"बिहारी",
135305,
"inc-eas",
"Deva",
}
m["bi"] = {
"Bislama",
35452,
"crp",
"Latn",
ancestors = "en",
}
m["bm"] = {
"Bambara",
33243,
"dmn-emn",
"Latn, Nkoo",
sort_key = {
Latn = {
from = {"ɛ", "ɲ", "ŋ", "ɔ"},
to = {"e" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1]}
},
},
}
m["bn"] = {
"बंगाली",
9610,
"inc-bas",
"Beng, Newa",
ancestors = "inc-mbn",
translit = {
Beng = "bn-translit"
},
}
m["bo"] = {
"Tibetan",
34271,
"sit-tib",
"Tibt", -- sometimes Deva?
ancestors = "xct",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["br"] = {
"Breton",
12107,
"cel-brs",
"Latn",
ancestors = "xbm",
sort_key = {
from = {"ch", "c['ʼ’]h"},
to = {"c" .. p[1], "c" .. p[2]}
},
}
m["ca"] = {
"Catalan",
7026,
"roa-ocr",
"Latn",
ancestors = "roa-oca",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.diaer .. c.cedilla .. "·"},
standard_chars = "AaÀàBbCcÇçDdEeÉéÈèFfGgHhIiÍíÏïJjLlMmNnOoÓóÒòPpQqRrSsTtUuÚúÜüVvXxYyZz·" .. c.punc,
}
m["ce"] = {
"Chechen",
33350,
"cau-vay",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "cau-nec-translit",
Arab = "ar-translit",
},
override_translit = true,
display_text = {
Cyrl = s["cau-Cyrl-displaytext"]
},
strip_diacritics = {
Cyrl = s["cau-Cyrl-stripdiacritics"],
Latn = s["cau-Latn-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"аь", "гӏ", "ё", "кх", "къ", "кӏ", "оь", "пӏ", "тӏ", "уь", "хь", "хӏ", "цӏ", "чӏ", "юь", "яь"},
to = {"а" .. p[1], "г" .. p[1], "е" .. p[1], "к" .. p[1], "к" .. p[2], "к" .. p[3], "о" .. p[1], "п" .. p[1], "т" .. p[1], "у" .. p[1], "х" .. p[1], "х" .. p[2], "ц" .. p[1], "ч" .. p[1], "ю" .. p[1], "я" .. p[1]}
},
},
}
m["ch"] = {
"Chamorro",
33262,
"poz",
"Latn",
sort_key = {
remove_diacritics = "'",
from = {"å", "ch", "ñ", "ng"},
to = {"a" .. p[1], "c" .. p[1], "n" .. p[1], "n" .. p[2]}
},
}
m["co"] = {
"Corsican",
33111,
"roa-itr",
"Latn",
sort_key = {
from = {"chj", "ghj", "sc", "sg"},
to = {"c" .. p[1], "g" .. p[1], "s" .. p[1], "s" .. p[2]}
},
standard_chars = "AaÀàBbCcDdEeÈèFfGgHhIiÌìÏïJjLlMmNnOoÒòPpQqRrSsTtUuÙùÜüVvZz" .. c.punc,
}
m["cr"] = {
"Cree",
33390,
"alg",
"Latn, Cans",
translit = {
Cans = "cr-translit"
},
}
m["cs"] = {
"Czech",
9056,
"zlw",
"Latn",
ancestors = "cs-ear",
sort_key = {
from = {"á", "č", "ď", "é", "ě", "ch", "í", "ň", "ó", "ř", "š", "ť", "ú", "ů", "ý", "ž"},
to = {"a" .. p[1], "c" .. p[1], "d" .. p[1], "e" .. p[1], "e" .. p[2], "h" .. p[1], "i" .. p[1], "n" .. p[1], "o" .. p[1], "r" .. p[1], "s" .. p[1], "t" .. p[1], "u" .. p[1], "u" .. p[2], "y" .. p[1], "z" .. p[1]}
},
standard_chars = "AaÁáBbCcČčDdĎďEeÉéĚěFfGgHhIiÍíJjKkLlMmNnŇňOoÓóPpRrŘřSsŠšTtŤťUuÚúŮůVvYyÝýZzŽž" .. c.punc,
}
m["cu"] = {
"Old Church Slavonic",
35499,
"zls",
"Cyrs, Glag, Zname",
translit = {
Cyrs = "Cyrs-translit",
Glag = "Glag-translit"
},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["cv"] = {
"Chuvash",
33348,
"trk-ogr",
"Cyrl",
ancestors = "cv-mid",
translit = "cv-translit",
override_translit = true,
sort_key = {
from = {"ӑ", "ё", "ӗ", "ҫ", "ӳ"},
to = {"а" .. p[1], "е" .. p[1], "е" .. p[2], "с" .. p[1], "у" .. p[1]}
},
}
m["cy"] = {
"Welsh",
9309,
"cel-brw",
"Latn",
ancestors = "wlm",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. "'",
from = {"ch", "dd", "ff", "ng", "ll", "ph", "rh", "th"},
to = {"c" .. p[1], "d" .. p[1], "f" .. p[1], "g" .. p[1], "l" .. p[1], "p" .. p[1], "r" .. p[1], "t" .. p[1]}
},
standard_chars = "ÂâAaBbCcDdEeÊêFfGgHhIiÎîLlMmNnOoÔôPpRrSsTtUuÛûWwŴŵYyŶŷ" .. c.punc,
}
m["da"] = {
"Danish",
9035,
"gmq-eas",
"Latn",
ancestors = "gmq-oda",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla,
remove_exceptions = {"å"},
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÆæØøÅå" .. c.punc,
}
m["de"] = {
"German",
188,
"gmw-hgm",
"Latn, Latf, Brai",
ancestors = "de-ear",
sort_key = {
Latn = s["de-Latn-sortkey"],
Latf = s["de-Latn-sortkey"],
},
standard_chars = {
Latn = s["de-Latn-standardchars"],
Latf = s["de-Latn-standardchars"],
Brai = c.braille,
c.punc
}
}
m["dv"] = {
"Dhivehi",
32656,
"inc-ins",
"Thaa, Diak",
translit = {
Thaa = "dv-translit",
Diak = "Diak-translit",
},
ancestors = "dv-old",
override_translit = true,
}
m["dz"] = {
"Dzongkha",
33081,
"sit-tib",
"Tibt",
ancestors = "xct",
override_translit = true,
-- Tibt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["ee"] = {
"Ewe",
30005,
"alv-gbe",
"Latn",
sort_key = {
remove_diacritics = c.tilde,
from = {"ɖ", "dz", "ɛ", "ƒ", "gb", "ɣ", "kp", "ny", "ŋ", "ɔ", "ts", "ʋ"},
to = {"d" .. p[1], "d" .. p[2], "e" .. p[1], "f" .. p[1], "g" .. p[1], "g" .. p[2], "k" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "t" .. p[1], "v" .. p[1]}
},
}
m["el"] = {
"Greek",
9129,
"grk",
"Grek, Polyt, Brai",
ancestors = "el-kth",
translit = "el-translit",
override_translit = true,
-- Grek and Polyt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
Grek = "΅·ͺ΄ΑαΆάΒβΓγΔδΕεέΈΖζΗηΉήΘθΙιΊίΪϊΐΚκΛλΜμΝνΞξΟοΌόΠπΡρΣσςΤτΥυΎύΫϋΰΦφΧχΨψΩωΏώ",
Brai = c.braille,
c.punc
},
}
m["en"] = {
"अंग्रेज़ी",
1860,
"gmw-ang",
"Latn, Brai, Shaw, Dsrt", -- entries in Shaw or Dsrt might require prior discussion
wikimedia_codes = "en, simple",
ancestors = "en-ear",
sort_key = {
Latn = {
-- Many of these are needed for sorting language names.
remove_diacritics = "'\"%-%.,%s·ʻʼ" .. c.diacritics,
-- These are found in pagenames.
from = {"[ɒæ🅱¢©ᴄðđəǝɜɡħʜıɨłŋɲøɔœꝑꝓꝕßʋ]"},
to = {{
["ɒ"] = "a", ["æ"] = "ae", ["🅱"] = "b", ["¢"] = "c", ["©"] = "c",
["ᴄ"] = "c", ["ð"] = "d", ["đ"] = "d", ["ə"] = "e", ["ǝ"] = "e",
["ɜ"] = "e", ["ɡ"] = "g", ["ħ"] = "h", ["ʜ"] = "h", ["ı"] = "i",
["ɨ"] = "i", ["ł"] = "l", ["ŋ"] = "n", ["ɲ"] = "n", ["ø"] = "o",
["ɔ"] = "o", ["œ"] = "oe", ["ꝑ"] = "p", ["ꝓ"] = "p", ["ꝕ"] = "p",
["ß"] = "ss", ["ʋ"] = "v",
}},
},
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
Brai = c.braille,
c.punc
},
}
m["eo"] = {
"Esperanto",
143,
"art",
"Latn",
sort_key = {
remove_diacritics = c.grave .. c.acute,
from = {"ĉ", "ĝ", "ĥ", "ĵ", "ŝ", "ŭ"},
to = {"c" .. p[1], "g" .. p[1], "h" .. p[1], "j" .. p[1], "s" .. p[1], "u" .. p[1]}
},
standard_chars = "AaBbCcĈĉDdEeFfGgĜĝHhĤĥIiJjĴĵKkLlMmNnOoPpRrSsŜŝTtUuŬŭVvZz" .. c.punc,
}
m["es"] = {
"स्पैनिश",
1321,
"roa-cas",
"Latn, Brai",
ancestors = "es-ear",
sort_key = {
Latn = {
remove_exceptions = {"ñ"},
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.diaer .. c.cedilla,
from = {"ª", "æ", "ñ", "º", "œ"},
to = {"a", "ae", "n" .. p[1], "o", "oe"}
},
},
standard_chars = {
Latn = "AaÁáBbCcDdEeÉéFfGgHhIiÍíJjLlMmNnÑñOoÓóPpQqRrSsTtUuÚúÜüVvXxYyZz",
Brai = c.braille,
c.punc
},
}
m["et"] = {
"Estonian",
9072,
"urj-fin",
"Latn",
sort_key = {
from = {
"š", "ž", "õ", "ä", "ö", "ü", -- 2 chars
"z" -- 1 char
},
to = {
"s" .. p[1], "s" .. p[3], "w" .. p[1], "w" .. p[2], "w" .. p[3], "w" .. p[4],
"s" .. p[2]
}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvÕõÄäÖöÜü" .. c.punc,
}
m["eu"] = {
"Basque",
8752,
"euq",
"Latn",
sort_key = {
from = {"ç", "ñ"},
to = {"c" .. p[1], "n" .. p[1]}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnÑñOoPpRrSsTtUuXxZz" .. c.punc,
}
m["fa"] = {
"फ़ारसी",
9168,
"ira-swi",
"Arab, Hebr",
ancestors = "fa-cls",
strip_diacritics = {
Arab = {
-- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif
from = {"هٔ", "ٱ"}, -- character "ۂ" code U+06C2 to "ه"; hamzatu l-waṣli to a regular alif
to = {"ه", "ا"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["ff"] = {
"Fula",
33454,
"alv-fwo",
"Latn, Adlm",
}
m["fi"] = {
"Finnish",
1412,
"urj-fin",
"Latn",
display_text = {
from = {"'"},
to = {"’"}
},
strip_diacritics = { -- used to indicate gemination of the next consonant
remove_diacritics = "ˣ",
from = {"’"},
to = {"'"},
},
sort_key = { -- [[Appendix:Finnish alphabet#Collation]] + "aͤ" and "oͤ" as historical variants of "ä" and "ö".
remove_diacritics = "'’:" .. c.diacritics,
remove_exceptions = {
"a[" .. c.ringabove .. c.diaer .. c.small_e .. "]", -- åäaͤ
"o[" .. c.diaer .. c.tilde .. c.dacute .. c.small_e .. "]", -- öõőoͤ
"u[" .. c.diaer .. c.dacute .. "]" -- üű
},
from = {"æ", "[ðđ]", "ł", "ŋ", "œ", "ß", "þ", "u[" .. c.diaer .. c.dacute .. "]", "å", "aͤ", "o[" .. c.tilde .. c.dacute .. c.small_e .. "]", "ø", "(.)['%-]"},
to = {"ae", "d", "l", "n", "oe", "ss", "th", "y", "z" .. p[1], "ä", "ö", "ö", "%1"}
},
standard_chars = "AaBbDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvYyÄäÖö" .. c.punc,
}
m["fj"] = {
"Fijian",
33295,
"poz-pcc",
"Latn",
}
m["fo"] = {
"Faroese",
25258,
"gmq-ins",
"Latn",
sort_key = {
from = {"á", "ð", "í", "ó", "ú", "ý", "æ", "ø"},
to = {"a" .. p[1], "d" .. p[1], "i" .. p[1], "o" .. p[1], "u" .. p[1], "y" .. p[1], "z" .. p[1], "z" .. p[2]}
},
standard_chars = "AaÁáBbDdÐðEeFfGgHhIiÍíJjKkLlMmNnOoÓóPpRrSsTtUuÚúVvYyÝýÆæØø" .. c.punc,
}
m["fr"] = {
"फ़्रांसीसी",
150,
"roa-oil",
"Latn, Brai",
ancestors = "frm",
sort_key = {
Latn = s["roa-oil-sortkey"]
},
standard_chars = {
Latn = "AaÀàÂâBbCcÇçDdEeÉéÈèÊêËëFfGgHhIiÎîÏïJjLlMmNnOoÔôŒœPpQqRrSsTtUuÙùÛûÜüVvXxYyZz",
Brai = c.braille,
c.punc
},
}
m["fy"] = {
"West Frisian",
27175,
"gmw-fri",
"Latn",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer,
from = {"y"},
to = {"i"}
},
standard_chars = "AaâäàÆæBbCcDdEeéêëèFfGgHhIiïìYyỳJjKkLlMmNnOoôöòPpRrSsTtUuúûüùVvWwZz" .. c.punc,
}
m["ga"] = {
"Irish",
9142,
"cel-gae",
"Latn, Latg",
ancestors = "mga",
sort_key = {
remove_diacritics = c.acute,
from = {"ḃ", "ċ", "ḋ", "ḟ", "ġ", "ṁ", "ṗ", "ṡ", "ṫ"},
to = {"bh", "ch", "dh", "fh", "gh", "mh", "ph", "sh", "th"}
},
standard_chars = "AaÁáBbCcDdEeÉéFfGgHhIiÍíLlMmNnOoÓóPpRrSsTtUuÚúVv" .. c.punc,
}
m["gd"] = {
"Scottish Gaelic",
9314,
"cel-gae",
"Latn, Latg",
ancestors = "mga",
sort_key = {remove_diacritics = c.grave .. c.acute},
standard_chars = "AaÀàBbCcDdEeÈèFfGgHhIiÌìLlMmNnOoÒòPpRrSsTtUuÙù" .. c.punc,
}
m["gl"] = {
"Galician",
9307,
"roa-gap",
"Latn",
sort_key = {
remove_diacritics = c.acute,
from = {"ñ"},
to = {"n" .. p[1]}
},
standard_chars = "AaÁáBbCcDdEeÉéFfGgHhIiÍíÏïLlMmNnÑñOoÓóPpQqRrSsTtUuÚúÜüVvXxZz" .. c.punc,
}
m["gu"] = {
"Gujarati",
5137,
"inc-wes",
"Arab, Gujr",
ancestors = "inc-mgu",
translit = {
Gujr = "gu-translit",
},
strip_diacritics = {
Arab = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.kasra .. c.shadda .. c.sukun},
Gujr = {remove_diacritics = "઼"},
},
}
m["gv"] = {
"Manx",
12175,
"cel-gae",
"Latn",
ancestors = "mga",
sort_key = {remove_diacritics = c.cedilla .. "-"},
standard_chars = "AaBbCcÇçDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwYy" .. c.punc,
}
m["ha"] = {
"Hausa",
56475,
"cdc-wst",
"Latn, Arab",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron}
},
sort_key = {
Latn = {
from = {"ɓ", "b'", "ɗ", "d'", "ƙ", "k'", "sh", "ƴ", "'y"},
to = {"b" .. p[1], "b" .. p[2], "d" .. p[1], "d" .. p[2], "k" .. p[1], "k" .. p[2], "s" .. p[1], "y" .. p[1], "y" .. p[2]}
},
},
}
m["he"] = {
"Hebrew",
9288,
"sem-can",
"Hebr, Phnx, Brai, Samr",
ancestors = "he-med",
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
-- Samr strip_diacritics, sort_key in [[Module:scripts/data]]
-- Phnx translit in [[Module:scripts/data]] (NOTE: not present before, presumably an accidental omission)
}
m["hi"] = {
"हिंदी",
1568,
"inc-hnd",
"Deva, Kthi, Newa",
translit = {
Deva = "hi-translit"
},
standard_chars = {
Deva = "अआइईउऊएऐओऔकखगघङचछजझञटठडढणतथदधनपफबभमयरलवशषसहत्रज्ञक्षक़ख़ग़ज़झ़ड़ढ़फ़काखागाघाङाचाछाजाझाञाटाठाडाढाणाताथादाधानापाफाबाभामायारालावाशाषासाहात्राज्ञाक्षाक़ाख़ाग़ाज़ाझ़ाड़ाढ़ाफ़ाकिखिगिघिङिचिछिजिझिञिटिठिडिढिणितिथिदिधिनिपिफिबिभिमियिरिलिविशिषिसिहित्रिज्ञिक्षिक़िख़िग़िज़िझ़िड़िढ़िफ़िकीखीगीघीङीचीछीजीझीञीटीठीडीढीणीतीथीदीधीनीपीफीबीभीमीयीरीलीवीशीषीसीहीत्रीज्ञीक्षीक़ीख़ीग़ीज़ीझ़ीड़ीढ़ीफ़ीकुखुगुघुङुचुछुजुझुञुटुठुडुढुणुतुथुदुधुनुपुफुबुभुमुयुरुलुवुशुषुसुहुत्रुज्ञुक्षुक़ुख़ुग़ुज़ुझ़ुड़ुढ़ुफ़ुकूखूगूघूङूचूछूजूझूञूटूठूडूढूणूतूथूदूधूनूपूफूबूभूमूयूरूलूवूशूषूसूहूत्रूज्ञूक्षूक़ूख़ूग़ूज़ूझ़ूड़ूढ़ूफ़ूकेखेगेघेङेचेछेजेझेञेटेठेडेढेणेतेथेदेधेनेपेफेबेभेमेयेरेलेवेशेषेसेहेत्रेज्ञेक्षेक़ेख़ेग़ेज़ेझ़ेड़ेढ़ेफ़ेकैखैगैघैङैचैछैजैझैञैटैठैडैढैणैतैथैदैधैनैपैफैबैभैमैयैरैलैवैशैषैसैहैत्रैज्ञैक्षैक़ैख़ैग़ैज़ैझ़ैड़ैढ़ैफ़ैकोखोगोघोङोचोछोजोझोञोटोठोडोढोणोतोथोदोधोनोपोफोबोभोमोयोरोलोवोशोषोसोहोत्रोज्ञोक्षोक़ोख़ोग़ोज़ोझ़ोड़ोढ़ोफ़ोकौखौगौघौङौचौछौजौझौञौटौठौडौढौणौतौथौदौधौनौपौफौबौभौमौयौरौलौवौशौषौसौहौत्रौज्ञौक्षौक़ौख़ौग़ौज़ौझ़ौड़ौढ़ौफ़ौक्ख्ग्घ्ङ्च्छ्ज्झ्ञ्ट्ठ्ड्ढ्ण्त्थ्द्ध्न्प्फ्ब्भ्म्य्र्ल्व्श्ष्स्ह्त्र्ज्ञ्क्ष्क़्ख़्ग़्ज़्झ़्ड़्ढ़्फ़्।॥०१२३४५६७८९॰",
c.punc
},
}
m["ho"] = {
"Hiri Motu",
33617,
"crp",
"Latn",
ancestors = "meu",
}
m["ht"] = {
"Haitian Creole",
33491,
"crp",
"Latn",
ancestors = "ht-sdm",
sort_key = {
from = {
"oun", -- 3 chars
"an", "ch", "è", "en", "ng", "ò", "on", "ou", "ui" -- 2 chars
},
to = {
"o" .. p[4],
"a" .. p[1], "c" .. p[1], "e" .. p[1], "e" .. p[2], "n" .. p[1], "o" .. p[1], "o" .. p[2], "o" .. p[3], "u" .. p[1]
}
},
}
m["hu"] = {
"Hungarian",
9067,
"urj-ugr",
"Latn, Hung",
ancestors = "ohu",
sort_key = {
Latn = {
from = {
"dzs", -- 3 chars
"á", "cs", "dz", "é", "gy", "í", "ly", "ny", "ó", "ö", "ő", "sz", "ty", "ú", "ü", "ű", "zs", -- 2 chars
},
to = {
"d" .. p[2],
"a" .. p[1], "c" .. p[1], "d" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "l" .. p[1], "n" .. p[1], "o" .. p[1], "o" .. p[2], "o" .. p[3], "s" .. p[1], "t" .. p[1], "u" .. p[1], "u" .. p[2], "u" .. p[3], "z" .. p[1],
}
},
},
standard_chars = {
Latn = "AaÁáBbCcDdEeÉéFfGgHhIiÍíJjKkLlMmNnOoÓóÖöŐőPpQqRrSsTtUuÚúÜüŰűVvWwXxYyZz",
c.punc
},
}
m["hy"] = {
"Armenian",
8785,
"hyx",
"Armn, Brai",
ancestors = "axm",
-- Armn translit in [[Module:scripts/data]]
override_translit = true,
strip_diacritics = {
Armn = {
remove_diacritics = "՛՜՞՟",
from = {"եւ", "<sup>յ</sup>", "<sup>ի</sup>", "<sup>է</sup>", "յ̵", "ՙ", "՚"},
to = {"և", "յ", "ի", "է", "ֈ", "ʻ", "’"}
},
},
sort_key = {
Armn = {
from = {
"ու", "եւ", -- 2 chars
"և" -- 1 char
},
to = {
"ւ", "եվ",
"եվ"
}
},
},
}
m["hz"] = {
"Herero",
33315,
"bnt-swb",
"Latn",
}
m["ia"] = {
"Interlingua",
35934,
"art",
"Latn",
}
m["id"] = {
"Indonesian",
9240,
"poz-mly",
"Latn",
ancestors = "ms",
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz" .. c.punc,
}
m["ie"] = {
"Interlingue",
35850,
"art",
"Latn",
type = "appendix-constructed",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ},
}
m["ig"] = {
"Igbo",
33578,
"alv-igb",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.macron},
sort_key = {
from = {"gb", "gh", "gw", "ị", "kp", "kw", "ṅ", "nw", "ny", "ọ", "sh", "ụ"},
to = {"g" .. p[1], "g" .. p[2], "g" .. p[3], "i" .. p[1], "k" .. p[1], "k" .. p[2], "n" .. p[1], "n" .. p[2], "n" .. p[3], "o" .. p[1], "s" .. p[1], "u" .. p[1]}
},
}
m["ii"] = {
"Nuosu",
34235,
"tbq-nlo",
"Yiii",
translit = "ii-translit",
}
m["ik"] = {
"Inupiaq",
27183,
"esx-inu",
"Latn",
sort_key = {
from = {
"ch", "ġ", "dj", "ḷ", "ł̣", "ñ", "ng", "r̂", "sr", "zr", -- 2 chars
"ł", "ŋ", "ʼ" -- 1 char
},
to = {
"c" .. p[1], "g" .. p[1], "h" .. p[1], "l" .. p[1], "l" .. p[3], "n" .. p[1], "n" .. p[2], "r" .. p[1], "s" .. p[1], "z" .. p[1],
"l" .. p[2], "n" .. p[2], "z" .. p[2]
}
},
}
m["io"] = {
"Ido",
35224,
"art",
"Latn",
}
m["is"] = {
"Icelandic",
294,
"gmq-ins",
"Latn",
sort_key = {
from = {"á", "ð", "é", "í", "ó", "ú", "ý", "þ", "æ", "ö"},
to = {"a" .. p[1], "d" .. p[1], "e" .. p[1], "i" .. p[1], "o" .. p[1], "u" .. p[1], "y" .. p[1], "z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
standard_chars = "AaÁáBbDdÐðEeÉéFfGgHhIiÍíJjKkLlMmNnOoÓóPpRrSsTtUuÚúVvXxYyÝýÞþÆæÖö" .. c.punc,
}
m["it"] = {
"Italian",
652,
"roa-itr",
"Latn",
ancestors = "roa-oit",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.ringabove},
standard_chars = "AaÀàBbCcDdEeÈèÉéFfGgHhIiÌìLlMmNnOoÒòPpQqRrSsTtUuÙùVvZz" .. c.punc,
}
m["iu"] = {
"Inuktitut",
29921,
"esx-inu",
"Cans, Latn",
translit = {
Cans = "cr-translit"
},
override_translit = true,
}
m["ja"] = {
"Japanese",
5287,
"jpx",
"Jpan, Latn, Brai",
ancestors = "ja-ear",
translit = s["jpx-translit"],
link_tr = true,
display_text = s["jpx-displaytext"],
strip_diacritics = s["jpx-stripdiacritics"],
sort_key = s["jpx-sortkey"],
}
m["jv"] = {
"Javanese",
33549,
"poz",
"Latn, Java, Arab",
ancestors = "kaw",
translit = {
Java = "jv-translit"
},
link_tr = true,
strip_diacritics = {
Latn = {remove_diacritics = c.circ} -- Modern jv don't use ê
},
sort_key = {
Latn = {
from = {"å", "dh", "é", "è", "ng", "ny", "th"},
to = {"a" .. p[1], "d" .. p[1], "e" .. p[1], "e" .. p[2], "n" .. p[1], "n" .. p[2], "t" .. p[1]}
},
},
}
m["ka"] = {
"Georgian",
8108,
"ccs-gzn",
"Geor, Geok, Hebr", -- Hebr is used to write Judeo-Georgian
ancestors = "ka-mid",
-- Geor, Geok translit in [[Module:scripts/data]]
override_translit = true,
strip_diacritics = {
Geor = s["ka-stripdiacritics"],
Geok = s["ka-stripdiacritics"],
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["kg"] = {
"Kongo",
33702,
"bnt-kng",
"Latn",
}
m["ki"] = {
"Kikuyu",
33587,
"bnt-kka",
"Latn",
}
m["kj"] = {
"Kwanyama",
1405077,
"bnt-ova",
"Latn",
}
m["kk"] = {
"Kazakh",
9252,
"trk-kno",
"Cyrl, Latn, Arab",
translit = "kk-translit",
-- override_translit = true,
sort_key = {
Cyrl = {
from = {"ә", "ғ", "ё", "қ", "ң", "ө", "ұ", "ү", "һ", "і"},
to = {"а" .. p[1], "г" .. p[1], "е" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "у" .. p[2], "х" .. p[1], "ы" .. p[1]}
},
},
standard_chars = {
Cyrl = "АаӘәБбВвГгҒғДдЕеЁёЖжЗзИиЙйКкҚқЛлМмНнҢңОоӨөПпРрСсТтУуҰұҮүФфХхҺһЦцЧчШшЩщЪъЫыІіЬьЭэЮюЯя",
c.punc
},
}
m["kl"] = {
"Greenlandic",
25355,
"esx-inu",
"Latn",
sort_key = {
from = {"æ", "ø", "å"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
}
}
m["km"] = {
"Khmer",
9205,
"mkh-kmr",
"Khmr",
ancestors = "xhm",
translit = "km-translit", --This might yield unwanted result unless its entry has {{km-IPA}}.
}
m["kn"] = {
"Kannada",
33673,
"dra-kan",
"Knda, Tutg",
ancestors = "dra-mkn",
-- Knda translit in [[Module:scripts/data]]
}
m["ko"] = {
"Korean",
9176,
"qfa-kor",
"Kore, Brai",
ancestors = "ko-ear",
translit = {
Kore = "ko-translit",
},
-- Kore strip_diacritics in [[Module:scripts/data]]
}
m["kr"] = {
"Kanuri",
36094,
"ssa-sah",
"Latn, Arab",
-- the sortkey and strip_diacritics are only for standard Kanuri; when dialectal entries get added, someone will have to work out how the dialects should be represented orthographically
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.breve}
},
sort_key = {
Latn = {
from = {"ǝ", "ny", "ɍ", "sh"},
to = {"e" .. p[1], "n" .. p[1], "r" .. p[1], "s" .. p[1]}
},
},
}
m["ks"] = {
"Kashmiri",
33552,
"inc-kas",
"Aran, Deva, Shrd, Latn",
translit = {
Aran = "ks-Aran-translit",
Deva = "ks-Deva-translit",
-- Shrd translit in [[Module:scripts/data]]
},
}
-- "kv" is treated as "koi", "kpv", see [[WT:LT]]
m["kw"] = {
"Cornish",
25289,
"cel-brs",
"Latn",
ancestors = "cnx",
sort_key = {
from = {"ch"},
to = {"c" .. p[1]}
},
}
m["ky"] = {
"Kyrgyz",
9255,
"trk-kkp",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "ky-translit"
},
override_translit = true,
sort_key = {
Cyrl = {
from = {"ё", "ң", "ө", "ү"},
to = {"е" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1]}
},
},
}
m["la"] = {
"Latin",
397,
"itc-laf",
"Latn, Ital",
ancestors = "itc-ola",
-- Ital translit in [[Module:scripts/data]] (NOTE: formerly not present, probably an accidental omission)
display_text = {
Latn = s["itc-Latn-displaytext"]
},
strip_diacritics = {
Latn = s["itc-Latn-stripdiacritics"]
},
sort_key = {
Latn = s["itc-Latn-sortkey"]
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiLlMmNnOoPpQqRrSsTtUuVvXx",
c.punc
},
}
m["lb"] = {
"Luxembourgish",
9051,
"gmw-hgm",
"Latn, Brai",
ancestors = "gmw-cfr",
sort_key = {
Latn = {
from = {"ä", "ë", "é"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3]}
},
},
}
m["lg"] = {
"Luganda",
33368,
"bnt-nyg",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ},
sort_key = {
from = {"ŋ"},
to = {"n" .. p[1]}
},
}
m["li"] = {
"Limburgish",
102172,
"gmw-frk",
"Latn",
ancestors = "dum",
}
m["ln"] = {
"Lingala",
36217,
"bnt-bmo",
"Latn",
sort_key = {
remove_diacritics = c.acute .. c.circ .. c.caron,
from = {"ɛ", "gb", "mb", "mp", "nd", "ng", "nk", "ns", "nt", "ny", "nz", "ɔ"},
to = {"e" .. p[1], "g" .. p[1], "m" .. p[1], "m" .. p[2], "n" .. p[1], "n" .. p[2], "n" .. p[3], "n" .. p[4], "n" .. p[5], "n" .. p[6], "n" .. p[7], "o" .. p[1]}
},
}
m["lo"] = {
"Lao",
9211,
"tai-swe",
"Laoo", -- also Tai Noi/Lao Buhan script
translit = "lo-translit",
sort_key = "Laoo-sortkey",
standard_chars = "0-9ກຂຄງຈຊຍດຕຖທນບປຜຝພຟມຢຣລວສຫອຮຯ-ໝ" .. c.punc,
}
m["lt"] = {
"Lithuanian",
9083,
"bat-eas",
"Latn",
ancestors = "olt",
display_text = "lt-common",
strip_diacritics = "lt-common",
sort_key = "lt-common",
standard_chars = "AaĄąBbCcČčDdEeĘęĖėFfGgHhIiĮįYyJjKkLlMmNnOoPpRrSsŠšTtUuŲųŪūVvZzŽž" .. c.punc,
}
m["lu"] = {
"Luba-Katanga",
36157,
"bnt-lub",
"Latn",
}
m["lv"] = {
"Latvian",
9078,
"bat-eas",
"Latn",
strip_diacritics = {
-- This attempts to convert vowels with tone marks to vowels either with or without macrons. Specifically, there should be no macrons if the vowel is part of a diphthong (including resonant diphthongs such pìrksts -> pirksts not #pīrksts). What we do is first convert the vowel + tone mark to a vowel + tilde in a decomposed fashion, then remove the tilde in diphthongs, then convert the remaining vowel + tilde sequences to macroned vowels, then delete any other tilde. We leave already-macroned vowels alone: Both e.g. ar and ār occur before consonants. FIXME: This still might not be sufficient.
from = {"([Ee])" .. c.cedilla, "[" .. c.grave .. c.circ .. c.tilde .."]", "([aAeEiIoOuU])" .. c.tilde .."?([lrnmuiLRNMUI])" .. c.tilde .. "?([^aAeEiIoOuU])", "([aAeEiIoOuU])" .. c.tilde .."?([lrnmuiLRNMUI])" .. c.tilde .."?$", "([iI])" .. c.tilde .. "?([eE])" .. c.tilde .. "?", "([aAeEiIuU])" .. c.tilde, c.tilde},
to = {"%1", c.tilde, "%1%2%3", "%1%2", "%1%2", "%1" .. c.macron}
},
sort_key = {
from = {"ā", "č", "ē", "ģ", "ī", "ķ", "ļ", "ņ", "š", "ū", "ž"},
to = {"a" .. p[1], "c" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "k" .. p[1], "l" .. p[1], "n" .. p[1], "s" .. p[1], "u" .. p[1], "z" .. p[1]}
},
standard_chars = "AaĀāBbCcČčDdEeĒēFfGgĢģHhIiĪīJjKkĶķLlĻļMmNnŅņOoPpRrSsŠšTtUuŪūVvZzŽž" .. c.punc,
}
m["mg"] = {
"Malagasy",
7930,
"poz-bre",
"Latn, Arab",
}
m["mh"] = {
"Marshallese",
36280,
"poz-mic",
"Latn",
sort_key = {
from = {"ā", "ļ", "m̧", "ņ", "n̄", "o̧", "ō", "ū"},
to = {"a" .. p[1], "l" .. p[1], "m" .. p[1], "n" .. p[1], "n" .. p[2], "o" .. p[1], "o" .. p[2], "u" .. p[1]}
},
}
m["mi"] = {
"Māori",
36451,
"poz-pep",
"Latn",
sort_key = {
remove_diacritics = c.macron,
from = {"ng", "wh"},
to = {"n" .. p[1], "w" .. p[1]}
},
}
m["mk"] = {
"Macedonian",
9296,
"zls",
"Cyrl, Polyt",
ancestors = "cu",
translit = {
Cyrl = "mk-translit",
-- FIXME: formerly no translit specified for Polyt; unclear if the default [[Module:grc-translit]] is
-- acceptable, so we disable it for now
Polyt = false,
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.acute,
remove_exceptions = {"Ѓ", "ѓ", "Ќ", "ќ"}
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave,
remove_exceptions = {"ѓ", "ќ"},
from = {"ѓ", "ѕ", "ј", "љ", "њ", "ќ", "џ"},
to = {"д" .. p[1], "з" .. p[1], "и" .. p[1], "л" .. p[1], "н" .. p[1], "т" .. p[1], "ч" .. p[1]}
},
},
-- Polyt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
Cyrl = "АаБбВвГгДдЃѓЕеЖжЗзЅѕИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЌќУуФфХхЦцЧчЏџШш",
c.punc
},
}
m["ml"] = {
"Malayalam",
36236,
"dra-mal",
"Mlym",
override_translit = true,
-- Mlym translit in [[Module:scripts/data]]
}
m["mn"] = {
"Mongolian",
9246,
"xgn-cen",
"Cyrl, Mong, Latn, Brai",
ancestors = "cmg",
translit = {
Cyrl = "mn-translit",
-- Mong translit in [[Module:scripts/data]]
},
override_translit = true,
-- Mong display_text and strip_diacritics in [[Module:scripts/data]]
strip_diacritics = {
Cyrl = {remove_diacritics = c.grave .. c.acute},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave,
from = {"ё", "ө", "ү"},
to = {"е" .. p[1], "о" .. p[1], "у" .. p[1]}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзИиЙйЛлМмНнОоӨөРрСсТтУуҮүХхЦцЧчШшЫыЬьЭэЮюЯя—",
Brai = c.braille,
c.punc
},
}
-- "mo" is treated as "ro", see [[WT:LT]]
m["mr"] = {
"मराठी",
1571,
"inc-sou",
"Deva, Modi",
ancestors = "omr",
translit = {
Deva = "mr-translit",
Modi = "mr-Modi-translit",
},
strip_diacritics = {
Deva = {
from = {"च़", "ज़", "झ़"},
to = {"च", "ज", "झ"}
},
},
}
m["ms"] = {
"Malay",
9237,
"poz-mly",
"Latn, Arab",
ancestors = "ms-cla",
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
c.punc
},
}
m["mt"] = {
"Maltese",
9166,
"sem-arb",
"Latn",
display_text = {
from = {"'"},
to = {"’"}
},
strip_diacritics = {
from = {"’"},
to = {"'"},
},
ancestors = "sqr",
sort_key = {
from = {
"ċ", "ġ", "ż", -- Convert into PUA so that decomposed form does not get caught by the next step.
"([cgz])", -- Ensure "c" comes after "ċ", "g" comes after "ġ" and "z" comes after "ż".
"g" .. p[1] .. "ħ", -- "għ" after initial conversion of "g".
p[3], p[4], "ħ", "ie", p[5] -- Convert "ċ", "ġ", "ħ", "ie", "ż" into final output.
},
to = {
p[3], p[4], p[5],
"%1" .. p[1],
"g" .. p[2],
"c", "g", "h" .. p[1], "i" .. p[1], "z"
}
},
}
m["my"] = {
"बर्मी",
9228,
"tbq-brm",
"Mymr",
ancestors = "obr",
translit = "my-translit",
override_translit = true,
sort_key = {
from = {"ျ", "ြ", "ွ", "ှ", "ဿ"},
to = {"္ယ", "္ရ", "္ဝ", "္ဟ", "သ္သ"}
},
}
m["na"] = {
"Nauruan",
13307,
"poz-mic",
"Latn",
}
m["nb"] = {
"Norwegian Bokmål",
25167,
"gmq",
"Latn",
wikimedia_codes = "no",
ancestors = "gmq-mno, da", -- da as an (but not the) ancestor of nb was agreed on - do not change without discussion
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["nd"] = {
"Northern Ndebele",
35613,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["ne"] = {
"नेपाली",
33823,
"inc-pae",
"Deva, Newa",
translit = {
Deva = "ne-translit"
},
}
m["ng"] = {
"Ndonga",
33900,
"bnt-ova",
"Latn",
}
m["nl"] = {
"डच",
7411,
"gmw-frk",
"Latn, Brai",
ancestors = "dum",
sort_key = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.diaer .. c.ringabove .. c.cedilla .. "'"},
},
standard_chars = {
Latn = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÄäËëÏïÖöÜü",
Brai = c.braille,
c.punc
},
}
m["nn"] = {
"Norwegian Nynorsk",
25164,
"gmq-wes",
"Latn",
ancestors = "gmq-mno",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute,
},
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["no"] = {
"नॉर्वेजियन",
9043,
"gmq-wes",
"Latn",
ancestors = "gmq-mno",
sort_key = s["no-sortkey"],
standard_chars = s["no-standardchars"],
}
m["nr"] = {
"Southern Ndebele",
36785,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["nv"] = {
"Navajo",
13310,
"apa",
"Latn, Brai",
sort_key = {
remove_diacritics = c.acute .. c.ogonek,
from = {
"chʼ", "tłʼ", "tsʼ", -- 3 chars
"ch", "dl", "dz", "gh", "hw", "kʼ", "kw", "sh", "tł", "ts", "zh", -- 2 chars
"ł", "ʼ" -- 1 char
},
to = {
"c" .. p[2], "t" .. p[2], "t" .. p[4],
"c" .. p[1], "d" .. p[1], "d" .. p[2], "g" .. p[1], "h" .. p[1], "k" .. p[1], "k" .. p[2], "s" .. p[1], "t" .. p[1], "t" .. p[3], "z" .. p[1],
"l" .. p[1], "z" .. p[2]
}
},
}
m["ny"] = {
"Chichewa",
33273,
"bnt-nys",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ},
sort_key = {
from = {"ng'"},
to = {"ng"}
},
}
m["oc"] = {
"Occitan",
14185,
"roa-ocr",
"Latn, Hebr",
ancestors = "pro",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.diaer .. c.cedilla,
from = {"([lns])·h"},
to = {"%1h"}
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["oj"] = {
"Ojibwe",
33875,
"alg",
"Cans, Latn",
sort_key = {
Latn = {
from = {"aa", "ʼ", "ii", "oo", "sh", "zh"},
to = {"a" .. p[1], "h" .. p[1], "i" .. p[1], "o" .. p[1], "s" .. p[1], "z" .. p[1]}
},
},
}
m["om"] = {
"Oromo",
33864,
"cus-eas",
"Latn, Ethi",
}
m["or"] = {
"Odia",
33810,
"inc-eas",
"Orya",
ancestors = "inc-mor",
translit = "or-translit",
}
m["os"] = {
"Ossetian",
33968,
"xsc-sar",
"Cyrl, Geor, Latn",
ancestors = "oos",
translit = {
Cyrl = "os-translit",
-- Geor translit in [[Module:scripts/data]]
},
override_translit = true,
display_text = {
Cyrl = {
from = {"æ"},
to = {"ӕ"}
},
Latn = {
from = {"ӕ"},
to = {"æ"}
},
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute,
from = {"æ"},
to = {"ӕ"}
},
Latn = {
from = {"ӕ"},
to = {"æ"}
},
},
sort_key = {
Cyrl = {
from = {"ӕ", "гъ", "дж", "дз", "ё", "къ", "пъ", "тъ", "хъ", "цъ", "чъ"},
to = {"а" .. p[1], "г" .. p[1], "д" .. p[1], "д" .. p[2], "е" .. p[1], "к" .. p[1], "п" .. p[1], "т" .. p[1], "х" .. p[1], "ц" .. p[1], "ч" .. p[1]}
},
},
}
m["pa"] = {
"पंजाबी",
58635,
"inc-pan",
"Guru, Aran",
translit = {
Guru = "Guru-translit",
Aran = "pa-Aran-translit",
},
strip_diacritics = {
Aran = {
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna,
from = {"ݨ", "ࣇ"},
to = {"ن", "ل"}
},
},
}
m["pi"] = {
"पालि",
36727,
"inc-mid",
"Latn, Brah, Deva, Beng, Sinh, Mymr, Thai, Lana, Laoo, Khmr, Cakm", --and also Khom
ancestors = "sa",
translit = {
-- Brah translit in [[Module:scripts/data]]
Deva = "sa-translit",
Beng = "pi-translit",
Sinh = "si-translit",
Mymr = "pi-translit",
Thai = "pi-translit",
Lana = "pi-translit",
Laoo = "pi-translit",
Khmr = "pi-translit",
Cakm = "Cakm-translit",
},
strip_diacritics = {
Thai = {
from = {"ึ", u(0xF700), u(0xF70F)}, -- FIXME: Not clear what's going on with the PUA characters here.
to = {"ิํ", "ฐ", "ญ"}
},
Mymr = {
remove_diacritics = c.VS01,
},
},
sort_key = { -- FIXME: This needs to be converted into the current standardized format.
from = {"ā", "ī", "ū", "ḍ", "ḷ", "m[" .. c.dotabove .. c.dotbelow .. "]", "ṅ", "ñ", "ṇ", "ṭ", "ॐ", "([เโ])([ก-ฮ])", "([ເໂ])([ກ-ຮ])", "ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ", u(0xFE00), u(0x200D)},
to = {"a~", "i~", "u~", "d~", "l~", "m~", "n~", "n~~", "n~~~", "t~", "ओँ", "%2%1", "%2%1", "ᩈ᩠ᩈ", "᩠ᩁ", "᩠ᩃ", "ᨦ᩠", "%1᩠ᨮ", "%1᩠ᨻ", "ᩣ"}
},
}
m["pl"] = {
"Polish",
809,
"zlw-lch",
"Latn",
ancestors = "zlw-mpl",
sort_key = {
from = {"ą", "ć", "ę", "ł", "ń", "ó", "ś", "ź", "ż"},
to = {"a" .. p[1], "c" .. p[1], "e" .. p[1], "l" .. p[1], "n" .. p[1], "o" .. p[1], "s" .. p[1], "z" .. p[1], "z" .. p[2]}
},
standard_chars = "AaĄąBbCcĆćDdEeĘęFfGgHhIiJjKkLlŁłMmNnŃńOoÓóPpRrSsŚśTtUuWwYyZzŹźŻż" .. c.punc,
}
m["ps"] = {
"पश्तो",
58680,
"ira-pat",
"Arab",
strip_diacritics = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.zwarakay .. c.superalef},
}
m["pt"] = {
"पुर्तगाली",
5146,
"roa-gap",
"Latn, Brai",
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.diaer .. c.cedilla,
from = {"ª", "æ", "º", "œ"},
to = {"a", "ae", "o", "oe"}
},
},
standard_chars = {
Latn = "AaÁáÂâÃãBbCcÇçDdEeÉéÊêFfGgHhIiÍíJjLlMmNnOoÓóÔôÕõPpQqRrSsTtUuÚúVvXxZz",
Brai = c.braille,
c.punc
},
}
m["qu"] = {
"Quechua",
5218,
"qwe",
"Latn",
}
m["rm"] = {
"Romansh",
13199,
"roa-rhe",
ancestors = "rm-old",
"Latn",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.diaer .. c.small_e},
}
m["ro"] = {
"रोमानियाई",
7913,
"roa-eas",
"Latn, Cyrl, Cyrs",
translit = {
Cyrl = "ro-translit"
},
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute,
from = {"ă", "â", "î", "ș", "ț"},
to = {"a" .. p[1], "a" .. p[2], "i" .. p[1], "s" .. p[1], "t" .. p[1]}
},
Cyrl = {
from = {"ӂ"},
to = {"ж" .. p[1]}
},
},
-- Cyrs strip_diacritics, sort_key in [[Module:scripts/data]]; presumably not present
standard_chars = {
Latn = "AaĂăÂâBbCcDdEeFfGgHhIiÎîJjLlMmNnOoPpRrSsȘșTtȚțUuVvXxZz",
Cyrl = "АаБбВвГгДдЕеЖжӁӂЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЫыЬьЭэЮюЯя",
c.punc
},
}
m["ru"] = {
"रूसी",
7737,
"zle",
"Cyrl, Brai",
ancestors = "zle-mru",
translit = {
Cyrl = "ru-translit"
},
display_text = {
Cyrl = {
from = {"'"},
to = {"’"}
},
},
strip_diacritics = {
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.diaer,
remove_exceptions = {"Ё", "ё", "Ѣ̈", "ѣ̈", "Я̈", "я̈"},
from = {"’"},
to = {"'"},
},
},
sort_key = {
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.diaer,
from = {
"і", "ѣ", "ѳ", "ѵ"
},
to = {
"и" .. p[1], "ь" .. p[1], "я" .. p[2], "я" .. p[3]
}
},
},
standard_chars = {
Cyrl = "АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя—",
Brai = c.braille,
(c.punc:gsub("'", "")) -- Exclude apostrophe.
},
}
m["rw"] = {
"Rwanda-Rundi",
3217514,
"bnt-glb",
"Latn",
strip_diacritics = {remove_diacritics = c.acute .. c.circ .. c.macron .. c.caron},
}
m["sa"] = {
"संस्कृत",
11059,
"inc",
"as-Beng, Bali, Beng, Bhks, Brah, Mymr, xwo-Mong, Deva, Gujr, Guru, Gran, Hani, Java, Kthi, Knda, Kawi, Khar, Khmr, Laoo, Mlym, mnc-Mong, Marc, Modi, Mong, Nand, Newa, Orya, Phag, Ranj, Saur, Shrd, Sidd, Sinh, Soyo, Lana, Takr, Taml, Tang, Telu, Thai, Tibt, Tutg, Tirh, Zanb", --and also Khom; script codes sorted by canonical name rather than code for [[MOD:sa-convert]]
translit = {
Beng = "sa-Beng-translit",
["as-Beng"] = "sa-Beng-translit",
-- Brah translit in [[Module:scripts/data]]
Deva = "sa-translit",
Gujr = "sa-Gujr-translit",
Guru = "sa-Guru-translit",
Java = "sa-Java-translit",
Kthi = "sa-Kthi-translit",
Khmr = "pi-translit",
Knda = "sa-Knda-translit",
Lana = "pi-translit",
Laoo = "pi-translit",
Mlym = "sa-Mlym-translit",
Modi = "sa-Modi-translit",
-- Mong, mnc-Mong, xwo-Mong translit in [[Module:scripts/data]]
-- NOTE: Formerly used xal-translit for transliterating xwo-Mong but that only handles Cyrillic; it has
-- code to transliterate xwo-Mong but it's broken so I've replaced it with the default xwo-translit.
Mymr = "pi-translit",
Orya = "sa-Orya-translit",
-- Shrd translit in [[Module:scripts/data]]
-- Sidd translit in [[Module:scripts/data]]
Sinh = "si-translit",
Taml = "sa-Taml-translit",
Telu = "sa-Telu-translit",
Thai = "pi-translit",
-- Tibt translit in [[Module:scripts/data]]
},
-- Mong display_text and strip_diacritics in [[Module:scripts/data]]
-- Tibt display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
strip_diacritics = {
Deva = s["sa-Deva-stripdiacritics"],
Mymr = {
remove_diacritics = c.VS01,
},
Thai = {
from = {"ึ", u(0xF700), u(0xF70F)}, -- FIXME: Not clear what's going on with the PUA characters here.
to = {"ิํ", "ฐ", "ญ"}
},
},
sort_key = {
Deva = s["sa-Deva-stripdiacritics"], -- until we have a proper Sanskrit sorting algorithm.
Lana = { -- Tai Tham
from = {"ᩔ", "ᩕ", "ᩖ", "ᩘ", "([ᨭ-ᨱ])ᩛ", "([ᨷ-ᨾ])ᩛ", "ᩤ"},
to = {"ᩈ᩠ᩈ", "᩠ᩁ", "᩠ᩃ", "ᨦ᩠", "%1᩠ᨮ", "%1᩠ᨻ", "ᩣ"},
},
Laoo = "Laoo-sortkey",
Latn = {
from = {"ā", "ī", "ū", "ḍ", "ḷ", "ḹ", "m[" .. c.dotabove .. c.dotbelow .. "]", "ṅ", "ñ", "ṇ", "ṛ", "ṝ", "ś", "ṣ", "ṭ"},
to = {"a~", "i~", "u~", "d~", "l~", "l~~", "m~", "n~", "n~~", "n~~~", "r~", "r~~", "s~", "s~~", "t~"},
},
Mymr = {
remove_diacritics = c.VS01,
},
Thai = "Thai-sortkey",
-- FIXME: The previous sort key which mixed all scripts removed ZWJ; I don't know which script(s) this was
-- intended for and there are no other languages which remove it in the sort key AFAIK. If it needs to be
-- removed, specify the script(s) it needs to be removed under or add handling for the "all" script that applies
-- regardless of script.
--all = {
-- remove_diacritics = c.ZWJ,
--},
},
}
m["sc"] = {
"Sardinian",
33976,
"roa-sou",
"Latn",
ancestors = "sc-old",
}
m["sd"] = {
"सिंधी",
33997,
"inc-snd",
"Arab, Deva, Sind, Khoj",
translit = {
Sind = "Sind-translit",
Arab = "sd-Arab-translit"
},
strip_diacritics = {
Arab = {
remove_diacritics = c.kashida .. c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.superalef,
from = {"ٱ"},
to = {"ا"}
},
},
}
m["se"] = {
"Northern Sami",
33947,
"smi",
"Latn",
display_text = {
from = {"'"},
to = {"ˈ"}
},
strip_diacritics = {remove_diacritics = c.macron .. c.dotbelow .. "'ˈ"},
sort_key = {
from = {"á", "č", "đ", "ŋ", "š", "ŧ", "ž"},
to = {"a" .. p[1], "c" .. p[1], "d" .. p[1], "n" .. p[1], "s" .. p[1], "t" .. p[1], "z" .. p[1]}
},
standard_chars = "AaÁáBbCcČčDdĐđEeFfGgHhIiJjKkLlMmNnŊŋOoPpRrSsŠšTtŦŧUuVvZzŽž" .. c.punc,
}
m["sg"] = {
"Sango",
33954,
"crp",
"Latn",
ancestors = "ngb",
}
m["sh"] = {
"Serbo-Croatian",
9301,
"zls",
"Latn, Cyrl, Glag, Arab",
ietf_subtag = "hbs", -- ISO 639-3 code, since "sh" is deprecated from ISO 639-1
wikimedia_codes = "sh, bs, hr, sr",
strip_diacritics = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"Ć", "ć", "Ś", "ś", "Ź", "ź"}
},
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"З́", "з́", "С́", "с́"}
},
},
sort_key = {
Latn = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"ć", "ś", "ź"},
from = {"č", "ć", "dž", "đ", "lj", "nj", "š", "ś", "ž", "ź"},
to = {"c" .. p[1], "c" .. p[2], "d" .. p[1], "d" .. p[2], "l" .. p[1], "n" .. p[1], "s" .. p[1], "s" .. p[2], "z" .. p[1], "z" .. p[2]}
},
Cyrl = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {"з́", "с́"},
from = {"ђ", "з́", "ј", "љ", "њ", "с́", "ћ", "џ"},
to = {"д" .. p[1], "з" .. p[1], "и" .. p[1], "л" .. p[1], "н" .. p[1], "с" .. p[1], "т" .. p[1], "ч" .. p[1]}
},
},
standard_chars = {
Latn = "AaBbCcČčĆćDdĐđEeFfGgHhIiJjKkLlMmNnOoPpRrSsŠšTtUuVvZzŽž",
Cyrl = "АаБбВвГгДдЂђЕеЖжЗзИиЈјКкЛлЉљМмНнЊњОоПпРрСсТтЋћУуФфХхЦцЧчЏџШш",
c.punc
},
}
m["si"] = {
"सिंहली",
13267,
"inc-ins",
"Sinh",
translit = "si-translit",
override_translit = true,
}
m["sk"] = {
"स्लोवाक",
9058,
"zlw",
"Latn",
ancestors = "zlw-osk",
sort_key = {remove_diacritics = c.acute .. c.circ .. c.diaer .. c.caron},
standard_chars = "AaÁáÄäBbCcČčDdĎďEeÉéFfGgHhIiÍíJjKkLlĹ弾MmNnŇňOoÓóÔôPpRrŔŕSsŠšTtŤťUuÚúVvYyÝýZzŽž" .. c.punc,
}
m["sl"] = {
"स्लोवेन",
9063,
"zls",
"Latn",
strip_diacritics = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.dgrave .. c.invbreve .. c.dotbelow,
remove_exceptions = {"Ć", "ć", "Ǵ", "ǵ", "Ś", "ś", "Ź", "ź"},
from = {"Ə", "ə", "Ł", "ł"},
to = {"E", "e", "L", "l"},
},
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dotabove .. c.ringabove .. c.dgrave .. c.invbreve .. c.dotbelow .. c.ringbelow .. c.ogonek,
remove_exceptions = {"ć", "ǵ", "ś", "ź"},
from = {"ä", "č", "ć", "đ", "ə", "ë", "ǧ", "ǵ", "ï", "ł", "ö", "š", "ś", "ü", "ž", "ź"},
to = {"a" .. p[1], "c" .. p[1], "c" .. p[2], "d" .. p[1], "e", "e" .. p[1], "g" .. p[1], "g" .. p[2], "i" .. p[1], "l", "o" .. p[1], "s" .. p[1], "s" .. p[2], "u" .. p[1], "z" .. p[1], "z" .. p[2]},
},
standard_chars = "AaBbCcČčDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsŠšTtUuVvZzŽž" .. c.punc,
}
m["sm"] = {
"Samoan",
34011,
"poz-pnp",
"Latn",
}
m["sn"] = {
"Shona",
34004,
"bnt-sho",
"Latn",
strip_diacritics = {remove_diacritics = c.acute},
}
m["so"] = {
"Somali",
13275,
"cus-som",
"Latn, Arab, Osma",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ}
},
}
m["sq"] = {
"Albanian",
8748,
"sqj",
"Latn, Grek, Arab, Elba, Todr, Vith",
translit = {
Elba = "Elba-translit",
Vith = "Vith-translit",
},
-- Grek display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
strip_diacritics = {
Latn = {
remove_diacritics = c.acute .. c.circ .. c.macron,
from = {'^[ie] (%w)', '^të (%w)'}, to = {'%1', '%1'},
},
},
sort_key = {
Latn = {
remove_diacritics = c.acute .. c.circ .. c.macron .. c.tilde .. c.breve .. c.caron,
from = {'^[ie] (%w)', '^të (%w)', 'ç', 'dh', 'ë', 'gj', 'll', 'nj', 'rr', 'sh', 'th', 'xh', 'zh'},
to = {'%1', '%1', 'c'..p[1], 'd'..p[1], 'e'..p[1], 'g'..p[1], 'l'..p[1], 'n'..p[1], 'r'..p[1], 's'..p[1], 't'..p[1], 'x'..p[1], 'z'..p[1]},
}
-- TODO: Grek if the default sort key is unsuitable
},
standard_chars = {
Latn = "AaBbCcÇçDdEeËëFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvXxYyZz",
c.punc
},
}
m["ss"] = {
"Swazi",
34014,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["st"] = {
"Sotho",
34340,
"bnt-sts",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["su"] = {
"Sundanese",
34002,
"poz-msa",
"Latn, Sund, Arab",
ancestors = "osn",
translit = {
Sund = "Sund-translit"
},
}
m["sv"] = {
"स्वीडिश",
9027,
"gmq-eas",
"Latn",
ancestors = "gmq-osw-lat",
sort_key = {
remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron .. c.dacute .. c.caron .. c.cedilla .. "':",
remove_exceptions = {"å"},
from = {"ø", "æ", "œ", "ß", "ꜩ", "å", "aͤ", "oͤ"},
to = {"ö", "ae", "oe", "ss", "tz", "z" .. p[1], "ä", "ö"}
},
standard_chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpRrSsTtUuVvXxYyÅåÄäÖö" .. c.punc,
}
m["sw"] = {
"Swahili",
7838,
"bnt-swh",
"Latn, Arab",
sort_key = {
Latn = {
from = {"ng'"},
to = {"ng" .. p[1]}
},
},
}
m["ta"] = {
"तमिल",
5885,
"dra-tam",
"Taml",
ancestors = "ta-mid",
translit = "ta-translit",
override_translit = true,
}
m["te"] = {
"तेलुगु",
8097,
"dra-tel",
"Telu",
translit = "te-translit",
override_translit = true,
}
m["tg"] = {
"Tajik",
9260,
"ira-swi",
"Cyrl, Arab, Latn",
ancestors = "fa-cls",
translit = {
Cyrl = "tg-translit"
},
override_translit = true,
strip_diacritics = {
Cyrl = s["tg-stripdiacritics"],
Latn = s["tg-stripdiacritics"],
},
sort_key = {
Cyrl = {
from = {"ғ", "ё", "ӣ", "қ", "ӯ", "ҳ", "ҷ"},
to = {"г" .. p[1], "е" .. p[1], "и" .. p[1], "к" .. p[1], "у" .. p[1], "х" .. p[1], "ч" .. p[1]}
},
},
}
m["th"] = {
"Thai",
9217,
"tai-swe",
"Thai, Khomt, Brai",
translit = {
Thai = "th-translit"
},
sort_key = {
Thai = "Thai-sortkey"
},
}
m["ti"] = {
"Tigrinya",
34124,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
}
m["tk"] = {
"Turkmen",
9267,
"trk-ogz",
"Latn, Cyrl, Arab",
strip_diacritics = {
Latn = s["tk-stripdiacritics"],
Cyrl = s["tk-stripdiacritics"],
},
sort_key = {
Latn = {
from = {"ç", "ä", "ž", "ň", "ö", "ş", "ü", "ý"},
to = {"c" .. p[1], "e" .. p[1], "j" .. p[1], "n" .. p[1], "o" .. p[1], "s" .. p[1], "u" .. p[1], "y" .. p[1]}
},
Cyrl = {
from = {"ё", "җ", "ң", "ө", "ү", "ә"},
to = {"е" .. p[1], "ж" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "э" .. p[1]}
},
},
ancestors = "trk-eog",
}
m["tl"] = {
"Tagalog",
34057,
"phi",
"Latn, Tglg",
translit = {
Tglg = "tl-translit"
},
override_translit = true,
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.circ}
},
standard_chars = {
Latn = "AaBbKkDdEeGgHhIiLlMmNnOoPpRrSsTtUuWwYy",
c.punc
},
sort_key = {
Latn = "tl-sortkey",
},
}
m["tn"] = {
"Tswana",
34137,
"bnt-sts",
"Latn",
}
m["to"] = {
"Tongan",
34094,
"poz-ton",
"Latn",
strip_diacritics = {remove_diacritics = c.acute},
sort_key = {remove_diacritics = c.macron},
}
m["tr"] = {
"तुर्की",
256,
"trk-ogz",
"Latn",
ancestors = "ota",
dotted_dotless_i = true,
sort_key = {
from = {
-- Ignore circumflex, but account for capital Î wrongly becoming ı + circ due to dotted dotless I logic.
"ı" .. c.circ, c.circ,
"i", -- Ensure "i" comes after "ı".
"ç", "ğ", "ı", "ö", "ş", "ü"
},
to = {
"i", "",
"i" .. p[1],
"c" .. p[1], "g" .. p[1], "i", "o" .. p[1], "s" .. p[1], "u" .. p[1]
}
},
standard_chars = "AaÂâBbCcÇçDdEeFfGgĞğHhIıİiÎîJjKkLlMmNnOoÖöPpRrSsŞşTtUuÛûÜüVvYyZz" .. c.punc,
}
m["ts"] = {
"Tsonga",
34327,
"bnt-tsr",
"Latn",
}
m["tt"] = {
"Tatar",
25285,
"trk-kbu",
"Cyrl, Latn, Arab",
translit = {
Cyrl = "tt-translit",
Arab = "tt-translit"
},
--override_translit = true, -- enable override until Module code can detect Russian loans such as [[аэропорт]]
dotted_dotless_i = true,
sort_key = {
Cyrl = {
from = {"ә", "ў", "ғ", "ё", "җ", "қ", "ң", "ө", "ү", "һ"},
to = {"а" .. p[1], "в" .. p[1], "г" .. p[1], "е" .. p[1], "ж" .. p[1], "к" .. p[1], "н" .. p[1], "о" .. p[1], "у" .. p[1], "х" .. p[1]}
},
Latn = {
from = {
"i", -- Ensure "i" comes after "ı".
"ä", "ə", "ç", "ğ", "ı", "ñ", "ŋ", "ö", "ɵ", "ş", "ü"
},
to = {
"i" .. p[1],
"a" .. p[1], "a" .. p[2], "c" .. p[1], "g" .. p[1], "i", "n" .. p[1], "n" .. p[2], "o" .. p[1], "o" .. p[2], "s" .. p[1], "u" .. p[1]
}
},
},
}
-- "tw" is treated as "ak", see [[WT:LT]]
m["ty"] = {
"Tahitian",
34128,
"poz-pep",
"Latn",
}
m["ug"] = {
"Uyghur",
13263,
"trk-kar",
"Arab, Latn, Cyrl",
ancestors = "chg",
translit = {
Arab = "ug-translit",
Cyrl = "ug-translit",
},
override_translit = true,
}
m["uk"] = {
"युक्रेनियाई",
8798,
"zle",
"Cyrl",
ancestors = "zle-muk",
translit = "uk-translit",
strip_diacritics = {remove_diacritics = c.grave .. c.acute},
sort_key = {
remove_diacritics = c.grave .. c.acute,
from = {
"ї", -- 2 chars
"ґ", "є", "і" -- 1 char
},
to = {
"и" .. p[2],
"г" .. p[1], "е" .. p[1], "и" .. p[1]
}
},
standard_chars = "АаБбВвГгДдЕеЄєЖжЗзИиІіЇїЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЬьЮюЯя" .. c.punc:gsub("'", ""), -- Exclude apostrophe.
}
m["ur"] = {
"उर्दू",
1617,
"inc-hnd",
"Aran, Hebr",
translit = {
Aran = "ur-translit"
},
strip_diacritics = {
Aran = {
-- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"; hamzatu l-waṣli to a regular alif
from = {"هٔ", "ۂ", "ٱ"},
to = {"ہ", "ہ", "ا"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
standard_chars = {
Aran = "ایببپتثجچحخدذرزژسشصضطظعغفقکگلࣇڷمنݨوؤہھئٹڈڑآے",
c.punc,
},
}
m["uz"] = {
"Uzbek",
9264,
"trk-kar",
"Latn, Cyrl, Arab",
ancestors = "chg",
translit = {
Cyrl = "uz-translit"
},
sort_key = {
Latn = {
from = {"oʻ", "gʻ", "sh", "ch", "ng"},
to = {"z" .. p[1], "z" .. p[2], "z" .. p[3], "z" .. p[4], "z" .. p[5]}
},
Cyrl = {
from = {"ё", "ў", "қ", "ғ", "ҳ"},
to = {"е" .. p[1], "я" .. p[1], "я" .. p[2], "я" .. p[3], "я" .. p[4]}
},
},
strip_diacritics = {
Arab = "ar-stripdiacritics",
},
}
m["ve"] = {
"Venda",
32704,
"bnt-bso",
"Latn",
}
m["vi"] = {
"Vietnamese",
9199,
"mkh-vie",
"Latn, Hani",
ancestors = "mkh-mvi",
sort_key = {
Latn = "vi-sortkey",
Hani = "Hani-sortkey",
},
}
m["vo"] = {
"Volapük",
36986,
"art",
"Latn",
}
m["wa"] = {
"Walloon",
34219,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["wo"] = {
"Wolof",
34257,
"alv-fwo",
"Latn, Arab, Gara",
}
m["xh"] = {
"Xhosa",
13218,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
m["yi"] = {
"Yiddish",
8641,
"gmw-hgm",
"Hebr, Latn",
ancestors = "gmh",
translit = {
Hebr = "yi-translit",
},
-- Hebr display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["yo"] = {
"Yoruba",
34311,
"alv-yor",
"Latn, Arab",
strip_diacritics = {
Latn = {remove_diacritics = c.grave .. c.acute .. c.macron}
},
sort_key = {
Latn = {
from = {"ẹ", "ɛ", "gb", "ị", "kp", "ọ", "ɔ", "ṣ", "sh", "ụ"},
to = {"e" .. p[1], "e" .. p[1], "g" .. p[1], "i" .. p[1], "k" .. p[1], "o" .. p[1], "o" .. p[1], "s" .. p[1], "s" .. p[1], "u" .. p[1]}
},
},
}
m["za"] = {
"झुआंग",
13216,
"tai",
"Latn, Hani",
sort_key = {
Latn = "za-sortkey",
Hani = "Hani-sortkey",
},
}
m["zh"] = {
"चीनी",
7850,
"zhx",
"Hants, Latn, Bopo, Nshu, Brai",
ancestors = "ltc",
generate_forms = "zh-generateforms",
translit = {
Hani = "zh-translit",
Bopo = "zh-translit",
},
sort_key = {
Hani = "Hani-sortkey"
},
}
m["zu"] = {
"Zulu",
10179,
"bnt-ngu",
"Latn",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.macron .. c.caron},
}
return require("Module:languages").finalizeData(m, "भाषा")
19j8jmmlgot05xr10hnwfvegqcfw2lj
मॉड्यूल:languages/canonical names.json
828
304628
487882
487552
2026-09-03T10:17:09Z
SM7
6218
updating...
487882
json
application/json
{
"'Are'are": "alu",
"A'ou": "aou",
"A-Hmao": "hmd",
"A-Pucikwar": "apq",
"Aari": "aiw",
"Aasax": "aas",
"Aba": "utp",
"Abaga": "abg",
"Abai": "poz-abi",
"Abai Sungai": "abf",
"Abanyom": "abm",
"Abau": "aau",
"Abaza": "abq",
"Abenaki": "abe",
"Abenlen Ayta": "abp",
"Abidji": "abi",
"Abinomn": "bsa",
"Abipon": "axb",
"Abishira": "ash",
"Abkhaz": "ab",
"Abom": "aob",
"Abon": "abo",
"Abron": "abr",
"Abu": "ado",
"Abu' Arapesh": "aah",
"Abua": "abn",
"Abui": "abz",
"Abun": "kgr",
"Abung": "abl",
"Abure": "abu",
"Abureni": "mgj",
"Abé": "aba",
"Acatepec Me'phaa": "tpx",
"Acehnese": "ace",
"Achagua": "aca",
"Achang": "acn",
"Ache": "yif",
"Acheron": "acz",
"Achi": "acr",
"Acholi": "ach",
"Achuar": "acu",
"Achumawi": "acv",
"Aché": "guq",
"Acroá": "acs",
"Adabe": "adb",
"Adai": "xad",
"Adamorobe Sign Language": "ads",
"Adang": "adn",
"Adangbe": "adq",
"Adangme": "ada",
"Adap": "adp",
"Adasen": "tiu",
"Adele": "ade",
"Adhola": "adh",
"Adi": "adi",
"Adioukrou": "adj",
"Adithinngithigh": "dth",
"Adivasi Oriya": "ort",
"Adiwasi Garasia": "gas",
"Adja": "ajg",
"Adnyamathanha": "adt",
"Adonara": "adr",
"Aduge": "adu",
"Adyghe": "ady",
"Adzera": "adz",
"Aeka": "aez",
"Aekyom": "awi",
"Aequian": "xae",
"Aer": "aeq",
"Afade": "aal",
"Afar": "aa",
"Afghan Sign Language": "afg",
"Afitti": "aft",
"Afra": "ulf",
"Afrihili": "afh",
"Afrikaans": "af",
"Afro-Seminole Creole": "afs",
"Agarabi": "agd",
"Agariya": "agi",
"Agatu": "agc",
"Agavotaguerra": "avo",
"Agawam": "alg-aga",
"Aghem": "agq",
"Aghu": "ahh",
"Aghu Tharrnggala": "gtu",
"Aghul": "agx",
"Aghwan": "xag",
"Agi": "aif",
"Agob": "kit",
"Agoi": "ibm",
"Aguacateca": "agu",
"Aguano": "aga",
"Aguaruna": "agr",
"Aguna": "aug",
"Agusan Manobo": "msm",
"Agutaynen": "agn",
"Agwagwune": "yay",
"Ahanta": "aha",
"Ahirani": "ahr",
"Ahom": "aho",
"Ahtna": "aht",
"Ahwai": "nfd",
"Ai-Cham": "aih",
"Aighon": "aix",
"Aikanã": "tba",
"Aiklep": "mwg",
"Aimele": "ail",
"Aimol": "aim",
"Ainbai": "aic",
"Ainu": "ain",
"Aiome": "aki",
"Airoran": "air",
"Aisi": "mmq",
"Aiton": "aio",
"Aiwoo": "nfl",
"Aja": "aja",
"Ajagua": "sai-ajg",
"Ajawa": "ajw",
"Ajië": "aji",
"Ajyíninka Apurucayali": "cpc",
"Ak": "akq",
"Aka (Central Africa)": "axk",
"Aka (Sudan)": "soh",
"Aka-Bea": "abj",
"Aka-Bo": "akm",
"Aka-Cari": "aci",
"Aka-Kede": "akx",
"Aka-Kol": "aky",
"Aka-Kora": "ack",
"Akan": "ak",
"Akar-Bale": "acl",
"Akaselem": "aks",
"Akatek": "knj",
"Akawaio": "ake",
"Ake": "aik",
"Akebu": "keu",
"Akei": "tsr",
"Akeu": "aeu",
"Akha": "ahk",
"Akhvakh": "akv",
"Akkadian": "akk",
"Akkala Sami": "sia",
"Aklanon": "akl",
"Akolet": "akt",
"Akoose": "bss",
"Akoye": "miw",
"Akpa": "akf",
"Akpes": "ibe",
"Akrukay": "afi",
"Akuku": "ayk",
"Akum": "aku",
"Akuntsu": "aqz",
"Akurio": "ako",
"Akuwagel": "bey",
"Akwa": "akw",
"Akyaung Ari": "nqy",
"Al-Sayyid Bedouin Sign Language": "syy",
"Alaba": "alw",
"Alabama": "akz",
"Alabat Island Agta": "dul",
"Alacatlatzala Mixtec": "mim",
"Alago": "ala",
"Alagwa": "wbj",
"Alak": "alk",
"Alamblak": "amp",
"Alangan": "alj",
"Alapmunte": "apv",
"Alas-Kluet Batak": "btz",
"Alawa": "alh",
"Alazapa": "nai-ala",
"Albanian": "sq",
"Albanian Sign Language": "sqk",
"Alcozauca Mixtec": "xta",
"Alege": "alf",
"Alekano": "gah",
"Alemannic German": "gsw",
"Aleut": "ale",
"Algerian Arabic": "arq",
"Algerian Sign Language": "asp",
"Algonquin": "alq",
"Ali": "aiy",
"Alladian": "ald",
"Allar": "all",
"Allentiac": "sai-all",
"Alngith": "aid",
"Alo Phola": "ypo",
"Alor": "aol",
"Aloápam Zapotec": "zaq",
"Alsea": "aes",
"Alu": "mte",
"Alu Kurumba": "xua",
"Alugu": "aub",
"Alumu-Tesu": "aab",
"Alune": "alp",
"Alungul": "aus-alu",
"Aluo": "yna",
"Alur": "alz",
"Alutiiq": "ems",
"Alutor": "alr",
"Alviri-Vidari": "avd",
"Alyawarr": "aly",
"Ama": "amm",
"Amahai": "amq",
"Amahuaca": "amc",
"Amaimon": "ali",
"Amal": "aad",
"Amanab": "amn",
"Amanayé": "ama",
"Amara": "aie",
"Amarakaeri": "amr",
"Amarasi": "aaz",
"Amarizana": "awd-ama",
"Amasi": "alv-ama",
"Amatlán Zapotec": "zpo",
"Amba": "rwm",
"Ambai": "amk",
"Ambakich": "aew",
"Ambala Ayta": "abc",
"Ambelau": "amv",
"Ambele": "ael",
"Amblong": "alm",
"Ambo": "amb",
"Ambonese Malay": "abs",
"Ambrak": "aag",
"Ambul": "apo",
"Ambulas": "abt",
"Amdang": "amj",
"Amele": "aey",
"American Sign Language": "ase",
"Amganad Ifugao": "ifa",
"Amharic": "am",
"Ami": "amy",
"Amis": "ami",
"Ammonite": "sem-amm",
"Amo": "amo",
"Amol": "alx",
"Amoltepec Mixtec": "mbz",
"Amondawa": "adw",
"Amorite": "sem-amo",
"Ampanang": "apg",
"Ampari Dogon": "aqd",
"Amri Karbi": "ajz",
"Amto": "amt",
"Amurdag": "amg",
"Ana Tinga Dogon": "dti",
"Anaang": "anw",
"Anakalangu": "akg",
"Anal": "anm",
"Anam": "pda",
"Anambé": "aan",
"Anamgura": "imi",
"Anasi": "bpo",
"Anauyá": "awd-ana",
"Ancient Greek": "grc",
"Ancient Ligurian": "xlg",
"Ancient Macedonian": "xmk",
"Ancient North Arabian": "xna",
"Ancient Zapotec": "xzp",
"Andai": "afd",
"Andajin": "ajn",
"Andalusian Arabic": "xaa",
"अंडमान क्रियोल हिंदी": "hca",
"Andaqui": "ana",
"Andarum": "aod",
"Andegerebinha": "adg",
"Andh": "anr",
"Andi": "ani",
"Andio": "bzb",
"Andjingith": "aus-and",
"Andoa": "anb",
"Andoque": "ano",
"Andoquero": "sai-and",
"Andra-Hus": "anx",
"Aneityum": "aty",
"Anem": "anz",
"Aneme Wake": "aby",
"Anfillo": "myo",
"Angaataha": "agm",
"Angaité": "aqt",
"Angal": "age",
"Angal Enen": "aoe",
"Angal Heneng": "akh",
"Angami": "njm",
"Angevin": "roa-ang",
"Angguruk Yali": "yli",
"Angika": "anp",
"Angkamuthi": "avm",
"Angkola Batak": "akb",
"Angkula": "aus-ang",
"Angloromani": "rme",
"Angolar": "aoa",
"Angor": "agg",
"Angoram": "aog",
"Angosturas Tunebo": "tnd",
"Anguthimri": "awg",
"Ani Phowa": "ypn",
"Anii": "blo",
"Animere": "anf",
"Anindilyakwa": "aoi",
"Anjam": "boj",
"Ankave": "aak",
"Anmatyerre": "amx",
"Annobonese": "fab",
"Anong": "nun",
"Anor": "anj",
"Anserma": "ans",
"Ansus": "and",
"Antakarinya": "ant",
"Antigua and Barbuda Creole English": "aig",
"Antillean Creole": "gcf",
"Anu": "anl",
"Anuak": "anu",
"Anufo": "cko",
"Anuki": "aui",
"Anus": "auq",
"Anuta": "aud",
"Anyi": "any",
"Anyin Morofo": "mtb",
"Ao": "njo",
"Aoheng": "pni",
"Aore": "aor",
"Ap Ma": "kbx",
"Apalachee": "xap",
"Apalaí": "apy",
"Apali": "ena",
"Apasco-Apoala Mixtec": "mip",
"Apatani": "apt",
"Apiaká": "api",
"Apinayé": "apn",
"Apma": "app",
"Apolista": "awd-apo",
"Aproumu Aizi": "ahp",
"Apurinã": "apu",
"Aputai": "apx",
"Aquitanian": "xaq",
"Arabana": "ard",
"Arabela": "arl",
"Arabic": "ar",
"Aragonese": "an",
"Araki": "akr",
"Arakwal": "rkw",
"Aralle-Tabulahan": "atq",
"Aramaic": "arc",
"Arammba": "stk",
"Aranadan": "aaf",
"Aranama-Tamique": "xrt",
"Arandai": "jbj",
"Araona": "aro",
"Arapaho": "arp",
"Arapaso": "arj",
"Arara-Karo": "arr",
"Ararandewára": "xaj",
"Arawak": "arw",
"Araweté": "awt",
"Arawum": "awm",
"Arbore": "arv",
"Archi": "aqc",
"Ardhamagadhi Prakrit": "pka",
"Are": "mwc",
"Areba": "aea",
"Arem": "aem",
"Argentine Sign Language": "aed",
"Argobba": "agj",
"Arguni": "agf",
"Arhuaco": "arh",
"Arhâ": "aqr",
"Arhö": "aok",
"Ari": "aac",
"Aribwatsa": "laz",
"Aribwaung": "ylu",
"Arifama-Miniafia": "aai",
"Arigidi": "aqg",
"Arikapú": "ark",
"Arikara": "ari",
"Arikem": "ait",
"Arin": "xrn",
"Aringa": "luc",
"Armazic": "xrm",
"Armenian": "hy",
"Armenian Sign Language": "aen",
"Aromanian": "rup",
"Arop-Lokep": "apr",
"Arop-Sissano": "aps",
"Arosi": "aia",
"Arritinngithigh": "rrt",
"Arta": "atz",
"Arua": "aru",
"Aruamu": "msy",
"Aruek": "aur",
"Aruop": "lsr",
"Arutani": "atx",
"Aruá": "arx",
"As": "asz",
"Asaro'o": "mtv",
"Ashe": "ahs",
"Ashkun": "ask",
"Asho Chin": "csh",
"Ashokan Prakrit": "inc-ash",
"Ashraaf": "cus-ash",
"Asháninka": "cni",
"Ashéninka Pajonal": "cjo",
"Ashéninka Perené": "prq",
"Asi": "bno",
"Asilulu": "asl",
"Askopan": "eiv",
"Asoa": "asv",
"असमिया": "as",
"Assan": "xss",
"Assangori": "sjg",
"Assiniboine": "asb",
"Assyrian Neo-Aramaic": "aii",
"Asturian": "ast",
"Asu": "aum",
"Asue Awyu": "psa",
"Asumboa": "aua",
"Asunción Mixtepec Zapotec": "zoo",
"Asuri": "asr",
"Ata": "atm",
"Ata Manobo": "atd",
"Atakapa": "aqp",
"Atampaya": "amz",
"Atanques": "cba-ata",
"Atatláhuca Mixtec": "mib",
"Atayal": "tay",
"Atemble": "ate",
"Ateso": "teo",
"Athpare": "aph",
"Ati": "atk",
"Atikamekw": "atj",
"Atohwaim": "aqm",
"Atong (Cameroon)": "ato",
"Atong (India)": "aot",
"Atorada": "aox",
"Atsahuaca": "atc",
"Atsam": "cch",
"Atsugewi": "atw",
"Attapady Kurumba": "pkr",
"Attié": "ati",
"Au": "avt",
"Auhelawa": "kud",
"Aukan": "djk",
"Aulua": "aul",
"Aurá": "aux",
"Aushi": "auh",
"Aushiri": "avs",
"Auslan": "asf",
"Austral": "aut",
"Australian Aboriginal Sign Language": "asw",
"Austrian Sign Language": "asq",
"Austronesian Mari": "hob",
"Auwe": "smf",
"Auyana": "auy",
"Auye": "auu",
"Auyokawa": "auo",
"Avar": "av",
"Avatime": "avn",
"Avau": "avb",
"Avava": "tmb",
"Avestan": "ae",
"Avikam": "avi",
"Avokaya": "avu",
"Avá-Canoeiro": "avv",
"Awa (China)": "vwa",
"Awa (New Guinea)": "awb",
"Awa-Cuaiquer": "kwi",
"Awabakal": "awk",
"Awadhi": "awa",
"Awak": "awo",
"Awar": "aya",
"Awara": "awx",
"Awbono": "awh",
"Aweer": "bob",
"Awera": "awr",
"Awetí": "awe",
"Awing": "azo",
"Awjila": "auj",
"Awngi": "awn",
"Awngthim": "gwm",
"Awtuw": "kmn",
"Awu": "yiu",
"Awun": "aww",
"Awutu": "afu",
"Awyi": "auw",
"Axamb": "ahb",
"Axi Yi": "yix",
"Ayabadhu": "ayd",
"Ayautla Mazatec": "vmy",
"Ayere": "aye",
"Ayerrerenge": "axe",
"Ayi": "ayq",
"Ayizi": "yyz",
"Ayizo": "ayb",
"Aymara": "ay",
"Aynu": "aib",
"Ayomán": "sai-ayo",
"Ayoquesco Zapotec": "zaf",
"Ayoreo": "ayo",
"Ayu": "ayu",
"Ayutla Mixtec": "miy",
"Azerbaijani": "az",
"Azha": "aza",
"Azhe": "yiz",
"Azoyú Me'phaa": "tpc",
"Baa": "kwb",
"Baagandji": "drl",
"Baan": "bvj",
"Baangi": "bqx",
"Baatonum": "bba",
"Baba": "bbw",
"Baba Malay": "mbf",
"Babango": "bbm",
"Babanki": "bbk",
"Babatana": "baa",
"Babine-Witsuwit'en": "bcr",
"Babole": "bvx",
"Babungo": "bav",
"Babuza": "bzg",
"Bacama": "bcy",
"Bacanese Malay": "btj",
"Bactrian": "xbc",
"Bada": "bhz",
"Badaga": "bfq",
"Badanchi": "bau",
"Bade": "bde",
"Badeshi": "bdz",
"Badimaya": "bia",
"Badui": "bac",
"Badyara": "pbp",
"Baeggu": "bvd",
"Baekje": "pkc",
"Baelelea": "bvc",
"Baenan": "sai-bae",
"Baetora": "btr",
"Bafanji": "bfj",
"Bafaw": "bwt",
"Bafia": "ksf",
"Bafut": "bfd",
"Baga Kaloum": "bqf",
"Baga Koga": "bgo",
"Baga Manduri": "bmd",
"Baga Pokur": "bcg",
"Baga Sitemu": "bsp",
"Baga Sobané": "bsv",
"Bagheli": "bfy",
"Bagirmi": "bmi",
"Bago-Kusuntu": "bqg",
"Bagri": "bgq",
"Bagua": "sai-bag",
"Bagupi": "bpi",
"Bagusa": "bqb",
"Bagvalal": "kva",
"Baha": "yha",
"Baham": "bdw",
"Bahamian Creole": "bah",
"Baharna Arabic": "abv",
"Bahau": "bhv",
"Bahinemo": "bjh",
"Bahing": "bhj",
"Bahnar": "bdq",
"Bahonsuai": "bsu",
"Bai": "bdj",
"Baibai": "bbf",
"Baikeno": "bkx",
"Baima": "bqh",
"Baimak": "bmx",
"Bainouk-Gunyaamolo": "bcz",
"Bainouk-Gunyuño": "bab",
"Bainouk-Samik": "bcb",
"Baiso": "bsw",
"Baissa Fali": "fah",
"Bajan": "bjs",
"Bajelani": "bjm",
"Baka": "bkc",
"Bakairí": "bkq",
"Bakaka": "bqz",
"Bakhtiari": "bqi",
"Baki": "bki",
"Bakoko": "bkh",
"Bakole": "kme",
"Bakpinka": "bbs",
"Bakulung": "bbu",
"Bakumpai": "bkr",
"Bakung": "xkl",
"Bakwé": "bjw",
"Balaesang": "bls",
"Balangao": "blw",
"Balangingi": "sse",
"Balanta-Ganja": "bjt",
"Balanta-Kentohe": "ble",
"Balantak": "blz",
"Balau": "blg",
"Baldemu": "bdn",
"Bali": "bcp",
"Baliledo": "poz-bal",
"Balinese": "ban",
"Balinese Malay": "mhp",
"Balkan Gagauz Turkish": "bgx",
"Balkan Romani": "rmn",
"Balo": "bqo",
"Baloi": "biz",
"Balong": "bnt-bal",
"Balti": "bft",
"Baltic Romani": "rml",
"Baluan-Pam": "blq",
"Baluchi": "bal",
"Bamako Sign Language": "bog",
"Bamali": "bbq",
"Bambalang": "bmo",
"Bambam": "ptu",
"Bambara": "bm",
"Bambassi": "myf",
"Bambili-Bambui": "baw",
"Bamenyam": "bce",
"Bamu": "bcf",
"Bamukumbit": "bqt",
"Bamum": "bax",
"Bamunka": "bvm",
"Bamwe": "bmg",
"Ban Khor Sign Language": "bfk",
"Bana": "bcw",
"Banam Bay": "vrt",
"Banao Itneg": "bjx",
"Banaro": "byz",
"Banda": "bnd",
"Banda Malay": "bpq",
"Banda-Bambari": "liy",
"Banda-Banda": "bpd",
"Banda-Mbrès": "bqk",
"Banda-Ndélé": "bfl",
"Banda-Yangere": "yaj",
"Bandi": "bza",
"Bandial": "bqj",
"Bandjalang": "bdy",
"Bangala": "bxg",
"Bangandu": "bgf",
"Bangba": "bbe",
"Banggai": "bgz",
"Bangi": "bni",
"Bangime": "dba",
"Bangka": "mfb",
"Bangolan": "bgj",
"Bangubangu": "bnx",
"Bangwinji": "bsj",
"Baniva": "bvv",
"Baniwa": "bwi",
"Banjarese": "bjn",
"Banka": "bxw",
"Bankan Tey Dogon": "dbw",
"Bankon": "abb",
"Banoni": "bcm",
"Bantawa": "bap",
"Bantayanon": "bfx",
"Bantik": "bnq",
"Banyumasan": "map-bms",
"Baoule": "bci",
"Baraamu": "brd",
"Barai": "bbb",
"Barakai": "baj",
"Baram Kayan": "kys",
"Barama": "bbg",
"Barambu": "brm",
"Baramu": "bmz",
"Barapasi": "brp",
"Baras": "brs",
"Barasana": "bsn",
"Barbareño": "boi",
"Barclayville Grebo": "gry",
"Bardi": "bcj",
"Barein": "bva",
"Bargam": "mlp",
"Bari": "bfa",
"Bariai": "bch",
"Bariji": "bjc",
"Barikanchi": "bxo",
"Barikewa": "jbk",
"Barngarla": "bjb",
"Barok": "bjk",
"Barombi": "bbi",
"Barranbinya": "aus-bra",
"Barro Negro Tunebo": "tbn",
"Barrow Point": "bpt",
"Baruga": "bjz",
"Barunggam": "aus-brm",
"Baruya": "byr",
"Barwe": "bwg",
"Barzani Jewish Neo-Aramaic": "bjf",
"Baré": "bae",
"Barí": "mot",
"Basa": "bzw",
"Basa-Gumna": "bsl",
"Basa-Gurmana": "buj",
"Basaa": "bas",
"Basap": "bdb",
"Basay": "byq",
"Bashkardi": "bsg",
"Bashkir": "ba",
"Basketo": "bst",
"Basque": "eu",
"Bassa": "bsq",
"Bassa-Kontagora": "bsr",
"Bassari": "bsc",
"Bassossi": "bsi",
"Bata": "bta",
"Bataan Ayta": "ayt",
"Batad Ifugao": "ifb",
"Batanga": "bnm",
"Batek": "btq",
"Bateri": "btv",
"Bathari": "bhm",
"Bati (Cameroon)": "btc",
"Bati (Indonesia)": "bvt",
"Bats": "bbl",
"Batu": "btu",
"Batui": "zbt",
"Batuley": "bay",
"Bau": "bbd",
"Bau Bidayuh": "sne",
"Bauchi": "bsf",
"Baure": "brg",
"Bauria": "bge",
"Bauro": "bxa",
"Bauwaki": "bwk",
"Bauzi": "bvz",
"Bavarian": "bar",
"Bawm Chin": "bgr",
"Bay Miwok": "mkq",
"Bayali": "bjy",
"Baybayanon": "bvy",
"Baygo": "byg",
"Bayogoula": "nai-bay",
"Bayono": "byl",
"Bayot": "bda",
"Bayungu": "bxj",
"Bazigar": "bfr",
"Baïnounk Gubëeher": "alv-bgu",
"Beami": "beo",
"Beaver": "bea",
"Beba": "bfp",
"Bebe": "bzv",
"Bebele": "beb",
"Bebeli": "bek",
"Bebil": "bxp",
"Bedik": "tnr",
"Bedjond": "bjv",
"Bedoanas": "bed",
"Beeke": "bkf",
"Beele": "bxq",
"Beembe": "beq",
"Beezen": "bnz",
"Befang": "bby",
"Begbere-Ejar": "bqv",
"Beja": "bej",
"Bekati'": "bei",
"Bekwarra": "bkv",
"Bekwel": "bkw",
"Belait": "beg",
"Belanda Bor": "bxb",
"Belanda Viri": "bvi",
"Belarusian": "be",
"Belhariya": "byw",
"Beli": "blm",
"Belizean Creole": "bzj",
"Bella Coola": "blc",
"Bellari": "brw",
"Bemba": "bem",
"Bembe": "bmb",
"Ben Tey": "dbt",
"Bena": "yun",
"Benabena": "bef",
"Bench": "bcq",
"Bende": "bdp",
"Bendi": "bct",
"Beneraf": "bnv",
"Beng": "nhb",
"Benga": "bng",
"बंगाली": "bn",
"Benggoi": "bgy",
"Bengkala Sign Language": "bqy",
"Bentong": "bnu",
"Benyadu'": "byd",
"Beothuk": "bue",
"Bepour": "bie",
"Bera": "brf",
"Berakou": "bxv",
"Berau Malay": "bve",
"Berawan": "lod",
"Berbice Creole Dutch": "brc",
"Bergish": "gmw-bgh",
"Berik": "bkl",
"Berinomo": "bit",
"Berom": "bom",
"Berta": "wti",
"Berti": "byt",
"Besisi": "mhe",
"Besme": "bes",
"Besoa": "bep",
"Betaf": "bfe",
"Betawi": "bew",
"Bete": "byf",
"Bete-Bendi": "btt",
"Betoi": "sai-bet",
"Betta Kurumba": "xub",
"Bezhta": "kap",
"Bhadrawahi": "bhd",
"Bhalay": "bhx",
"Bharia": "bha",
"Bhatri": "bgw",
"Bhattiyali": "bht",
"Bhaya": "bhe",
"Bhele": "bhy",
"Bhilali": "bhi",
"Bhili": "bhb",
"भोजपुरी": "bho",
"Bhoti Kinnauri": "nes",
"Bhunjia": "bhu",
"Biafada": "bif",
"Biage": "bdf",
"Biak": "bhw",
"Biali": "beh",
"Bian Marind": "bpv",
"Biangai": "big",
"Biao": "byk",
"Biao Mon": "bmt",
"Biao-Jiao Mien": "bje",
"Biatah Bidayuh": "bth",
"Bibaali": "bcn",
"Bibbulman": "xbp",
"Bidiyo": "bid",
"Bidyara": "bym",
"Bidyogo": "bjg",
"Biem": "bmc",
"Bierebo": "bnk",
"Bieria": "brj",
"Biete": "biu",
"Big Nambas": "nmb",
"Biga": "bhc",
"Bigambal": "xbe",
"Bih": "ibh",
"बिहारी": "bh",
"Bijori": "bix",
"Bikaru": "bic",
"Bikol Central": "bcl",
"Bikya": "byb",
"Bila": "bip",
"Bilakura": "bql",
"Bilaspuri": "kfs",
"Bilba": "bpz",
"Bilbil": "brz",
"Bile": "bil",
"Biliau": "bcu",
"Biloxi": "bll",
"Bilua": "blb",
"Bilur": "bxf",
"Bima": "bhp",
"Bimin": "bhl",
"Bimoba": "bim",
"Bina": "bmn",
"Binahari": "bxz",
"Binandere": "bhg",
"Binawa": "byj",
"Bindal": "xbd",
"Bine": "bon",
"Binji": "bpj",
"Binongan Itneg": "itb",
"Bintauna": "bne",
"Bintulu": "bny",
"Binukid": "bkd",
"Binumarien": "bjr",
"Bipi": "biq",
"Birao": "brr",
"Birgid": "brk",
"Birgit": "btf",
"Birhor": "biy",
"Biri": "bzr",
"Biritai": "bqq",
"Birri": "bvq",
"Birrpayi": "xbj",
"Birwa": "brl",
"Biseni": "ije",
"Bishnupriya Manipuri": "bpy",
"Bishuo": "bwh",
"Bisis": "bnw",
"Bislama": "bi",
"Bisorio": "bir",
"Bissa": "bib",
"Bisu": "bzi",
"Bit": "bgk",
"Bitare": "brt",
"Bitur": "mcc",
"Biwat": "bwm",
"Biyo": "byo",
"Biyom": "bpm",
"Blablanga": "blp",
"Black Speech": "art-bsp",
"Blackfoot": "bla",
"Blafe": "bfh",
"Blagar": "beu",
"Blang": "blr",
"Blin": "byn",
"Bo": "bgl",
"Bo-Rukul": "mae",
"Bo-Ung": "mux",
"Boano (Maluku)": "bzn",
"Boano (Sulawesi)": "bzl",
"Bobongko": "bgb",
"Bobot": "bty",
"Bodo (Central Africa)": "boy",
"Bodo (India)": "brx",
"Bodo Gadaba": "gbj",
"Bodo Parja": "bdv",
"Bofi": "bff",
"Boga": "bvw",
"Bogaya": "boq",
"Boghom": "bux",
"Boguru": "bqu",
"Bohtan Neo-Aramaic": "bhn",
"Boikin": "bzf",
"Bokar": "sit-bok",
"Bokha": "ybk",
"Boko": "bqc",
"Bokobaru": "bus",
"Bokoto": "bdt",
"Bokyi": "bky",
"Bola": "bnp",
"Bolak": "art-blk",
"Bolango": "bld",
"Bole": "bol",
"Bolgo": "bvo",
"Bolia": "bli",
"Bolinao": "smk",
"Bolivian Sign Language": "bvl",
"Boloki": "bkt",
"Bolon": "bof",
"Bolondo": "bzm",
"Bolongan": "blj",
"Bolyu": "ply",
"Bom": "bmf",
"Boma Nkuu": "bnt-bon",
"Boma Yumu": "bnt-boy",
"Bomboli": "bml",
"Bomboma": "bws",
"Bomitaba": "zmx",
"Bomu": "bmq",
"Bomwali": "bmw",
"Bon Gula": "glc",
"Bonan": "peh",
"Bondei": "bou",
"Bondo": "bfw",
"Bondoukou Kulango": "kzc",
"Bondum Dom Dogon": "dbu",
"Bonerate": "bna",
"Bonggi": "bdg",
"Bonggo": "bpg",
"Bongili": "bui",
"Bongo": "bot",
"Bongu": "bpu",
"Bonjo": "bok",
"Bonkeng": "bvg",
"Bonkiman": "bop",
"Bookan": "bnb",
"Boon": "bnl",
"Boor": "bvf",
"Bora": "boa",
"Border Kuna": "kvn",
"Borei": "gai",
"Boro": "xxb",
"Borong": "ksr",
"Boruca": "brn",
"Borôro": "bor",
"Boselewa": "bwf",
"Bosngun": "bqs",
"Bote-Majhi": "bmj",
"Botlikh": "bph",
"Botolan Sambal": "sbl",
"Bouna Kulango": "nku",
"Bourbonnais-Berrichon": "roa-bbn",
"Bourguignon": "roa-brg",
"Bouyei": "pcc",
"Bozaba": "bzo",
"Bragat": "aof",
"Brahui": "brh",
"Braj": "bra",
"Brazilian Sign Language": "bzs",
"Brek Karen": "kvl",
"Brem": "buq",
"Breri": "brq",
"Breton": "br",
"Bribri": "bzd",
"British Sign Language": "bfi",
"Brokkat": "bro",
"Brokpake": "sgt",
"Brokskat": "bkk",
"Brooke's Point Palawano": "plw",
"Broome Pearling Lugger Pidgin": "bpl",
"Brunei Bisaya": "bsb",
"Brunei Malay": "kxd",
"Bruny Island": "xpz",
"Bu": "jid",
"Bu-Nao Bunu": "bwx",
"Bua": "bub",
"Bualkhaw Chin": "cbl",
"Buamu": "box",
"Bube": "bvb",
"Bubi": "buw",
"Bubia": "bbx",
"Budeh Stieng": "stt",
"Budibud": "btp",
"Budong-Budong": "bdx",
"Budu": "buu",
"Budukh": "bdk",
"Buduma": "bdm",
"Budza": "bja",
"Buena Vista Yokuts": "nai-bvy",
"Bugan": "bbh",
"Bughotu": "bgt",
"Buginese": "bug",
"Buglere": "sab",
"Bugun": "bgg",
"Buhi'non Bikol": "ubl",
"Buhid": "bku",
"Buhutu": "bxh",
"Bujhyal": "byh",
"Bukar-Sadung Bidayuh": "sdo",
"Bukat": "bvk",
"Bukawa": "buk",
"Bukhari": "bhh",
"Bukit Malay": "bvu",
"Bukitan": "bkn",
"Bukiyip": "ape",
"Buksa": "tkb",
"Bukusu": "bxk",
"Bulgar": "xbo",
"Bulgarian": "bg",
"Bulgarian Sign Language": "bqn",
"Bulgebi": "bmp",
"Buli (Ghana)": "bwu",
"Buli (Indonesia)": "bzq",
"Bulo Stieng": "sti",
"Bulu (Cameroon)": "bum",
"Bulu (New Guinea)": "bjl",
"Bum": "bmv",
"Bumaji": "byp",
"Bumang": "bvp",
"Bumbita Arapesh": "aon",
"Bumthangkha": "kjz",
"Bun": "buv",
"Buna": "bvn",
"Bunaba": "bck",
"Bunak": "bfn",
"Bunama": "bdd",
"Bundeli": "bns",
"Bung": "bqd",
"Bungain": "but",
"Bunganditj": "xbg",
"Bungku": "bkz",
"Bungu": "wun",
"Bunoge": "dgb",
"Bunun": "bnn",
"Buol": "blf",
"Bura": "bwr",
"Bura Mabang": "mde",
"Burak": "bys",
"Buraka": "bkg",
"Burarra": "bvr",
"Burate": "bti",
"Burduna": "bxn",
"Bure": "bvh",
"Burgundian": "gem-bur",
"Burji": "bji",
"Burmese": "my",
"Burmeso": "bzu",
"Buru (Indonesia)": "mhs",
"Buru (Nigeria)": "bqw",
"Burui": "bry",
"Burumakok": "aip",
"Burun": "bdi",
"Burunge": "bds",
"Burushaski": "bsk",
"Burusu": "bqr",
"Buruwai": "asi",
"Buryat": "bua",
"Busa": "bqp",
"Busam": "bxs",
"Busami": "bsm",
"Busang Kayan": "bfg",
"Bushoong": "buf",
"Buso": "bso",
"Busoa": "bup",
"Bussa": "dox",
"Busuu": "bju",
"Butbut Kalinga": "kyb",
"Butchulla": "xby",
"Butmas-Tur": "bnr",
"Butuanon": "btw",
"Buwal": "bhs",
"Buyeo": "xpy",
"Buyu": "byi",
"Buyuan Jinuo": "jiy",
"Bwa": "bww",
"Bwaidoka": "bwd",
"Bwala": "bnt-bwa",
"Bwanabwana": "tte",
"Bwatoo": "bwa",
"Bwe Karen": "bwe",
"Bwela": "bwl",
"Bwile": "bwc",
"Bwisi": "bwz",
"Byangsi": "bee",
"Byep": "mkk",
"Bädi Kanum": "khd",
"Caac": "msq",
"Cabiyarí": "cbb",
"Cabécar": "cjp",
"Cacaloxtepec Mixtec": "miu",
"Cacaopera": "ccr",
"Cacgia Roglai": "roc",
"Cacua": "cbv",
"Cacán": "sai-cac",
"Caddo": "cad",
"Cafundó": "ccd",
"Cahuarano": "cah",
"Cahuilla": "chl",
"Cajonos Zapotec": "zad",
"Caka": "ckx",
"Cakchiquel-Quiché Mixed Language": "ckz",
"Cakfem-Mushere": "cky",
"Calabrian Greek": "grk-cal",
"Calamian Tagbanwa": "tbk",
"Callawalla": "caw",
"Calusa": "nai-cal",
"Caluyanun": "clu",
"Caló": "rmq",
"Camarines Norte Agta": "abd",
"Cameroon Mambila": "mcu",
"Cameroon Pidgin": "wes",
"Campalagian": "cml",
"Camsá": "kbh",
"Camtho": "cmt",
"Camunic": "xcc",
"Candoshi-Shapra": "cbu",
"Canela": "ram",
"Canichana": "caz",
"Cantonese": "yue",
"Cao Miao": "cov",
"Caolan": "mlc",
"Capanahua": "kaq",
"Capiznon": "cps",
"Cappadocian Greek": "cpg",
"Caquinte": "cot",
"Car Nicobarese": "caq",
"Cara": "cfd",
"Carabayo": "cby",
"Caramanta": "crf",
"Caranqui": "sai-caq",
"Carapana": "cbc",
"Carian": "xcr",
"Cariay": "awd-kar",
"Caribbean Hindustani": "hns",
"Caribbean Javanese": "jvn",
"Carijona": "cbd",
"Carolina Algonquian": "crr",
"Carolinian": "cal",
"Carpathian Romani": "rmc",
"Carrier": "crx",
"Cashibo-Cacataibo": "cbr",
"Cashinahua": "cbs",
"Casiguran Dumagat Agta": "dgc",
"Casuarina Coast Asmat": "asc",
"Catacao": "sai-cat",
"Catalan": "ca",
"Catalan Sign Language": "csc",
"Catawba": "chc",
"Catuquinaru": "sai-ctq",
"Catío Chibcha": "cba-cat",
"Cauca": "cca",
"Cavere": "awd-cav",
"Cavineña": "cav",
"Cayubaba": "cyb",
"Cayuga": "cay",
"Cayuse": "xcy",
"Cazcan": "azc-caz",
"Cañari": "sai-cnr",
"Cebaara Senoufo": "sef",
"Cebuano": "ceb",
"Celtiberian": "xce",
"Cemuhî": "cam",
"Cen": "cen",
"Central Asmat": "cns",
"Central Atlas Tamazight": "tzm",
"Central Awyu": "awu",
"Central Bai": "bca",
"Central Bontoc": "lbk",
"Central Cagayan Agta": "agt",
"Central Dusun": "dtp",
"Central Franconian": "gmw-cfr",
"Central Grebo": "grv",
"Central Huasteca Nahuatl": "nch",
"Central Huishui Hmong": "hmc",
"Central Kurdish": "ckb",
"Central Maewo": "mwo",
"Central Mahuatlán Zapoteco": "zam",
"Central Malay": "pse",
"Central Masela": "mxz",
"Central Mashan Hmong": "hmm",
"Central Mazahua": "maz",
"Central Melanau": "mel",
"Central Mnong": "cmo",
"Central Nahuatl": "nhn",
"Central Nicobarese": "ncb",
"Central Ojibwa": "ojc",
"Central Palawano": "plc",
"Central Pame": "pbs",
"Central Pomo": "poo",
"Central Puebla Nahuatl": "ncx",
"Central Sama": "sml",
"Central Siberian Yupik": "ess",
"Central Sierra Miwok": "csm",
"Central Subanen": "syb",
"Central Tagbanwa": "tgt",
"Central Tarahumara": "tar",
"Central Teke": "nzu",
"Central Tunebo": "tuf",
"Centúúm": "cet",
"Cerma": "cme",
"Ch'olti'": "myn-chl",
"Ch'orti'": "caa",
"Chaap Wuurong": "tjw",
"Chachi": "cbi",
"Chadian Arabic": "shu",
"Chadian Sign Language": "cds",
"Chadong": "cdy",
"Chagatai": "chg",
"Chaha": "sem-cha",
"Chaima": "ciy",
"Chairel": "sit-cha",
"Chak": "ckh",
"Chakali": "cli",
"Chakma": "ccp",
"Chala": "cll",
"Chaldean Neo-Aramaic": "cld",
"Chali": "tgf",
"Chamacoco": "ceg",
"Chamalal": "cji",
"Chamba Daka": "ccg",
"Chamba Leko": "ndi",
"Chambeali": "cdh",
"Chambri": "can",
"Chamicuro": "ccc",
"Chamling": "rab",
"Chamorro": "ch",
"Champenois": "roa-cha",
"Chang": "nbc",
"Changriwa": "cga",
"Changthang": "cna",
"Chantyal": "chx",
"Chaná": "sai-chn",
"Chané": "caj",
"Chapacura": "sai-chp",
"Chara": "cra",
"Charrua": "sai-chr",
"Chaudangsi": "cdn",
"Chaura": "crv",
"Chavacano": "cbk",
"Chayahuita": "cbt",
"Chayuco Mixtec": "mih",
"Chazumba Mixtec": "xtb",
"Che": "ruk",
"Chechen": "ce",
"Cheke Holo": "mrn",
"Chemakum": "xch",
"Chenapian": "cjn",
"Chenchu": "cde",
"Chenoua": "cnu",
"Chepang": "cdm",
"Chepya": "ycp",
"Cherepon": "cpn",
"Cherokee": "chr",
"Chesu": "ych",
"Chetco-Tolowa": "ctc",
"Chewong": "cwg",
"Cheyenne": "chy",
"Chhattisgarhi": "hne",
"Chhintange": "ctn",
"Chhulung": "cur",
"Chiangmai Sign Language": "csd",
"Chiapanec": "cip",
"Chibcha": "chb",
"Chicahuaxtla Triqui": "trs",
"Chichewa": "ny",
"Chichicapan Zapotec": "zpv",
"Chichimeca-Jonaz": "pei",
"Chichonyi-Chidzihana-Chikauma": "coh",
"Chickasaw": "cic",
"Chicomuceltec": "cob",
"Chiduruma": "dug",
"Chigmecatitlán Mixtec": "mii",
"Chilcotin": "clc",
"Chilean Sign Language": "csg",
"Chilisso": "clh",
"Chiltepec Chinantec": "csa",
"Chimalapa Zoque": "zoh",
"Chimariko": "cid",
"Chimila": "cbg",
"Chimwiini": "bnt-cmw",
"Chinali": "cih",
"Chinbon Chin": "cnb",
"Chinese": "zh",
"Chinese Pidgin English": "cpi",
"Chinese Sign Language": "csl",
"Chinook": "chh",
"Chinook Jargon": "chn",
"Chipaya": "cap",
"Chipewyan": "chp",
"Chiquihuitlán Mazatec": "maq",
"Chiquimulilla": "nai-chi",
"Chiquitano": "cax",
"Chiricahua": "apm",
"Chirino": "sai-chi",
"Chiripá": "nhd",
"Chiru": "cdf",
"Chitimacha": "ctm",
"Chitkuli Kinnauri": "cik",
"Chittagonian": "ctg",
"Chitwania Tharu": "the",
"Chiwere": "iow",
"Choapan Zapotec": "zpc",
"Chocangaca": "cgk",
"Chochotec": "coz",
"Choctaw": "cho",
"Chodri": "cdi",
"Chokri Naga": "nri",
"Chokwe": "cjk",
"Chol": "ctu",
"Cholón": "cht",
"Chong": "cog",
"Choni": "cda",
"Chono": "sai-cno",
"Chopi": "cce",
"Chothe Naga": "nct",
"Chrau": "crw",
"Chru": "cje",
"Chuabo": "chw",
"Chuanqiandian Cluster Miao": "cqd",
"Chuave": "cjv",
"Chug": "cvg",
"Chuj": "cac",
"Chuka": "cuh",
"Chukchi": "ckt",
"Chukwa": "cuw",
"Chulym": "clw",
"Chumburung": "ncu",
"Churahi": "cdj",
"Churuya": "sai-chu",
"Chut": "scb",
"Chuukese": "chk",
"Chuvan": "xcv",
"Chuvash": "cv",
"Chácobo": "cao",
"Ci Gbe": "cib",
"Cia-Cia": "cia",
"Cibak": "ckl",
"Cicipu": "awc",
"Ciguayo": "nai-cig",
"Cimbrian": "cim",
"Cinamiguin Manobo": "mkx",
"Cinda-Regi-Tiyal": "cdr",
"Cineni": "cie",
"Cinta Larga": "cin",
"Cishingini": "asg",
"Citak": "txt",
"Ciwogai": "tgd",
"Classical Guaraní": "gn-cls",
"Classical Mandaic": "myz",
"Classical Mongolian": "cmg",
"Classical Nahuatl": "nci",
"Classical Newar": "nwc",
"Classical Quechua": "qwc",
"Classical Syriac": "syc",
"Classical Tibetan": "xct",
"Coahuilteco": "xcw",
"Coast Miwok": "csi",
"Coastal Kadazan": "kzj",
"Coastal Konjo": "kjc",
"Coatecas Altas Zapotec": "zca",
"Coatepec Nahuatl": "naz",
"Coatlán Mixe": "mco",
"Coatlán Zapotec": "zps",
"Coatzospan Mixtec": "miz",
"Cocama": "cod",
"Cochimi": "coj",
"Cocopa": "coc",
"Cocos Islands Malay": "coa",
"Coeruna": "sai-coe",
"Coeur d'Alene": "crd",
"Cofán": "con",
"Cogui": "kog",
"Col": "liw",
"Colombian Sign Language": "csn",
"Colonia Tovar German": "gct",
"Columbia-Wenatchi": "col",
"Colán": "sai-col",
"Comaltepec Chinantec": "cco",
"Comanche": "com",
"Comechingon": "sai-cmg",
"Comecrudo": "xcm",
"Communicationssprache": "art-com",
"Como Karim": "cfg",
"Comox": "coo",
"Con": "cno",
"Coos": "csz",
"Copainalá Zoque": "zoc",
"Copala Triqui": "trc",
"Copallén": "sai-cop",
"Coptic": "cop",
"Coquille": "coq",
"Cora": "crn",
"Cori": "cry",
"Cornish": "kw",
"Coroado Puri": "sai-crd",
"Corsican": "co",
"Cosoleacaque Nahuatl": "nhk",
"Costa Rican Sign Language": "csr",
"Cotabato Manobo": "mta",
"Cotoname": "xcn",
"Cowlitz": "cow",
"Coyaima": "coy",
"Coyotepec Popoloca": "pbf",
"Coyutla Totonac": "toc",
"Cree": "cr",
"Creek": "mus",
"Crimean Gothic": "gme-cgo",
"Crimean Tatar": "crh",
"Croatian Sign Language": "csq",
"Cross River Mbembe": "mfn",
"Crow": "cro",
"Cruzeño": "crz",
"Cua": "cua",
"Cuban Sign Language": "csf",
"Cubeo": "cub",
"Cueva": "sai-cva",
"Cuiba": "cui",
"Cuitlatec": "cuy",
"Culina": "cul",
"Culli": "sai-cul",
"Cumanagoto": "cuo",
"Cumbric": "xcb",
"Cun": "cuq",
"Cung": "cug",
"Cupeño": "cup",
"Curonian": "xcu",
"Curripaco": "kpc",
"Cutchi-Swahili": "ccl",
"Cuvok": "cuv",
"Cuyamecalco Mixtec": "xtu",
"Cuyunon": "cyo",
"Cwi Bwamu": "bwy",
"Cypriot Arabic": "acy",
"Czech": "cs",
"Czech Sign Language": "cse",
"Côông": "cnc",
"Da'a Kaili": "kzf",
"Daai Chin": "dao",
"Daantanai'": "lni",
"Daasanach": "dsh",
"Daba": "dbq",
"Dabarre": "dbr",
"Dabe": "dbe",
"Dacian": "xdc",
"Dadanitic": "sem-dad",
"Dadi Dadi": "dda",
"Dadibi": "mps",
"Dadiya": "dbd",
"Daga": "dgz",
"Dagaari Dioula": "dgd",
"Dagba": "dgk",
"Dagbani": "dag",
"Dagik": "dec",
"Dagoman": "dgn",
"Dahalik": "dlk",
"Dahalo": "dal",
"Daho-Doo": "das",
"Dai": "dij",
"Dair": "drb",
"Dairi Batak": "btd",
"Dakaka": "bpa",
"Dakka": "dkk",
"Dakota": "dak",
"Dakpa": "dka",
"Dalmatian": "dlm",
"Daloa Bété": "bev",
"Dama (Nigeria)": "dmm",
"Dama (Sierra Leone)": "dmn-dam",
"Damakawa": "dam",
"Damal": "uhn",
"Dambi": "dac",
"Dameli": "dml",
"Dampelas": "dms",
"Dan": "dnj",
"Danaru": "dnr",
"Danau": "dnu",
"Dandami Maria": "daq",
"Dangaléat": "daa",
"Dangaura Tharu": "thl",
"Danish": "da",
"Danish Sign Language": "dsl",
"Dano": "aso",
"Danu": "dnv",
"Danuwar": "dhw",
"Dao": "daz",
"Daonda": "dnd",
"Dar Daju Daju": "djc",
"Dar Fur Daju": "daj",
"Dar Sila Daju": "dau",
"Darai": "dry",
"Dargwa": "dar",
"Darkinjung": "xda",
"Darlong": "dln",
"Darmiya": "drd",
"Daro-Matu Melanau": "dro",
"Darumbal": "xgm",
"Dass": "dot",
"Datooga": "tcc",
"Daungwurrung": "dgw",
"Daur": "dta",
"Davawenyo": "daw",
"Dawawa": "dww",
"Dawera-Daweloor": "ddw",
"Dawro": "dwr",
"Day": "dai",
"Dayi": "dax",
"Dazaga": "dzg",
"Deccani": "dcc",
"Dedua": "ded",
"Defaka": "afn",
"Defi Gbe": "gbh",
"Deg": "mzw",
"Deg Xinag": "ing",
"Degema": "deg",
"Degenan": "dge",
"Dehwari": "deh",
"Dek": "dek",
"Dela-Oenale": "row",
"Delo": "ntr",
"Delta Yokuts": "nai-dly",
"Dem": "dem",
"Dema": "dmx",
"Demisa": "dei",
"Demotic": "egx-dem",
"Demta": "dmy",
"Dena'ina": "tfn",
"Dendi": "ddn",
"Dengese": "dez",
"Dengka": "dnk",
"Deno": "dbb",
"Denya": "anv",
"Dení": "dny",
"Deori": "der",
"Desano": "des",
"Desiya": "dso",
"Dewas Rai": "dwz",
"Dewoin": "dee",
"Dezfuli": "def",
"Dghwede": "dgh",
"Dhaiso": "dhs",
"Dhalandji": "dhl",
"Dhangu": "dhg",
"Dhanki": "dhn",
"Dhao": "nfa",
"Dharug": "xdk",
"Dhatki": "mki",
"Dhimal": "dhi",
"Dhivehi": "dv",
"Dhodia": "dho",
"Dhofari Arabic": "adf",
"Dhudhuroa": "ddr",
"Dhungaloo": "dhx",
"Dhurga": "dhu",
"Dhuwal": "dwu",
"Dhuwaya": "dwy",
"Dia": "dia",
"Dibabawon Manobo": "mbd",
"Dibiyaso": "dby",
"Dibo": "dio",
"Dicamay Agta": "duy",
"Didinga": "did",
"Dieri": "dif",
"Digo": "dig",
"Dii": "dur",
"Dijim-Bwilim": "cfa",
"Dilling": "dil",
"Dima": "jma",
"Dimasa": "dis",
"Dimbong": "dii",
"Dime": "dim",
"Dinapigue Agta": "phi-din",
"Dineor": "mrx",
"Ding": "diz",
"Dinka": "din",
"Diodio": "ddi",
"Dirasha": "gdl",
"Diri": "dwa",
"Dirim": "dir",
"Disa": "dsi",
"Ditammari": "tbz",
"Ditidaht": "dtd",
"Diuwe": "diy",
"Diuxi-Tilantongo Mixtec": "xtd",
"Dixon Reef": "dix",
"Dizin": "mdx",
"Djadjawurrung": "dja",
"Djambarrpuyngu": "djr",
"Djangun": "djf",
"Djauan": "djn",
"Djawi": "djw",
"Djimini": "dyi",
"Djinang": "dji",
"Djinba": "djb",
"Djiwarli": "djl",
"Dobel": "kvo",
"Dobu": "dob",
"Doe": "doe",
"Doga": "dgg",
"Doghoro": "dgx",
"Dogoso": "dgs",
"Dogosé": "dos",
"Dogri": "doi",
"Dogrib": "dgr",
"Dogul Dom": "dbg",
"Doka": "dbi",
"Doko-Uyanga": "uya",
"Dolgan": "dlg",
"Dom": "doa",
"Domaaki": "dmk",
"Domari": "rmt",
"Dominican Sign Language": "doq",
"Dompo": "doy",
"Domu": "dof",
"Domung": "dev",
"Dondo": "dok",
"Dong": "doh",
"Dongo": "doo",
"Dongolawi": "kzh",
"Dongotono": "ddd",
"Dongshanba Lalo": "yik",
"Dongxiang": "sce",
"Donno So Dogon": "dds",
"Doondo": "dde",
"Dorasque": "cba-dor",
"Dori'o": "dor",
"Dorig": "wwo",
"Doromu-Koki": "kqc",
"Dorze": "doz",
"Doso": "dol",
"Doteli": "dty",
"Dothraki": "art-dtk",
"Doura": "don",
"Doutai": "tds",
"Doyayo": "dow",
"Drehu": "dhv",
"Drung": "duu",
"Duala": "dua",
"Duano": "dup",
"Duau": "dva",
"Dubli": "dub",
"Dubu": "dmu",
"Dugun": "ndu",
"Duguri": "dbm",
"Dugwor": "dme",
"Duhwa": "kbz",
"Duit": "cba-dui",
"Duke": "nke",
"Dukhan": "trk-dkh",
"Dulbu": "dbo",
"Duli": "duz",
"Duma": "dma",
"Dumaitic": "sem-dum",
"Dumbea": "duf",
"Dumi": "dus",
"Dumpas": "dmv",
"Dumun": "dui",
"Duna": "duc",
"Dungan": "dng",
"Dungmali": "raa",
"Dungra Bhil": "duh",
"Dungu": "dbv",
"Dupaningan Agta": "duo",
"Dura": "drq",
"Duri": "mvp",
"Duriankere": "dbn",
"Duruwa": "pci",
"Dusner": "dsn",
"Dusun Deyah": "dun",
"Dusun Malang": "duq",
"Dusun Witu": "duw",
"Dutch": "nl",
"Dutch Low Saxon": "nds-nl",
"Dutch Sign Language": "dse",
"Duun": "dux",
"Duupa": "dae",
"Duvle": "duv",
"Duwai": "dbp",
"Duwet": "gve",
"Dwang": "nnu",
"Dyaabugay": "dyy",
"Dyaberdyaber": "dyb",
"Dyan": "dya",
"Dyangadi": "dyn",
"Dyirbal": "dbl",
"Dyugun": "dyd",
"Dyula": "dyu",
"Dza": "jen",
"Dzala": "dzl",
"Dzando": "dzn",
"Dzao Min": "bpn",
"Dzodinka": "add",
"Dzongkha": "dz",
"Dzuun": "dnn",
"Dâw": "kwa",
"E": "eee",
"E'ma Buyang": "yzg",
"प्रारंभिक असमिया": "inc-oas",
"Early Modern Korean": "ko-ear",
"Early Tripuri": "xtr",
"East Central German": "gmw-ecg",
"East Damar": "dmr",
"East Franconian": "vmf",
"East Futuna": "fud",
"East Kewa": "kjs",
"East Limba": "lma",
"East Makian": "mky",
"East Masela": "vme",
"East Nyala": "nle",
"East Tarangan": "tre",
"East Yugur": "yuy",
"Eastern Acipa": "acp",
"Eastern Arrernte": "aer",
"Eastern Bolivian Guaraní": "gui",
"Eastern Bontoc": "ebk",
"Eastern Bru": "bru",
"Eastern Canadian Inuktitut": "ike",
"Eastern Cham": "cjm",
"Eastern Durango Nahuatl": "azd",
"Eastern Gorkha Tamang": "tge",
"Eastern Gurung": "ggn",
"Eastern Highland Chatino": "cly",
"Eastern Highland Otomi": "otm",
"Eastern Huasteca Nahuatl": "nhe",
"Eastern Huishui Hmong": "hme",
"Eastern Karaboro": "xrb",
"Eastern Katu": "ktv",
"Eastern Kayah": "eky",
"Eastern Keres": "kee",
"Eastern Krahn": "kqo",
"Eastern Lalu": "yit",
"Eastern Lawa": "lwl",
"Eastern Magar": "mgp",
"Eastern Maninkakan": "emk",
"Eastern Mari": "mhr",
"Eastern Meohang": "emg",
"Eastern Mnong": "mng",
"Eastern Muria": "emu",
"Eastern Ngad'a": "nea",
"Eastern Nisu": "nos",
"Eastern Ojibwa": "ojg",
"Eastern Parbate Kham": "kif",
"Eastern Penan": "pez",
"Eastern Pomo": "peb",
"Eastern Pwo": "kjp",
"Eastern Qiandong Miao": "hmq",
"Eastern Tamang": "taj",
"Eastern Tawbuid": "bnj",
"Eastern Xiangxi Miao": "muq",
"Eastern Xwla Gbe": "gbx",
"Ebira": "igb",
"Eblaite": "xeb",
"Ebrié": "ebr",
"Ebughu": "ebg",
"Ecuadorian Sign Language": "ecs",
"Ede Cabe": "cbj",
"Ede Ica": "ica",
"Ede Idaca": "idd",
"Ede Ije": "ijj",
"Ede Nago": "nqg",
"Edera Awyu": "awy",
"Edo": "bin",
"Edolo": "etr",
"Edomite": "xdm",
"Edopi": "dbf",
"Efai": "efa",
"Efe": "efe",
"Efik": "efi",
"Efutop": "ofu",
"Ega": "ega",
"Eggon": "ego",
"Egyptian": "egy",
"Egyptian Arabic": "arz",
"Egyptian Sign Language": "esl",
"Ehueun": "ehu",
"Eipomek": "eip",
"Eitiep": "eit",
"Ejagham": "etu",
"Ejamat": "eja",
"Ekajuk": "eka",
"Ekari": "ekg",
"Ekele": "khy",
"Eki": "eki",
"Ekit": "eke",
"Ekpeye": "ekp",
"El Alto Zapotec": "zpp",
"El Hugeirat": "elh",
"El Molo": "elo",
"Elamite": "elx",
"Eleme": "elm",
"Elepi": "ele",
"Elfdalian": "ovd",
"Elip": "ekm",
"Elkei": "elk",
"Eloi": "art-elo",
"Elotepec Zapotec": "zte",
"Eloyi": "afo",
"Elseng": "mrf",
"Elu": "elu",
"Elymian": "xly",
"Emae": "mmw",
"Emai": "ema",
"Eman": "emn",
"Embaloh": "emb",
"Emberá-Baudó": "bdc",
"Emberá-Catío": "cto",
"Emberá-Chamí": "cmi",
"Emberá-Tadó": "tdc",
"Embu": "ebu",
"Emem": "enr",
"Emerillon": "eme",
"Emilian": "egl",
"Emplawas": "emw",
"En": "enc",
"Enawené-Nawé": "unk",
"Ende": "end",
"Enga": "enq",
"Engenni": "enn",
"Enggano": "eno",
"English": "en",
"Enlhet": "enl",
"Enrekang": "ptt",
"Enu": "enu",
"Enwan": "env",
"Enwang": "enw",
"Enxet": "enx",
"Enya": "gey",
"Eotile": "eot",
"Epena": "sja",
"Epi-Olmec": "xep",
"Epie": "epi",
"Epigraphic Mayan": "emy",
"Eravallan": "era",
"Erave": "kjy",
"Ere": "twp",
"Erie": "iro-ere",
"Eritai": "ert",
"Erokwanas": "erw",
"Erre": "err",
"Erromintxela": "emx",
"Ersu": "ers",
"Eruwa": "erh",
"Erzya": "myv",
"Esan": "ish",
"Ese": "mcq",
"Ese Ejja": "ese",
"Eshtehardi": "esh",
"Esimbi": "ags",
"Eskayan": "esy",
"Esmeralda": "sai-esm",
"Esperanto": "eo",
"Esselen": "esq",
"Estado de México Otomi": "ots",
"Estonian": "et",
"Estonian Sign Language": "eso",
"Esuma": "esm",
"Etchemin": "etc",
"Etebi": "etb",
"Eten": "etx",
"Eteocretan": "ecr",
"Eteocypriot": "ecy",
"Ethiopian Sign Language": "eth",
"Etkywan": "ich",
"Eton (Cameroon)": "eto",
"Eton (Vanuatu)": "etn",
"Etruscan": "ett",
"Etulo": "utr",
"Evant": "bzz",
"Even": "eve",
"Evenki": "evn",
"Ewage-Notu": "nou",
"Ewarhuyana": "sai-ewa",
"Ewe": "ee",
"Ewondo": "ewo",
"Extremaduran": "ext",
"Eyak": "eya",
"Ezaa": "eza",
"Fagani": "faf",
"Faire Atta": "azt",
"Faita": "faj",
"Faiwol": "fai",
"Fakkanci": "gel",
"Fala": "fax",
"Falam Chin": "cfm",
"Fali": "fli",
"Faliscan": "xfa",
"Fam": "fam",
"Fanagalo": "fng",
"Fanamaket": "bjp",
"Fang (Bantu)": "fan",
"Fang (Beboid)": "fak",
"Fania": "fni",
"Far Western Muria": "fmu",
"Farefare": "gur",
"Faroese": "fo",
"Fas": "fqs",
"Fasu": "faa",
"Fataleka": "far",
"Fataluku": "ddg",
"Fayu": "fau",
"Fe'fe'": "fmp",
"Fedan": "pdn",
"Fembe": "agl",
"Fer": "kah",
"Feroge": "fer",
"फिजी हिंदी": "hif",
"Fijian": "fj",
"Filomena Mata-Coahuitlán Totonac": "tlp",
"Finisterre Yau": "yuw",
"Finnish": "fi",
"Finnish Sign Language": "fse",
"Finnish-Swedish Sign Language": "fss",
"Finongan": "fag",
"Fipa": "fip",
"Firan": "fir",
"Fiwaga": "fiw",
"Flemish Sign Language": "vgt",
"Flinders Island": "fln",
"Foau": "flh",
"Fogaha": "ber-fog",
"Foi": "foi",
"Foia Foia": "ffi",
"Folopa": "ppo",
"Foma": "fom",
"Fon": "fon",
"Fongoro": "fgr",
"Foodo": "fod",
"Forak": "frq",
"Fordata": "frd",
"Fore": "for",
"Forest Enets": "enf",
"Forest Nenets": "syd-fne",
"Fortsenal": "frt",
"Fox": "sac",
"Franc-Comtois": "roa-fcm",
"Francisco León Zoque": "zos",
"Franco-Provençal": "frp",
"French": "fr",
"French Belgian Sign Language": "sfb",
"French Sign Language": "fsl",
"Friulian": "fur",
"Fula": "ff",
"Fuliiru": "flr",
"Fulniô": "fun",
"Fum": "fum",
"Fungwa": "ula",
"Fur": "fvr",
"Furu": "fuu",
"Futuna-Aniwa": "fut",
"Fuyug": "fuy",
"Fwe": "fwe",
"Fwâi": "fwa",
"Fyam": "pym",
"Fyer": "fie",
"Ga": "gaa",
"Ga'anda": "gqa",
"Ga'dang": "gdg",
"Gaa": "ttb",
"Gaam": "tbi",
"Gabadi": "kbt",
"Gabi": "gbw",
"Gabri": "gab",
"Gabrielino-Fernandeño": "xgf",
"Gadang": "gdk",
"Gaddang": "gad",
"Gaddi": "gbk",
"Gade": "ged",
"Gadjerawang": "gdh",
"Gadsup": "gaj",
"Gafat": "gft",
"Gagadu": "gbu",
"Gagauz": "gag",
"Gagnoa Bété": "btg",
"Gahri": "bfu",
"Gaikundi": "gbf",
"Gaina": "gcn",
"Gal": "gap",
"Galambu": "glo",
"Galatian": "xga",
"Galela": "gbi",
"Galeya": "gar",
"Galibi Carib": "car",
"Galice": "gce",
"Galician": "gl",
"Galindan": "xgl",
"Gallaecian": "cel-gal",
"Gallo": "roa-gal",
"Gallurese": "sdn",
"Galo": "adl",
"Galoli": "gal",
"Gamale Kham": "kgj",
"Gambera": "gma",
"Gamela": "sai-gam",
"Gamilaraay": "kld",
"Gamit": "gbl",
"Gamkonora": "gak",
"Gamo": "gmv",
"Gamo-Ningi": "bte",
"Gan": "gan",
"Gana": "gnq",
"Ganang": "gne",
"Gandhari": "pgd",
"Gane": "gzn",
"Ganggalida": "gcd",
"Ganglau": "ggl",
"Gangte": "gnb",
"Gangulu": "gnl",
"Gants": "gao",
"Ganza": "gza",
"Ganzi": "gnz",
"Gao": "gga",
"Gapapaiwa": "pwg",
"Garawa": "wrk",
"Garhwali": "gbm",
"Garifuna": "cab",
"Garingbal": "xgi",
"Garo": "grt",
"Garre": "gex",
"Garus": "gyb",
"Garza": "xgr",
"Gashowu": "nai-gsy",
"Gata'": "gaq",
"Gaulish": "cel-gau",
"Gavak": "dmc",
"Gavar": "gou",
"Gavião do Jiparaná": "gvo",
"Gawar-Bati": "gwt",
"Gawwada": "gwd",
"Gayil": "gyl",
"Gayo": "gay",
"Gayón": "sai-gay",
"Gbagyi": "gbr",
"Gban": "ggu",
"Gbanu": "gbv",
"Gbanziri": "gbg",
"Gbari": "gby",
"Gbaya": "gba",
"Gbaya-Bossangoa": "gbp",
"Gbaya-Bozoum": "gbq",
"Gbaya-Mbodomo": "gmm",
"Gbayi": "gyg",
"Gbesi Gbe": "gbs",
"Gbii": "ggb",
"Gbin": "xgb",
"Gbiri-Niragu": "grh",
"Gboloo Grebo": "gec",
"Gciriku": "diu",
"Gcwi": "gwj",
"Ge": "hmj",
"Ge'ez": "gez",
"Geba Karen": "kvq",
"Gebe": "gei",
"Gedaged": "gdd",
"Gedeo": "drs",
"Geji": "gji",
"Geko Karen": "ghk",
"Gela": "nlg",
"Gelao": "gio",
"Gele'": "sbc",
"Geme": "geq",
"Gen": "gej",
"Gende": "gaf",
"Gengle": "geg",
"Georgian": "ka",
"Gepo": "ygp",
"Gera": "gew",
"Gerka": "gek",
"German": "de",
"German Low German": "nds-de",
"German Sign Language": "gsg",
"Geruma": "gea",
"Geser-Gorom": "ges",
"Gey": "guv",
"Ghadames": "gha",
"Ghanaian Sign Language": "gse",
"Ghandruk Sign Language": "gds",
"Ghanongga": "ghn",
"Ghari": "gri",
"Ghayavi": "bmk",
"Ghera": "ghr",
"Ghomala'": "bbj",
"Ghomara": "gho",
"Ghotuo": "aaa",
"Ghulfan": "ghl",
"Giangan": "bgi",
"Gibanawa": "gib",
"Gidar": "gid",
"Gikyode": "acd",
"Gilaki": "glk",
"Gilbertese": "gil",
"Gilima": "gix",
"Gimi (Austronesian)": "gip",
"Gimi (Goroka)": "gim",
"Gimme": "kmp",
"Gimnime": "gmn",
"Ginuman": "gnm",
"Girawa": "bbr",
"Girirra": "gii",
"Giryama": "nyf",
"Githabul": "gih",
"Gitua": "ggt",
"Gitxsan": "git",
"Giyug": "giy",
"Gizrra": "tof",
"Glaro-Twabo": "glr",
"Glavda": "glw",
"Glio-Oubi": "oub",
"Glosa": "igs",
"Gnau": "gnu",
"Goa'uld": "art-gld",
"Goaria": "gig",
"Gobasi": "goi",
"Gobu": "gox",
"Godié": "god",
"Godoberi": "gdo",
"Godwari": "gdx",
"Goemai": "ank",
"Gofa": "gof",
"Gogo": "gog",
"Gogodala": "ggw",
"Goguryeo": "zkg",
"Gojri": "gju",
"Gokana": "gkn",
"Gokhy": "sit-gkh",
"Gola": "gol",
"Golin": "gvf",
"Golpa": "lja",
"Gondi": "gon",
"Gone Dau": "goo",
"Gong": "ugo",
"Gongduk": "goe",
"Gonja": "gjn",
"Goo": "gov",
"Gooniyandi": "gni",
"Gor": "gqr",
"Gorakor": "goc",
"Gorap": "goq",
"Goreng": "xgg",
"Gorontalo": "gor",
"Gorovu": "grq",
"Gorowa": "gow",
"Gothic": "got",
"Gottscheerish": "gmw-gts",
"Goundo": "goy",
"Gourmanchéma": "gux",
"Gowlan": "goj",
"Gowro": "gwf",
"Gozarkhani": "goz",
"Grangali": "nli",
"Grass Koiari": "kbk",
"Grebo": "grb",
"Greek": "el",
"Greek Sign Language": "gss",
"Green Gelao": "giq",
"Green Hmong": "hnj",
"Greenlandic": "kl",
"Grenadian Creole English": "gcl",
"Gresi": "grs",
"Groma": "gro",
"Gros Ventre": "ats",
"Gua": "gwx",
"Guahibo": "guh",
"Guajajára": "gub",
"Guajá": "gvj",
"Guambiano": "gum",
"Guamo": "sai-gmo",
"Guanano": "gvc",
"Guanche": "gnc",
"Guaraní": "gn",
"Guarayu": "gyr",
"Guatemalan Sign Language": "gsm",
"Guató": "gta",
"Guayabero": "guo",
"Guazacapán": "nai-guz",
"Gudang": "xgd",
"Gudanji": "nji",
"Gude": "gde",
"Gudu": "gdu",
"Guduf-Gava": "gdf",
"Guerrero Amuzgo": "amu",
"Guerrero Nahuatl": "ngu",
"Guevea de Humboldt Zapotec": "zpg",
"Gugadj": "ggd",
"Gugu Badhun": "gdc",
"Gugu Warra": "wrw",
"Guhu-Samane": "ghs",
"Guianese Creole": "gcr",
"Guiberoua Bété": "bet",
"Guinau": "awd-gnu",
"Guinea Kpelle": "gkp",
"Guinea-Bissau Creole": "pov",
"Guinea-Bissau Sign Language": "lgs",
"Guinean Sign Language": "gus",
"Guiqiong": "gqi",
"Gujarati": "gu",
"Gula": "glu",
"Gula'alaa": "gmb",
"Gulay": "gvl",
"Gule": "gly",
"Gulf Arabic": "afb",
"Gullah": "gul",
"Gumalu": "gmu",
"Gumatj": "gnn",
"Gumawana": "gvs",
"Gumuz": "guk",
"Gun": "guw",
"Gundi": "gdi",
"Gunditjmara": "gjm",
"Gundungurra": "xrd",
"Gungabula": "gyf",
"Gungu": "rub",
"Guntai": "gnt",
"Gunu": "yas",
"Gunwinggu": "gup",
"Gunya": "gyy",
"Gupa-Abawa": "gpa",
"Gupapuyngu": "guf",
"Gur Lama": "las",
"Guragone": "gge",
"Guramalum": "grz",
"Gurani": "hac",
"Gureng Gureng": "gnr",
"Gurgula": "ggg",
"Guriaso": "grx",
"Gurindji": "gue",
"Gurjar Apabhramsa": "inc-gup",
"Gurmana": "gvm",
"Guro": "goa",
"Guruntum": "grd",
"Gusan": "gsn",
"Gusii": "guz",
"Gusilay": "gsl",
"Gutnish": "gmq-gut",
"Guugu Yimidhirr": "kky",
"Guwa": "xgw",
"Guwamu": "gwu",
"Guwar": "aus-guw",
"Guya": "gka",
"Guyanese Creole English": "gyn",
"Guyani": "gvy",
"Guébie": "gie",
"Gvoko": "ngs",
"Gwa": "gwb",
"Gwahatike": "dah",
"Gwak": "jgk",
"Gwamhi-Wuri": "bga",
"Gwandara": "gwn",
"Gwara": "alv-gwa",
"Gweda": "grw",
"Gweno": "gwe",
"Gwere": "gwr",
"Gwich'in": "gwi",
"Gyalsumdo": "gyo",
"Gyele": "gyi",
"Gyem": "gye",
"Güenoa": "sai-gue",
"Habu": "hbu",
"Hadiyya": "hdy",
"Hadothi": "hoj",
"Hadrami": "xhd",
"Hadza": "hts",
"Haeke": "aek",
"Hahon": "hah",
"Haida": "hai",
"Haigwai": "hgw",
"Hainyaxo Bozo": "bzx",
"Haiphong Sign Language": "haf",
"Haisla": "has",
"Haitian Creole": "ht",
"Haitian Vodoun Culture Language": "hvc",
"Haiǁom": "hgm",
"Haji": "hji",
"Hajong": "haj",
"Hakka": "hak",
"Hakö": "hao",
"Halang": "hal",
"Halang Doan": "hld",
"Halbi": "hlb",
"Halia": "hla",
"Halkomelem": "hur",
"Hamap": "hmu",
"Hamba": "hba",
"Hamer-Banna": "amf",
"Hamtai": "hmt",
"Hanga": "hag",
"Hanga Hundi": "wos",
"Hani": "hni",
"Hanoi Sign Language": "hab",
"Hanunoo": "hnn",
"Harami": "xha",
"Harari": "har",
"Haraza": "nub-har",
"Harijan Kinnauri": "kjo",
"Haroi": "hro",
"Harsusi": "hss",
"Haruai": "tmd",
"Haruku": "hrk",
"Haryanvi": "bgc",
"Harzani": "hrz",
"Hasaitic": "sem-has",
"Hasha": "ybj",
"Hassaniya": "mey",
"Hatam": "had",
"Hattic": "xht",
"Hausa": "ha",
"Hausa Sign Language": "hsl",
"Haush": "sai-hau",
"Havasupai-Walapai-Yavapai": "yuf",
"Haveke": "hvk",
"Havu": "hav",
"Hawai'i Pidgin Sign Language": "hps",
"Hawaiian": "haw",
"Hawaiian Creole": "hwc",
"Haya": "hay",
"Hazaragi": "haz",
"Hdi": "xed",
"Hebrew": "he",
"Hehe": "heh",
"Heiban": "hbn",
"Heiltsuk": "hei",
"Helong": "heg",
"Helu": "elu-prk",
"Hema": "nix",
"Hemba": "hem",
"Herdé": "hed",
"Herero": "hz",
"Hermit": "llf",
"Hernican": "xhr",
"Hewa": "ham",
"Heyo": "auk",
"Hibito": "hib",
"Hidatsa": "hid",
"Higaonon": "mba",
"Highland Konjo": "kjk",
"Highland Oaxaca Chontal": "chd",
"Highland Popoluca": "poi",
"Highland Puebla Nahuatl": "azz",
"Highland Totonac": "tos",
"Hijazi Arabic": "acw",
"Hijuk": "hij",
"Hiligaynon": "hil",
"Hill Maria": "mrr",
"Himarimã": "hir",
"Himyaritic": "sem-him",
"हिंदी": "hi",
"हिंदी डोगरी": "dgo",
"Hinduri": "hii",
"Hinukh": "gin",
"Hiri Motu": "ho",
"Hismaic": "sem-his",
"Hitchiti": "nai-hit",
"Hittite": "hit",
"Hitu": "htu",
"Hiw": "hiw",
"Hixkaryana": "hix",
"Hlai": "lic",
"Hlepho Phowa": "yhl",
"Hlersu": "hle",
"Hmar": "hmr",
"Hmong Don": "hmf",
"Hmong Dô": "hmv",
"Hmong Shua": "hmz",
"Hmwaveke": "mrk",
"Ho": "hoc",
"Ho Chi Minh City Sign Language": "hos",
"Hoava": "hoa",
"Hobyót": "hoh",
"Hoia Hoia": "hhi",
"Holikachuk": "hoi",
"Holiya": "hoy",
"Holma": "hod",
"Holoholo": "hoo",
"Holu": "hol",
"Homa": "hom",
"Honduran Lenca": "len",
"Honduras Sign Language": "hds",
"Hone": "juh",
"Hong Kong Sign Language": "hks",
"Honi": "how",
"Hopi": "hop",
"Horned Miao": "hrm",
"Horo": "hor",
"Horom": "hoe",
"Horpa": "ero",
"Hote": "hot",
"Hoti": "hti",
"Hovongan": "hov",
"Hoyahoya": "hhy",
"Hozo": "hoz",
"Hpon": "hpo",
"Hrangkhol": "hra",
"Hre": "hre",
"Hruso": "hru",
"Hu": "huo",
"Huachipaeri": "hug",
"Huambisa": "hub",
"Huaorani": "auc",
"Huarijio": "var",
"Huaulu": "hud",
"Huautla Mazatec": "mau",
"Huave": "huv",
"Huaxcaleca Nahuatl": "nhq",
"Huba": "hbb",
"Huehuetla Tepehua": "tee",
"Huetar": "cba-hue",
"Huichol": "hch",
"Huilliche": "huh",
"Huitepec Mixtec": "mxs",
"Huizhou": "czh",
"Hukumina": "huw",
"Hula": "hul",
"Hulaulá": "huy",
"Huli": "hui",
"Hulung": "huk",
"Humburi Senni": "hmb",
"Humene": "huf",
"Hun": "uth",
"Hunde": "hke",
"Hung": "hnu",
"Hungana": "hum",
"Hungarian": "hu",
"Hungarian Sign Language": "hsh",
"Hungworo": "nat",
"Hunjara-Kaina Ke": "hkk",
"Hunnic": "xhc",
"Hunsrik": "hrx",
"Hunzib": "huz",
"Hupa": "hup",
"Hupdë": "jup",
"Hupla": "hap",
"Hurrian": "xhu",
"Hutterisch": "geh",
"Hwana": "hwo",
"Hya": "hya",
"Hyam": "jab",
"Hän": "haa",
"Hértevin": "hrt",
"I-Wak": "iwk",
"Iaai": "iai",
"Iamalele": "yml",
"Iatmul": "ian",
"Iau": "tmu",
"Ibali Teke": "tek",
"Ibaloi": "ibl",
"Iban": "iba",
"Ibanag": "ibg",
"Ibani": "iby",
"Ibatan": "ivb",
"Iberian": "xib",
"Ibibio": "ibb",
"Ibino": "ibn",
"Iboko": "bkp",
"Ibu": "ibu",
"Ibuoro": "ibr",
"Icelandic": "is",
"Icelandic Sign Language": "icl",
"Iceve-Maci": "bec",
"Ida'an": "dbj",
"Idakho-Isukha-Tiriki": "ida",
"Idaté": "idt",
"Idere": "ide",
"Idesa": "ids",
"Idi": "idi",
"Ido": "io",
"Idoma": "idu",
"Idon": "idc",
"Idu": "clk",
"Idun": "ldb",
"Iduna": "viv",
"Ifo": "iff",
"Ifè": "ife",
"Igala": "igl",
"Igana": "igg",
"Igbo": "ig",
"Igede": "ige",
"Ignaciano": "ign",
"Igo": "ahl",
"Iguta": "nar",
"Igwe": "igw",
"Iha": "ihp",
"Ihievbe": "ihi",
"Ija-Zuba": "vki",
"Ik": "ikx",
"Ika": "ikk",
"Ikaranggal": "ikr",
"Ikizu": "ikz",
"Iko": "iki",
"Ikobi-Mena": "meb",
"Ikoma": "ntk",
"Ikpeng": "txi",
"Ikpeshi": "ikp",
"Ikposo": "kpo",
"Iku-Gora-Ankwa": "ikv",
"Ikulu": "ikl",
"Ikwere": "ikw",
"Ikwo": "iqw",
"Ila": "ilb",
"Ile Ape": "ila",
"Ilgar": "ilg",
"Ili Turki": "ili",
"Ili'uun": "ilu",
"Ilianen Manobo": "mbi",
"Illyrian": "xil",
"Ilocano": "ilo",
"Ilongot": "ilk",
"Ilue": "ilv",
"Ilwana": "mlk",
"Imbongu": "imo",
"Imonda": "imn",
"Imroing": "imr",
"Inabaknon": "abx",
"Inapang": "mzu",
"Inari Sami": "smn",
"Indanga": "bnt-ind",
"Indian Sign Language": "ins",
"Indo-Portuguese": "idb",
"Indonesian": "id",
"Indonesian Bajau": "bdl",
"Indonesian Sign Language": "inl",
"Indri": "idr",
"Indus Kohistani": "mvy",
"Indus Valley Language": "xiv",
"Inebu One": "oin",
"Ineseño": "inz",
"Inga": "inb",
"Ingrian": "izh",
"Ingush": "inh",
"Inlaod Itneg": "iti",
"Inoke-Yate": "ino",
"Inonhan": "loc",
"Inor": "ior",
"Inpui Naga": "nkf",
"Interlingua": "ia",
"Interlingue": "ie",
"International Sign": "ils",
"Intha": "int",
"Inuinnaqtun": "esx-inq",
"Inuit Sign Language": "iks",
"Inuktitut": "iu",
"Inuktun": "esx-ink",
"Inupiaq": "ik",
"Inuvialuktun": "ikt",
"Ipai": "nai-ipa",
"Ipalapa Amuzgo": "azm",
"Ipiko": "ipo",
"Ipili": "ipi",
"Ipulo": "ass",
"Iquito": "iqu",
"Ir": "irr",
"Irantxe": "irn",
"Iranun": "ill",
"Iraqi Arabic": "acm",
"Iraqw": "irk",
"Irarutu": "irh",
"Iraya": "iry",
"Iresim": "ire",
"Iriga Bicolano": "bto",
"Irish": "ga",
"Irish Sign Language": "isg",
"Irula": "iru",
"Isabi": "isa",
"Isan": "tts",
"Isanzu": "isn",
"Isarog Agta": "agk",
"Isaurian": "und-isa",
"Isconahua": "isc",
"Isebe": "igo",
"Ishkashimi": "isk",
"Isinai": "inn",
"Isirawa": "srl",
"Island Carib": "crb",
"Islander Creole English": "icr",
"Isnag": "isd",
"Isoko": "iso",
"Israeli Sign Language": "isr",
"Isthmus Mixe": "mir",
"Isthmus Zapotec": "zai",
"Istriot": "ist",
"Istro-Romanian": "ruo",
"Isu": "isu",
"Isubu": "szv",
"Italian": "it",
"Italian Sign Language": "ise",
"Italiot Greek": "grk-ita",
"Itawit": "itv",
"Itelmen": "itl",
"Itene": "ite",
"Iteri": "itr",
"Itik": "itx",
"Ito": "itw",
"Itonama": "ito",
"Itsekiri": "its",
"Itu Mbon Uzo": "itm",
"Itundujia Mixtec": "mce",
"Itzá": "itz",
"Iu Mien": "ium",
"Ivatan": "ivv",
"Iwaidja": "ibd",
"Iwal": "kbm",
"Iwam": "iwm",
"Iwur": "iwo",
"Ixcatec": "ixc",
"Ixcatlán Mazatec": "mzi",
"Ixil": "ixl",
"Ixtayutla Mixtec": "vmj",
"Ixtenco Otomi": "otz",
"Iyayu": "iya",
"Iyive": "uiv",
"Iyo": "nca",
"Iyo'wujwa Chorote": "crq",
"Iyojwa'ja Chorote": "crt",
"Izere": "izr",
"Izi": "izz",
"Izi-Ezaa-Ikwo-Mgbo": "izi",
"Izon": "ijc",
"Izora": "cbo",
"Iñapari": "inp",
"Jabem": "jae",
"Jabutí": "jbt",
"Jad": "jda",
"Jadgali": "jdg",
"Jah Hut": "jah",
"Jahanka": "jad",
"Jair Awyu": "awv",
"Jakaltek": "jac",
"Jakati": "jat",
"Jalapa de Díaz Mazatec": "maj",
"Jalkunan": "bxl",
"Jamaican Country Sign Language": "jcs",
"Jamaican Creole": "jam",
"Jamaican Sign Language": "jls",
"Jamamadí": "jaa",
"Jambi Malay": "jax",
"Jamiltepec Mixtec": "mxt",
"Jaminjung": "djd",
"Jamsay": "djm",
"Jamtish": "gmq-jmk",
"Jandavra": "jnd",
"Janday": "jan",
"Jangkang": "djo",
"Jangshung": "jna",
"Janji": "jni",
"Japanese": "ja",
"Japanese Sign Language": "jsl",
"Japhug": "sit-jap",
"Japrería": "jru",
"Jaqaru": "jqr",
"Jara": "jaf",
"Jarai": "jra",
"Jarawa": "anq",
"Jaru": "ddj",
"Jassic": "ysc",
"Jaunsari": "jns",
"Javanese": "jv",
"Javindo": "jvd",
"Jawe": "jaz",
"Jaya": "jyy",
"Jebero": "jeb",
"Jeh": "jeh",
"Jehai": "jhi",
"Jeikó": "sai-jko",
"Jeju": "jje",
"Jemez": "tow",
"Jenaama Bozo": "bze",
"Jeng": "jeg",
"Jennu Kurumba": "xuj",
"Jere": "jer",
"Jeri Kuo": "jek",
"Jersey Dutch": "gmw-jdt",
"Jeru": "akj",
"Jerung": "jee",
"Jhankot Sign Language": "jhs",
"Jiamao": "jio",
"Jiba": "juo",
"Jibu": "jib",
"Jicarilla": "apj",
"Jiiddu": "jii",
"Jilbe": "jie",
"Jili": "mgi",
"Jilim": "jil",
"Jimi": "jmi",
"Jimjimen": "jim",
"Jin": "cjy",
"Jina": "jia",
"Jingpho": "kac",
"Jingulu": "jig",
"Jiongnai Bunu": "pnu",
"Jirajara": "sai-jrj",
"Jirel": "jul",
"Jiru": "jrr",
"Jita": "jit",
"Jju": "kaj",
"Joba": "job",
"Jofotek-Bromnya": "jbr",
"Jola-Fonyi": "dyo",
"Jola-Kasa": "csk",
"Jonkor Bourmataguil": "jeu",
"Jordanian Sign Language": "jos",
"Jorá": "jor",
"Jowulu": "jow",
"Ju": "juu",
"Juang": "jun",
"Juba Arabic": "pga",
"Judeo-Italian": "itk",
"Judeo-Persian": "jpr",
"Judeo-Tat": "jdt",
"Jukun Takum": "jbu",
"Jumaytepeque": "nai-jum",
"Jumjum": "jum",
"Jumla Sign Language": "jus",
"Jumli": "jml",
"Jungle Inga": "inj",
"Juquila Mixe": "mxq",
"Jur Modo": "bex",
"Juray": "juy",
"Jurchen": "juc",
"Jurúna": "jur",
"Jutiapa": "nai-jtp",
"Jutish": "jut",
"Juwal": "mwb",
"Juxtlahuaca Mixtec": "vmc",
"Juǀ'hoan": "ktz",
"Jwira-Pepesa": "jwi",
"Júma": "jua",
"K'iche'": "quc",
"Kaamba": "xku",
"Kaan": "ldl",
"Kaang Chin": "ckn",
"Kaansa": "gna",
"Kaapor Sign Language": "uks",
"Kaba": "ksp",
"Kabalai": "kvf",
"Kabardian": "kbd",
"Kabatei": "xkp",
"Kabba-Laka": "lap",
"Kabishiana": "tup-kab",
"Kabiyé": "kbp",
"Kabola": "klz",
"Kabore One": "onk",
"Kabras": "lkb",
"Kaburi": "uka",
"Kabutra": "kbu",
"Kabuverdianu": "kea",
"Kabwa": "cwa",
"Kabwari": "kcw",
"Kabyle": "kab",
"Kachama-Ganjule": "kcx",
"Kachari": "xac",
"Kachchi": "kfr",
"Kachi Koli": "gjk",
"Kacipo-Balesi": "koe",
"Kaco'": "xkk",
"Kadai": "kzd",
"Kadar": "kej",
"Kadara": "kad",
"Kadaru": "kdu",
"Kadiwéu": "kbc",
"Kado": "kdv",
"Kadugli": "xtc",
"Kaduo": "ktp",
"Kaera": "jka",
"Kafa": "kbr",
"Kafoa": "kpu",
"Kagan Kalagan": "kll",
"Kagate": "syw",
"Kagayanen": "cgc",
"Kagoma": "kdm",
"Kagoro": "xkg",
"Kagulu": "kki",
"Kahe": "hka",
"Kahua": "agw",
"Kaian": "kct",
"Kaibobo": "kzb",
"Kaidipang": "kzp",
"Kaiep": "kbw",
"Kaikadi": "kep",
"Kaike": "kzq",
"Kaiku": "kkq",
"Kaimbulawa": "zka",
"Kaimbé": "xai",
"Kaingang": "kgp",
"Kairak": "ckr",
"Kairiru": "kxa",
"Kairui-Midiki": "krd",
"Kais": "kzm",
"Kaivi": "kce",
"Kaiwá": "kgk",
"Kaiy": "tcq",
"Kajakse": "ckq",
"Kajali": "xkj",
"Kajaman": "kag",
"Kakabai": "kqf",
"Kakabe": "kke",
"Kakanda": "kka",
"Kaki Ae": "tbd",
"Kakihum": "kxe",
"Kako": "kkj",
"Kakwa": "keo",
"Kala": "kcl",
"Kala Lagaw Ya": "mwp",
"Kalaamaya": "lkm",
"Kalabakan": "kve",
"Kalabari": "ijn",
"Kalabra": "kzz",
"Kalagan": "kqe",
"Kalaktang Monpa": "kkf",
"Kalam": "kmh",
"Kalami": "gwc",
"Kalamsé": "knz",
"Kalanadi": "wkl",
"Kalanga": "kck",
"Kalao": "kly",
"Kalapuya": "kyl",
"Kalarko": "kba",
"Kalasha": "kls",
"Kalasuri": "xme-kls",
"Kalenjin": "kln",
"Kalkatungu": "ktg",
"Kalkoti": "xka",
"Kalmyk": "xal",
"Kalo Finnish Romani": "rmf",
"Kalou": "ywa",
"Kaluli": "bco",
"Kalumpang": "kli",
"Kam": "kdx",
"Kamakan": "vkm",
"Kamang": "woi",
"Kamano": "kbq",
"Kamantan": "kci",
"Kamar": "keq",
"Kamara": "jmr",
"Kamarian": "kzx",
"Kamaru": "kgx",
"Kamarupi Prakrit": "inc-kam",
"Kamasa": "klp",
"Kamasau": "kms",
"Kamassian": "xas",
"Kamayo": "kyk",
"Kamayurá": "kay",
"Kamba": "kam",
"Kambaata": "ktb",
"Kambaira": "kyy",
"Kambera": "xbr",
"Kamberataro": "kbv",
"Kamberau": "irx",
"Kambiwá": "xbw",
"Kami": "kmi",
"Kamkata-viri": "bsh",
"Kamo": "kcq",
"Kamoro": "kgq",
"Kamta": "rkt",
"Kamu": "xmu",
"Kamula": "xla",
"Kamwe": "hig",
"Kanakanabu": "xnb",
"Kanakuru": "kna",
"Kanamari": "knm",
"Kanashi": "xns",
"Kanasi": "soq",
"Kandas": "kqw",
"Kandawo": "gam",
"Kande": "kbs",
"Kang": "kyp",
"Kanga": "kcp",
"Kangean": "kkv",
"Kanggape": "igm",
"Kangjia": "kxs",
"Kango": "kty",
"Kango-Sua": "kzy",
"Kangri": "xnr",
"Kaniet": "ktk",
"Kanikkaran": "kev",
"Kaningdon-Nindem": "kdp",
"Kaningi": "kzo",
"Kaningra": "knr",
"Kaninuwa": "wat",
"Kanite": "kmu",
"Kanjari": "kft",
"Kanju": "kbe",
"Kankanaey": "kne",
"Kannada": "kn",
"Kannada Kurumba": "kfi",
"Kannauji": "bjj",
"Kanowit": "kxn",
"Kanoé": "kxo",
"Kansa": "ksk",
"Kantosi": "xkt",
"Kanu": "khx",
"Kanufi": "kni",
"Kanuri": "kr",
"Kanyok": "kny",
"Kao": "kax",
"Kaonde": "kqn",
"Kap": "ykm",
"Kapampangan": "pam",
"Kapauri": "khp",
"Kapin": "tbx",
"Kapinawá": "xpn",
"Kapingamarangi": "kpg",
"Kapriman": "dju",
"Kaptiau": "kbi",
"Kapya": "klo",
"Kaqchikel": "cak",
"Kara (New Guinea)": "leu",
"Kara (Tanzania)": "reg",
"Karachay-Balkar": "krc",
"Karadjeri": "gbd",
"Karaga Mandaya": "mry",
"Karaim": "kdr",
"Karajá": "kpj",
"Karakalpak": "kaa",
"Karakhanid": "xqa",
"Karami": "xar",
"Karamojong": "kdj",
"Karang": "kzr",
"Karanga": "kth",
"Karankawa": "zkk",
"Karao": "kyj",
"Karas": "kgv",
"Karata": "kpt",
"Karawa": "xrw",
"Karbi": "mjw",
"Kare (Africa)": "kbn",
"Kare (New Guinea)": "kmf",
"Karekare": "kai",
"Karelian": "krl",
"Karey": "kyd",
"Kari": "kbj",
"Karingani": "kgn",
"Karipuna": "kuq",
"Karipúna": "kgm",
"Karipúna Creole French": "kmv",
"Kariri": "kzw",
"Karitiâna": "ktn",
"Kariya": "kil",
"Kariyarra": "vka",
"Karkar-Yuri": "yuj",
"Karkin": "krb",
"Karko": "kko",
"Karnai": "bbv",
"Karo": "kxh",
"Karo Batak": "btx",
"Karok": "kyh",
"Karolanos": "kyn",
"Karon": "krx",
"Karon Dori": "kgw",
"Karore": "xkx",
"Karranga": "xrq",
"Karuwali": "rxw",
"Kasanga": "ccj",
"Kasem": "xsm",
"Kashaya": "kju",
"Kashmiri": "ks",
"Kashubian": "csb",
"Kasiguranin": "ksn",
"Kaska": "kkz",
"Kaskean": "zsk",
"Kaskihá": "gva",
"Kassite": "und-kas",
"Kassonke": "kao",
"Kasua": "khs",
"Kataang": "kgd",
"Katabaga": "ktq",
"Katawixi": "xat",
"Katembri": "sai-kat",
"Kathlamet": "nai-kat",
"Kathoriya Tharu": "tkt",
"Kathu": "ykt",
"Katkari": "kfu",
"Katla": "kcr",
"Kato": "ktw",
"Katso": "kaf",
"Katua": "kta",
"Katukina": "knt",
"Kaulong": "pss",
"Kaur": "vkk",
"Kaure": "bpp",
"Kaurna": "zku",
"Kauwera": "xau",
"Kavalan": "ckv",
"Kavet": "krv",
"Kawacha": "kcb",
"Kawaiisu": "xaw",
"Kawe": "kgb",
"Kawishana": "awd-kaw",
"Kawésqar": "alc",
"Kaxararí": "ktx",
"Kaxuyana": "kbb",
"Kaya": "zra",
"Kayabí": "kyz",
"Kayagar": "kyt",
"Kayan": "pdu",
"Kayan Mahakam": "xay",
"Kayan River Kayan": "xkn",
"Kayapa Kallahan": "kak",
"Kayapó": "txu",
"Kayardild": "gyd",
"Kayeli": "kzl",
"Kayong": "kxy",
"Kayort": "kyv",
"Kaytetye": "gbb",
"Kayupulau": "kzu",
"Kazakh": "kk",
"Kazukuru": "kzk",
"Ke'o": "xxk",
"Keak": "keh",
"Keapara": "khz",
"Kedah Malay": "meo",
"Kedang": "ksx",
"Keder": "kdy",
"Kehu": "khh",
"Kei": "kei",
"Keiga": "kec",
"Kein": "bmh",
"Keiyo": "eyo",
"Kela-Yela": "kel",
"Kelabit": "kzi",
"Keley-I Kallahan": "ify",
"Keliko": "kbo",
"Kelo": "xel",
"Kelon": "kyo",
"Kemak": "kem",
"Kembayan": "xem",
"Kemberano": "bzp",
"Kembra": "xkw",
"Kemezung": "dmo",
"Kemi Sami": "sjk",
"Kemiehua": "kfj",
"Kemtuik": "kmt",
"Kenaboi": "xbn",
"Kenati": "gat",
"Kendayan": "knx",
"Kendeje": "klf",
"Kendem": "kvm",
"Kenga": "kyq",
"Keningau Murut": "kxi",
"Keninjal": "knl",
"Kensiu": "kns",
"Kenswei Nsei": "ndb",
"Kenyan Sign Language": "xki",
"Kenyang": "ken",
"Kenyi": "lke",
"Keoru-Ahia": "xeu",
"Kepkiriwát": "kpn",
"Kepo'": "kuk",
"Kera": "ker",
"Kerak": "hhr",
"Kereho": "xke",
"Kerek": "krk",
"Kerewe": "ked",
"Kerewo": "kxz",
"Kerinci": "kvr",
"Kermanic": "xme-ker",
"Kesawai": "xes",
"Ket": "ket",
"Ketangalan": "kae",
"Kete": "kcv",
"Ketengban": "xte",
"Ketum": "ktt",
"Kewa": "kew",
"Keyagana": "kyg",
"Kgalagadi": "xkv",
"Khakas": "kjh",
"Khalaj": "klj",
"Khaling": "klr",
"Kham": "kjl",
"Khamnigan Mongol": "ykh",
"Khamti": "kht",
"Khamyang": "ksu",
"Khana": "ogo",
"Khandeshi": "khn",
"Khanty": "kca",
"Khao": "xao",
"Kharam Naga": "kfw",
"Kharia": "khr",
"Kharia Thar": "ksy",
"Khasa Prakrit": "inc-kha",
"Khasi": "kha",
"Khayo": "lko",
"Khazar": "zkz",
"Khe": "kqg",
"Khehek": "tlx",
"Khengkha": "xkf",
"Khetrani": "xhe",
"Khezha Naga": "nkh",
"Khiamniungan Naga": "kix",
"Khinalug": "kjj",
"Khirwar": "kwx",
"Khisa": "kqm",
"Khitan": "zkt",
"Khlor": "llo",
"Khlula": "ykl",
"Khmer": "km",
"Khmu": "kjg",
"Khoekhoe": "naq",
"Khoibu Naga": "nkb",
"Khoini": "xkc",
"Kholok": "ktc",
"Kholosi": "inc-kho",
"Khonso": "kxc",
"Khorasani Turkish": "kmz",
"Khorezmian Turkic": "zkh",
"Khotanese": "kho",
"Khowar": "khw",
"Khroskyabs": "jiq",
"Khua": "xhv",
"Khuen": "khf",
"Khumi Chin": "cnk",
"Khvarshi": "khv",
"Khwarezmian": "xco",
"Khwe": "xuu",
"Kháng": "kjm",
"Khün": "kkh",
"Kibala": "blv",
"Kibena": "bez",
"Kibet": "kie",
"Kibiri": "prm",
"Kichwa": "qwe-kch",
"Kickapoo": "kic",
"Kikai": "kzg",
"Kikami": "kcu",
"Kikuyu": "ki",
"Kildin Sami": "sjd",
"Kilit": "xme-klt",
"Kilivila": "kij",
"Kiliwa": "klb",
"Kilmeri": "kih",
"Kim": "kia",
"Kim Mun": "mji",
"Kimaama": "kig",
"Kimaragang": "kqr",
"Kimbu": "kiv",
"Kimbundu": "kmb",
"Kimki": "sbt",
"Kimré": "kqp",
"Kinabalian": "cbw",
"Kinalakna": "kco",
"Kinaray-a": "krj",
"Kinga": "zga",
"Kings River Yokuts": "nai-kry",
"Kinikinao": "gqn",
"Kinnauri": "kfk",
"Kintaq": "knq",
"Kinuku": "kkd",
"Kioko": "ues",
"Kiong": "kkm",
"Kiorr": "xko",
"Kiowa": "kio",
"Kipchak": "qwm",
"Kipfokomo": "pkb",
"Kipsigis": "sgc",
"Kiput": "kyi",
"Kir-Balar": "kkr",
"Kire": "geb",
"Kirfi": "kks",
"Kirike": "okr",
"Kirikiri": "kiy",
"Kirya-Konzel": "fkk",
"Kis": "kis",
"Kisa": "lks",
"Kisan": "xis",
"Kisankasa": "kqh",
"Kisar": "kje",
"Kisi": "kiz",
"Kistane": "gru",
"Kita Maninkakan": "mwk",
"Kitanemuk": "azc-ktn",
"Kitembo": "tbt",
"Kitja": "gia",
"Kitsai": "kii",
"Kituba": "ktu",
"Kiunum": "wei",
"Kla": "lda",
"Klallam": "clm",
"Klamath-Modoc": "kla",
"Klao": "klu",
"Klias River Kadazan": "kqt",
"Klingon": "tlh",
"Knaanic": "czk",
"Ko": "fuj",
"Koalib": "kib",
"Koasati": "cku",
"Koba": "kpd",
"Kobiana": "kcj",
"Kobol": "kgu",
"Kobon": "kpw",
"Koch": "kdq",
"Kochila Tharu": "thq",
"Koda": "cdz",
"Kodaku": "ksz",
"Kodava": "kfa",
"Kodeoha": "vko",
"Kodi": "kod",
"Kodia": "kwp",
"Koenoem": "kcs",
"Kofa": "kso",
"Kofei": "kpi",
"Kofyar": "kwl",
"Kohin": "kkx",
"Kohistani Shina": "plk",
"Koho": "kpm",
"Kohumono": "bcs",
"Koi": "kkt",
"Koibal": "zkb",
"Koireng": "nkd",
"Koitabu": "kqi",
"Koiwat": "kxt",
"Kok-Nar": "gko",
"Kok-Paponk": "okg",
"Kokata": "ktd",
"Kokborok": "trp",
"Koke": "kou",
"Koko-Bera": "kkp",
"Kokoda": "xod",
"Kokola": "kzn",
"Kokota": "kkk",
"Kol (Cameroon)": "biw",
"Kol (New Guinea)": "kol",
"Kola": "kvv",
"Kolami": "kfb",
"Kolbila": "klc",
"Kolhe": "ekl",
"Kolibugan Subanon": "skn",
"Kolom": "klm",
"Koluwawa": "klx",
"Kom (Cameroon)": "bkm",
"Kom (India)": "kmm",
"Koma": "kmy",
"Komba": "kpf",
"Kombai": "tyn",
"Kombio": "xbi",
"Komering": "kge",
"Komi-Permyak": "koi",
"Komi-Yazva": "urj-kya",
"Komi-Zyrian": "kpv",
"Kominimung": "xoi",
"Komo": "xom",
"Komodo": "kvh",
"Kompane": "kvp",
"Komyandaret": "kzv",
"Kon Keu": "kkn",
"Konabéré": "bbo",
"Konai": "kxw",
"Konda": "knd",
"Konda-Dora": "kfc",
"Kondekor": "gau",
"Koneraw": "kdw",
"Kongo": "kg",
"Konkani": "kok",
"Konkomba": "xon",
"Konni": "kma",
"Kono (Guinea)": "knu",
"Kono (Nigeria)": "klk",
"Kono (Sierra Leone)": "kno",
"Konomala": "koa",
"Konomihu": "nai-knm",
"Konongo": "kcz",
"Konyak Naga": "nbe",
"Konyanka Maninka": "mku",
"Konzo": "koo",
"Koonzime": "ozm",
"Koorete": "kqy",
"Kopar": "xop",
"Kopkaka": "opk",
"Korafe-Yegha": "kpr",
"Korak": "koz",
"Korana": "kqz",
"Korandje": "kcy",
"Korean": "ko",
"Korean Sign Language": "kvk",
"Koreguaje": "coe",
"Koresh-e Rostam": "okh",
"Korku": "kfq",
"Korlai Creole Portuguese": "vkp",
"Koro (India)": "jkr",
"Koro (New Guinea)": "kxr",
"Koro (Vanuatu)": "krf",
"Koro (West Africa)": "kfo",
"Koromfé": "kfz",
"Koromira": "kqj",
"Koronadal Blaan": "bpr",
"Koroni": "xkq",
"Korop": "krp",
"Koropó": "xxr",
"Koroshi": "ktl",
"Korowai": "khe",
"Korra Koraga": "kfd",
"Korubo": "xor",
"Korupun-Sela": "kpq",
"Korwa": "kfp",
"Koryak": "kpy",
"Kosadle": "kiq",
"Kosarek Yale": "kkl",
"Kosena": "kze",
"Koshin": "kid",
"Kosraean": "kos",
"Kota (Gabon)": "koq",
"Kota (India)": "kfe",
"Kota Bangun Kutai Malay": "mqg",
"Kota Marudu Talantang": "grm",
"Kota Marudu Tinagas": "ktr",
"Kotafon Gbe": "kqk",
"Kotava": "avk",
"Koti": "eko",
"Kott": "zko",
"Kou": "snz",
"Kouya": "kyf",
"Kovai": "kqb",
"Kove": "kvc",
"Kowaki": "xow",
"Kowiai": "kwh",
"Koy Sanjaq Surat": "kqd",
"Koya": "kff",
"Koyaga": "kga",
"Koyo": "koh",
"Koyra Chiini": "khq",
"Koyraboro Senni": "ses",
"Koyukon": "koy",
"Kpagua": "kuw",
"Kpala": "kpl",
"Kpan": "kpk",
"Kpasam": "pbn",
"Kpati": "koc",
"Kpatili": "kym",
"Kpee": "cpo",
"Kpelle": "kpe",
"Kpessi": "kef",
"Kplang": "kph",
"Krache": "kye",
"Krahô": "xra",
"Kraol": "rka",
"Krenak": "kqq",
"Kresh": "krs",
"Krevinian": "zkv",
"Kreye": "xre",
"Krikati-Timbira": "xri",
"Krim": "krm",
"Krio": "kri",
"Kriol": "rop",
"Krisa": "ksi",
"Kristang": "mcm",
"Krobu": "kxb",
"Krongo": "kgo",
"Kru'ng": "krr",
"Krymchak": "jct",
"Kryts": "kry",
"Kua": "tyu",
"Kua-nsi": "ykn",
"Kuamasi": "yku",
"Kuan": "uan",
"Kuanhua": "xnh",
"Kube": "kgf",
"Kubi": "kof",
"Kubo": "jko",
"Kubu": "kvb",
"Kucong": "lkc",
"Kudiya": "kfg",
"Kudmali": "kyw",
"Kudu-Camo": "kov",
"Kugama": "kow",
"Kugbo": "kes",
"Kugu-Muminh": "xmh",
"Kui (India)": "kxu",
"Kui (Indonesia)": "kvd",
"Kuijau": "dkr",
"Kuikúro": "kui",
"Kujarge": "vkj",
"Kuk": "kfn",
"Kukatja": "kux",
"Kukele": "kez",
"Kukkuzi": "urj-kuk",
"Kukna": "kex",
"Kuku-Mangk": "xmq",
"Kuku-Mu'inh": "xmp",
"Kuku-Thaypan": "typ",
"Kuku-Ugbanh": "ugb",
"Kuku-Uwanh": "uwa",
"Kuku-Yalanji": "gvn",
"Kula": "tpg",
"Kulaal": "glj",
"Kulere": "kul",
"Kulfa": "kxj",
"Kulina": "xpk",
"Kulisusu": "vkl",
"Kullu Pahari": "kfx",
"Kulon": "uon",
"Kulon-Pazeh": "uun",
"Kulung": "kle",
"Kumak": "nee",
"Kumalu": "ksl",
"Kumam": "kdi",
"Kuman": "kue",
"Kumaoni": "kfy",
"Kumarbhag Paharia": "kmj",
"Kumba": "ksm",
"Kumbainggar": "kgs",
"Kumbaran": "wkb",
"Kumbewaha": "xks",
"Kumeyaay": "nai-kum",
"Kumhali": "kra",
"Kumu": "kmw",
"Kumukio": "kuo",
"Kumyk": "kum",
"Kumzari": "zum",
"Kuna": "cuk",
"Kunama": "kun",
"Kunbarlang": "wlg",
"Kunda": "kdn",
"Kundal Shahi": "shd",
"Kunduvadi": "wku",
"Kung": "kfl",
"Kungarakany": "ggk",
"Kungardutyi": "gdt",
"Kunggari": "kgl",
"Kungkari": "lku",
"Kuni": "kse",
"Kuni-Boazi": "kvg",
"Kunigami": "xug",
"Kunimaipa": "kup",
"Kunja": "pep",
"Kunjen": "kjn",
"Kunyi": "njx",
"Kunza": "kuz",
"Kuo": "xuo",
"Kuot": "kto",
"Kupa": "kug",
"Kupang Malay": "mkn",
"Kupia": "key",
"Kupsabiny": "kpz",
"Kur": "kuv",
"Kura Ede Nago": "nqk",
"Kurama": "krh",
"Kuranko": "knk",
"Kuri": "nbn",
"Kuria": "kuj",
"Kurichiya": "kfh",
"Kurmukar": "kfv",
"Kurnai": "unn",
"Kurrama": "vku",
"Kurti": "ktm",
"Kurtjar": "gdj",
"Kurtöp": "xkz",
"Kurudu": "kjr",
"Kurukh": "kru",
"Kuruáya": "kyr",
"Kusaal": "kus",
"Kusaghe": "ksg",
"Kushi": "kuh",
"Kustenau": "awd-kus",
"Kusu": "ksv",
"Kusunda": "kgg",
"Kutang Ghale": "ght",
"Kutenai": "kut",
"Kutep": "kub",
"Kuthant": "xut",
"Kutto": "kpa",
"Kutu": "kdc",
"Kuturmi": "khj",
"Kuuk Thaayorre": "thd",
"Kuuk Yak": "uky",
"Kuuku-Ya'u": "kuy",
"Kuvale": "olu",
"Kuvi": "kxv",
"Kuwaa": "blh",
"Kuwaataay": "cwt",
"Kuwani": "paa-kwn",
"Kuy": "kdt",
"Kven": "fkv",
"Kw'adza": "wka",
"Kwa'": "bko",
"Kwaami": "ksq",
"Kwadi": "kwz",
"Kwaio": "kwd",
"Kwaja": "kdz",
"Kwak": "kwq",
"Kwak'wala": "kwk",
"Kwakum": "kwu",
"Kwalhioqua-Tlatskanai": "qwt",
"Kwama": "kmq",
"Kwambi": "kwm",
"Kwamera": "tnk",
"Kwami": "ktf",
"Kwamtim One": "okk",
"Kwang": "kvi",
"Kwanga": "kwj",
"Kwangali": "kwn",
"Kwanja": "knp",
"Kwanka": "bij",
"Kwanyama": "kj",
"Kwara'ae": "kwf",
"Kwasio": "nmg",
"Kwaya": "kya",
"Kwaza": "xwa",
"Kwegu": "xwg",
"Kwer": "kwr",
"Kwerba": "kwe",
"Kwerba Mamberamo": "xwr",
"Kwere": "cwe",
"Kwerisa": "kkb",
"Kwese": "kws",
"Kwesten": "kwt",
"Kwini": "gww",
"Kwinsu": "kuc",
"Kwinti": "kww",
"Kwoma": "kmo",
"Kwomtari": "kwo",
"Kyak": "bka",
"Kyaka": "kyc",
"Kyakala": "tuw-kkl",
"Kyan-Karyaw Naga": "nqq",
"Kyenele": "kql",
"Kyenga": "tye",
"Kyerung": "kgy",
"Kyrgyz": "ky",
"Kâte": "kmg",
"Kélé": "keb",
"Kómnzo": "paa-kom",
"La'bi": "lbi",
"Laal": "gdm",
"Laalaa": "cae",
"Laba": "lau",
"Label": "lbb",
"Labir": "jku",
"Labo": "mwi",
"Labo Phowa": "ypb",
"Laboya": "lmy",
"Labu": "lbu",
"Labuk-Kinabatangan Kadazan": "dtb",
"Lacandon": "lac",
"Lachi": "lbt",
"Lachiguiri Zapotec": "zpa",
"Lachixío Zapotec": "zpl",
"Ladakhi": "lbj",
"Ladin": "lld",
"Ladino": "lad",
"Ladji-Ladji": "llj",
"Laeko-Libuat": "lkl",
"Lafofa": "laf",
"Laghu": "lgb",
"Laghuu": "lgh",
"Lagwan": "kot",
"Laha (Indonesia)": "lhh",
"Laha (Vietnam)": "lha",
"Lahanan": "lhn",
"Lahnda": "lah",
"Lahta Karen": "kvt",
"Lahu": "lhu",
"Lahu Shi": "lhi",
"Lahul Lohar": "lhl",
"Lai": "cnh",
"Laimbue": "lmx",
"Laitu Chin": "clj",
"Laiyolo": "lji",
"Lak": "lbe",
"Laka": "lak",
"Lakalei": "lka",
"Lake Miwok": "lmw",
"Lakha": "lkh",
"Laki": "lki",
"Lakkia": "lbc",
"Lakon": "lkn",
"Lakondê": "lkd",
"Lakota": "lkt",
"Lakota Dida": "dic",
"Lala (New Guinea)": "nrz",
"Lala (South Africa)": "bnt-lal",
"Lala-Bisa": "leb",
"Lala-Roba": "lla",
"Lalana Chinantec": "cnl",
"Lama Bai": "lay",
"Lamaholot": "slp",
"Lamalera": "lmr",
"Lamang": "hia",
"Lamatuka": "lmq",
"Lamba": "lam",
"Lambadi": "lmn",
"Lambichhong": "lmh",
"Lambya": "lai",
"Lame": "bma",
"Lamenu": "lmu",
"Lamet": "lbn",
"Lamja-Dengsa-Tola": "ldh",
"Lamkang": "lmk",
"Lamma": "lev",
"Lamnso'": "lns",
"Lamogai": "lmg",
"Lampung Api": "ljp",
"Lamu": "llh",
"Lamu-Lamu": "lby",
"Lanas Lobu": "ruu",
"Landoma": "ldm",
"Lang'e": "yne",
"Langam": "lnm",
"Langbashe": "lna",
"Langi": "lag",
"Langnian Buyang": "yln",
"Lango (Sudan)": "lno",
"Lango (Uganda)": "laj",
"Lanima": "lnw",
"Lanoh": "lnh",
"Lao": "lo",
"Lao Naga": "nlq",
"Laomian": "lwm",
"Laopang": "lbg",
"Laos Sign Language": "lso",
"Lapaguía-Guivini Zapotec": "ztl",
"Lapine": "art-lap",
"Lapuyan Subanun": "laa",
"Laragia": "lrg",
"Larantuka Malay": "lrt",
"Lardil": "lbz",
"Larestani": "lrl",
"Larevat": "lrv",
"Larike-Wakasihu": "alo",
"Laro": "lro",
"Larteh": "lar",
"Laru": "lan",
"Lasalimu": "llm",
"Lasgerdi": "lsa",
"Lashi": "lsi",
"Lasi": "lss",
"Latgalian": "ltg",
"Latin": "la",
"Latu": "ltu",
"Latundê": "ltn",
"Latvian": "lv",
"Latvian Sign Language": "lsl",
"Lau": "llu",
"Laua": "luf",
"Lauan": "llx",
"Lauje": "law",
"Laura": "lur",
"Laurentian": "lre",
"Lautu Chin": "clt",
"Lavatbura-Lamusong": "lbv",
"Lave": "brb",
"Laven": "lbo",
"Lavukaleve": "lvk",
"Lawangan": "lbx",
"Lawi": "lvi",
"Lawu": "lwu",
"Lawunuia": "tgi",
"Layakha": "lya",
"Laz": "lzz",
"Laze": "tbq-laz",
"Lealao Chinantec": "cle",
"Leco": "lec",
"Ledo Kaili": "lew",
"Leelau": "ldk",
"Lefa": "lfa",
"Lega-Mwenga": "lgm",
"Lega-Shabunda": "lea",
"Legbo": "agb",
"Legenyem": "lcc",
"Lehali": "tql",
"Lehalurup": "urr",
"Leinong Naga": "lzn",
"Leipon": "lek",
"Lela": "dri",
"Lelak": "llk",
"Lele (Chad)": "lln",
"Lele (Congo)": "lel",
"Lele (Guinea)": "llc",
"Lele (New Guinea)": "lle",
"Lelemi": "lef",
"Lelepa": "lpa",
"Lembena": "leq",
"Lemerig": "lrz",
"Lemio": "lei",
"Lemnian": "xle",
"Lemolang": "ley",
"Lemoro": "ldj",
"Lenakel": "tnl",
"Lendu": "led",
"Lengilu": "lgi",
"Lengo": "lgr",
"Lengola": "lej",
"Lenje": "leh",
"Lenkau": "ler",
"Lenyima": "ldg",
"Leonese": "roa-leo",
"Lepcha": "lep",
"Lepki": "lpe",
"Lepontic": "xlp",
"Lere": "gnh",
"Lese": "les",
"Lesing-Gelimi": "let",
"Letemboi": "nms",
"Leti (Cameroon)": "leo",
"Leti (Indonesia)": "lti",
"Levuka": "lvu",
"Lewo": "lww",
"Lewo Eleng": "lwe",
"Lewotobi": "lwt",
"Leyigha": "ayi",
"Lezgi": "lez",
"Lhao Vo": "mhx",
"Lhokpu": "lhp",
"Li'o": "ljl",
"Liabuku": "lix",
"Liana-Seti": "ste",
"Liangmai Naga": "njn",
"Liberia Kpelle": "xpe",
"Liberian English": "lir",
"Libido": "liq",
"Libinza": "liz",
"Libon Bikol": "lbl",
"Liburnian": "xli",
"Libyan Arabic": "ayl",
"Libyan Sign Language": "lbs",
"Ligbi": "lig",
"Ligenza": "lgz",
"Ligurian": "lij",
"Lihir": "lih",
"Lika": "lik",
"Liki": "lio",
"Likila": "lie",
"Likuba": "kxx",
"Likum": "lib",
"Likwala": "kwc",
"Lilau": "lll",
"Lillooet": "lil",
"Limassa": "bme",
"Limbu": "lif",
"Limbum": "lmp",
"Limburgish": "li",
"Limi": "ylm",
"Limilngan": "lmc",
"Limos Kalinga": "kmk",
"Lindu": "klw",
"Linear A": "lab",
"Lingala": "ln",
"Lingao": "onb",
"Lingkhim": "lii",
"Lingua Franca Nova": "lfn",
"Linngithigh": "lnj",
"Lipan": "apl",
"Lipo": "lpo",
"Lisabata-Nuniali": "lcs",
"Lisela": "lcl",
"Lish": "lsh",
"Lishana Deni": "lsd",
"Lishanid Noshan": "aij",
"Lishán Didán": "trg",
"Lisu": "lis",
"Literary Chinese": "lzh",
"Lithuanian": "lt",
"Lithuanian Sign Language": "lls",
"Little Swanport": "aus-lsw",
"Litzlitz": "lzl",
"Livonian": "liv",
"Livvi": "olo",
"Lizu": "sit-liz",
"Lo-Toga": "lht",
"Loarki": "lrk",
"Lobala": "loq",
"Lobi": "lob",
"Lodhi": "lbm",
"Logba": "lgq",
"Logo": "log",
"Logol": "lof",
"Logooli": "rag",
"Logorik": "liu",
"Lojban": "jbo",
"Lokaa": "yaz",
"Loko": "lok",
"Lokoya": "lky",
"Lola": "lcd",
"Lolak": "llq",
"Lole": "llg",
"Lolo": "llb",
"Loloda": "loa",
"Lolopo": "ycl",
"Lomaiviti": "lmv",
"Lomakka": "loi",
"Lomavren": "rmi",
"Lombard": "lmo",
"Lombi": "lmi",
"Lombo": "loo",
"Lomwe": "ngl",
"Loncong": "lce",
"Long Phuri Naga": "lpn",
"Long Wat": "ttw",
"Longgu": "lgu",
"Longto": "wok",
"Longuda": "lnu",
"Loniu": "los",
"Lonwolwol": "crc",
"Loo": "ldo",
"Looma": "lom",
"Lopa": "lop",
"Lopi": "lov",
"Lopit": "lpx",
"Lorang": "lrn",
"Lorediakarkar": "lnn",
"Lorrain": "roa-lor",
"Lote": "uvl",
"Lotha Naga": "njh",
"Lotud": "dtr",
"Lotuko": "lot",
"Lou": "loj",
"Louisiana Creole": "lou",
"Loun": "lox",
"Loup A": "xlo",
"Loup B": "xlb",
"Lovono": "vnk",
"Low German": "nds",
"Lower Burdekin": "xbb",
"Lower Chehalis": "cea",
"Lower Grand Valley Dani": "dni",
"Lower Nossob": "nsb",
"Lower Sorbian": "dsb",
"Lower Southern Aranda": "axl",
"Lower Ta'oih": "tto",
"Lower Tanana": "taa",
"Lowland Oaxaca Chontal": "clo",
"Lowland Tarahumara": "tac",
"Loxicha Zapotec": "ztp",
"Lozi": "loz",
"Luang": "lex",
"Luba-Kasai": "lua",
"Luba-Katanga": "lu",
"Lubila": "kcc",
"Lubu": "lcf",
"Lubuagan Kalinga": "knb",
"Luchazi": "lch",
"Lucumí": "luq",
"Ludian": "lud",
"Lufu": "ldq",
"Luganda": "lg",
"Lugbara": "lgg",
"Luguru": "ruf",
"Luhu": "lcq",
"Luhya": "luy",
"Luimbi": "lum",
"Luiseño": "lui",
"Lukpa": "dop",
"Lule": "ule",
"Lule Sami": "smj",
"Lumba-Yakkha": "luu",
"Lumbee": "lmz",
"Lumbu": "lup",
"Lumun": "lmd",
"Lun Bawang": "lnd",
"Luna": "luj",
"Lunanakha": "luk",
"Lunda": "lun",
"Lungga": "lga",
"Luo": "luo",
"Luopohe Hmong": "hml",
"Luri (Nigeria)": "ldd",
"Lusengo": "lse",
"Lushootseed": "lut",
"Lusi": "khl",
"Lusitanian": "xls",
"Lutachoni": "lts",
"Lutos": "ndy",
"Luvale": "lue",
"Luwati": "luv",
"Luwian": "xlu",
"Luwo": "lwo",
"Luxembourgish": "lb",
"Luyana": "lyn",
"Lwalu": "lwa",
"Lwel": "bnt-lwl",
"Lycian": "xlc",
"Lydian": "xld",
"Lyngngam": "lyg",
"Lyélé": "lee",
"Láadan": "ldn",
"Láá Láá Bwamu": "bwj",
"Lü": "khb",
"Ma": "msj",
"Ma Manda": "skc",
"Ma'anyan": "mhy",
"Ma'di": "mhi",
"Ma'ya": "slz",
"Maa": "cma",
"Maaka": "mew",
"Maale": "mdy",
"Maasai": "mas",
"Maay": "ymm",
"Maba": "mqa",
"Mabaale": "mmz",
"Mabaan": "mfz",
"Mabaka Valley Kalinga": "kkg",
"Mabire": "muj",
"Maca": "mca",
"Macaguaje": "mcl",
"Macaguán": "mbn",
"Macanese": "mzs",
"Macau Pidgin Portuguese": "crp-mpp",
"Macedonian": "mk",
"Machame": "jmc",
"Machiguenga": "mcb",
"Machinere": "mpd",
"Machinga": "mvw",
"Macoris": "nai-mac",
"Macuna": "myy",
"Macushi": "mbc",
"Mada (Cameroon)": "mxu",
"Mada (Nigeria)": "mda",
"Madagascar Sign Language": "mzc",
"Madak": "mmx",
"Maden": "xmx",
"Madhi Madhi": "dmd",
"Madi": "grg",
"Madngele": "zml",
"Madukayang Kalinga": "kmd",
"Madurese": "mad",
"Mae": "mme",
"Maek": "hmk",
"Maeng Itneg": "itt",
"Mafa": "maf",
"Mafea": "mkv",
"Mag-Anchi Ayta": "sgb",
"Mag-Indi Ayta": "blx",
"Magadhi Prakrit": "inc-mgd",
"Magahat": "mtw",
"Magahi": "mag",
"Magdalena Peñasco Mixtec": "xtm",
"Magiyi": "gmg",
"Magoma": "gmx",
"Magori": "zgr",
"Maguindanao": "mdh",
"Magɨ": "gkd",
"Mahali": "mjx",
"Maharastri Prakrit": "pmh",
"Mahasu Pahari": "bfz",
"Mahican": "mjy",
"Mahongwe": "mhb",
"Mahou": "mxx",
"Maia": "sks",
"Maiadomu": "mzz",
"Maiani": "tnh",
"Maii": "mmm",
"Mailu": "mgu",
"Maindo": "cwb",
"Mairasi": "zrs",
"Maisin": "mbq",
"Maithili": "mai",
"Maiwa (Indonesia)": "wmm",
"Maiwa (New Guinea)": "mti",
"Maiwala": "mum",
"Majang": "mpe",
"Majera": "xmj",
"Majhi": "mjz",
"Majhwar": "mmj",
"Mak (China)": "mkg",
"Mak (Nigeria)": "pbl",
"Makaa": "mcp",
"Makah": "myh",
"Makalero": "mjb",
"Makasae": "mkz",
"Makasar": "mak",
"Makassar Malay": "mfp",
"Makayam": "aup",
"Makhuwa": "vmw",
"Makhuwa-Marrevone": "xmc",
"Makhuwa-Meetto": "mgh",
"Makhuwa-Moniga": "mhm",
"Makhuwa-Saka": "xsq",
"Makhuwa-Shirima": "vmk",
"Maklew": "mgf",
"Makolkol": "zmh",
"Makonde": "kde",
"Maku": "xak",
"Maku'a": "lva",
"Makuri Naga": "jmn",
"Makuráp": "mpu",
"Makwe": "ymk",
"Makyan Naga": "umn",
"Mal": "mlf",
"Mal Paharia": "mkb",
"Mala (New Guinea)": "ped",
"Mala (Nigeria)": "ruy",
"Mala Malasar": "ima",
"Malaccan Creole Malay": "ccm",
"Malagasy": "mg",
"Malalamai": "mmt",
"Malalí": "sai-mal",
"Malango": "mln",
"Malankuravan": "mjo",
"Malapandaram": "mjp",
"Malaryan": "mjq",
"Malas": "mkr",
"Malasanga": "mqz",
"Malasar": "ymr",
"Malavedan": "mjr",
"Malawi Lomwe": "lon",
"Malawian Sign Language": "lws",
"Malay": "ms",
"Malayalam": "ml",
"Malayic Dayak": "xdy",
"Malaynon": "mlz",
"Malaysian Sign Language": "xml",
"Malba Birifor": "bfo",
"Male": "mdc",
"Malecite-Passamaquoddy": "pqm",
"Maleng": "pkt",
"Maleu-Kilenge": "mgl",
"Malfaxal": "mlx",
"Malgana": "vml",
"Malgbe": "mxf",
"Mali": "gcc",
"Malibu": "sai-mlb",
"Malila": "mgq",
"Malimba": "mzd",
"Malimpung": "mli",
"Malinaltepec Tlapanec": "tcf",
"Malol": "mbk",
"Maltese": "mt",
"Maltese Sign Language": "mdl",
"Malua Bay": "mll",
"Malvi": "mup",
"Maléku Jaíka": "gut",
"Mam": "mam",
"Mama": "mma",
"Mamaa": "mhf",
"Mamaindé": "wmd",
"Mamanwa": "mmn",
"Mamara Senoufo": "myk",
"Mamasa": "mqj",
"Mambae": "mgm",
"Mambai": "mcs",
"Mamboru": "mvd",
"Mambwe-Lungu": "mgr",
"Mampruli": "maw",
"Mamuju": "mqx",
"Mamulique": "emm",
"Mamusi": "kdf",
"Mamvu": "mdi",
"Man Met": "mml",
"Manado Malay": "xmm",
"Manam": "mva",
"Manambu": "mle",
"Manangba": "nmm",
"Manangkari": "znk",
"Manao": "awd-man",
"Manchu": "mnc",
"Manda (Australia)": "zma",
"Manda (India)": "mha",
"Manda (Tanzania)": "mgs",
"Mandahuaca": "mht",
"Mandaic": "mid",
"Mandailing Batak": "btm",
"Mandalorian": "art-man",
"Mandan": "mhq",
"Mandandanyi": "zmk",
"Mandar": "mdr",
"Mandara": "tbf",
"Mandari": "mqu",
"Mandarin": "cmn",
"Mandeali": "mjl",
"Mander": "mqr",
"Mandingo": "man",
"Mandinka": "mnk",
"Mandjak": "mfv",
"Mandobo Atas": "aax",
"Mandobo Bawah": "bwp",
"Manem": "jet",
"Mang": "zng",
"Mangala": "mem",
"Mangarayi": "mpc",
"Mangarevan": "mrv",
"Mangas": "zns",
"Mangayat": "myj",
"Mangbetu": "mdj",
"Mangbutu": "mdk",
"Mangerr": "zme",
"Mangga Buang": "mmo",
"Manggarai": "mqy",
"Mangghuer": "xgn-mgr",
"Mango": "mge",
"Mangole": "mqc",
"Mangseng": "mbh",
"Manigri-Kambolé Ede Nago": "xkb",
"Manikion": "mnx",
"Manipa": "mqp",
"Manipuri": "mni",
"Mankanya": "knf",
"Mankiyali": "nlm",
"Manna-Dora": "mju",
"Mannan": "mjv",
"Mano": "mev",
"Manombai": "woo",
"Mansaka": "msk",
"Mansi": "mns",
"Mansoanka": "msw",
"Manta": "myg",
"Mantsi": "nty",
"Manumanaw Karen": "kxf",
"Manusela": "wha",
"Manx": "gv",
"Manya": "mzj",
"Manyawa": "mny",
"Manza": "mzv",
"Mao Naga": "nbi",
"Maonan": "mmd",
"Maore Comorian": "swb",
"Maori": "mi",
"Mape": "mlh",
"Mapena": "mnm",
"Mapia": "mpy",
"Mapidian": "mpw",
"Mapos Buang": "bzh",
"Mapoyo": "mcg",
"Mapudungun": "arn",
"Mapun": "sjm",
"Maquiritari": "mch",
"Mara": "mec",
"Mara Chin": "mrh",
"Marachi": "lri",
"Maraghei": "vmh",
"Maragus": "mrs",
"Maram Naga": "nma",
"Marama": "lrm",
"Maranao": "mrw",
"Maranungku": "zmr",
"Mararit": "mgb",
"Marathi": "mr",
"Maratino": "sai-mar",
"Marau": "mvr",
"Marawan": "awd-mar",
"Marba": "mpg",
"Marenje": "vmr",
"Marfa": "mvu",
"Margany": "zmc",
"Marghi South": "mfm",
"Margi": "mrt",
"Margu": "mhg",
"Maria": "mds",
"Mariaté": "awd-mrt",
"Maricopa": "mrc",
"Maridan": "zmd",
"Maridjabin": "zmj",
"Marik": "dad",
"Marimanindji": "zmm",
"Marind": "mrz",
"Maring": "mbw",
"Maring Naga": "nng",
"Maringarr": "zmt",
"Marino": "mrb",
"Mariri": "mqi",
"Maritime Sign Language": "nsr",
"Maritsauá": "msp",
"Mariupol Greek": "grk-mar",
"Mariyedi": "zmy",
"Marka": "rkm",
"Markweeta": "enb",
"Marma": "rmz",
"Maroon Spirit Language": "cpe-mar",
"Marovo": "mvo",
"Marriammu": "xru",
"Marrithiyel": "mfr",
"Marrucinian": "umc",
"Marshallese": "mh",
"Marsian": "ims",
"Martha's Vineyard Sign Language": "mre",
"Marti Ke": "zmg",
"Martu Wangka": "mpj",
"Martuthunira": "vma",
"Marwari": "mwr",
"Marúbo": "mzr",
"Masaba": "myx",
"Masadiit Itneg": "tis",
"Masakará": "sai-msk",
"Masalit": "mls",
"Masana": "mcn",
"Masbate Sorsogon": "bks",
"Masbatenyo": "msb",
"Mashco Piro": "cuj",
"Mashi": "mho",
"Masimasi": "ism",
"Masiwang": "bnf",
"Maskelynes": "klv",
"Maslam": "msv",
"Masmaje": "mes",
"Massachusett": "wam",
"Massalat": "mdg",
"Massep": "mvs",
"Matagalpa": "mtn",
"Matal": "mfh",
"Matanawi": "sai-mat",
"Matbat": "xmt",
"Matengo": "mgv",
"Matepi": "mqe",
"Matigsalug Manobo": "mbt",
"Matipuhy": "mzo",
"Matlatzinca": "mat",
"Mato": "met",
"Mato Grosso Arára": "axg",
"Mator": "mtm",
"Matsés": "mcf",
"Mattole": "mvb",
"Matukar": "mjk",
"Matumbi": "mgw",
"Matya Samo": "stj",
"Matís": "mpq",
"Maung": "mph",
"Mauritian Creole": "mfe",
"Mauritian Sign Language": "lsy",
"Mauwake": "mhl",
"Mawa": "mcw",
"Mawak": "mjj",
"Mawan": "mcz",
"Mawayana": "mzx",
"Mawchi": "mke",
"Mawes": "mgk",
"Maxakalí": "mbl",
"Maxi Gbe": "mxl",
"Maya Samo": "sym",
"Mayaguduna": "xmy",
"Mayangna": "yan",
"Mayawali": "yxa",
"Maybrat": "ayz",
"Mayeka": "myc",
"Mayi-Thakurti": "xyt",
"Maykulan": "mnt",
"Maynas": "sai-mys",
"Mayo": "mfy",
"Mayogo": "mdm",
"Mayoyao Ifugao": "ifu",
"Maypure": "awd-mpr",
"Mazagway": "dkx",
"Mazaltepec Zapotec": "zpy",
"Mazanderani": "mzn",
"Mazatlán Mazatec": "vmz",
"Mazatlán Mixe": "mzl",
"Mba": "mfc",
"Mbabaram": "vmb",
"Mbala": "mdp",
"Mbalanhu": "lnb",
"Mbandja": "zmz",
"Mbangala": "mxg",
"Mbangi": "mgn",
"Mbangwe": "zmn",
"Mbara (Australia)": "mvl",
"Mbara (Chad)": "mpk",
"Mbariman-Gudhinma": "zmv",
"Mbati": "mdn",
"Mbato": "gwa",
"Mbay": "myb",
"Mbe": "mfo",
"Mbe'": "mtk",
"Mbelime": "mql",
"Mbere": "mdt",
"Mbesa": "zms",
"Mbiywom": "aus-mbi",
"Mbo (Cameroon)": "mbo",
"Mbo (Congo)": "zmw",
"Mboi": "moi",
"Mboko": "mdu",
"Mbole": "mdq",
"Mbonga": "xmb",
"Mbongno": "bgu",
"Mbosi": "mdw",
"Mbowe": "mxo",
"Mbre": "mka",
"Mbu'": "muc",
"Mbudum": "xmd",
"Mbugu": "mhd",
"Mbugwe": "mgz",
"Mbuko": "mqb",
"Mbukushu": "mhw",
"Mbula": "mna",
"Mbula-Bwazza": "mbu",
"Mbule": "mlb",
"Mbulungish": "mbv",
"Mbum": "mdd",
"Mbunda": "mck",
"Mbunga": "mgy",
"Mburku": "bbt",
"Mbuun": "zmp",
"Mbwela": "mfu",
"Mbyá Guaraní": "gun",
"Me'en": "mym",
"Mea": "meg",
"Mebu": "mjn",
"Mecayapan Nahuatl": "nhx",
"Medebur": "mjm",
"Medefaidrin": "dmf",
"Media Lengua": "mue",
"Mednyj Aleut": "mud",
"Medumba": "byv",
"Mefele": "mfj",
"Megam": "mef",
"Megleno-Romanian": "ruq",
"Mehek": "nux",
"Mehináku": "mmh",
"Mehri": "gdq",
"Mekeo": "mek",
"Mekmek": "mvk",
"Mekwei": "msf",
"Mel-Khaonh": "hkn",
"Mele-Fila": "mxe",
"Melo": "mfx",
"Melpa": "med",
"Memoni": "mby",
"Mendalam Kayan": "xkd",
"Mendankwe-Nkwen": "mfd",
"Mende": "men",
"Mengaka": "xmg",
"Mengen": "mee",
"Menien": "sai-men",
"Menka": "mea",
"Menominee": "mez",
"Mentawai": "mwv",
"Menya": "mcr",
"Meoswar": "mvx",
"Mer": "mnu",
"Meramera": "mxm",
"Merei": "lmb",
"Merey": "meq",
"Meriam": "ulk",
"Merlav": "mrm",
"Meroitic": "xmr",
"Meru": "mer",
"Mesaka": "iyo",
"Mese": "mci",
"Mesme": "zim",
"Mesmes": "mys",
"Mesqan": "mvz",
"Messapic": "cms",
"Meta'": "mgo",
"Metlatónoc Mixtec": "mxv",
"Mewari": "mtr",
"Mewati": "wtm",
"Mexican Sign Language": "mfs",
"Meyah": "mej",
"Mezontla Popoloca": "pbe",
"Mezquital Otomi": "ote",
"Meänkieli": "fit",
"Mfinu": "zmf",
"Mfumte": "nfu",
"Mgbo": "gmz",
"Mi'kmaq": "mic",
"Miami": "mia",
"Mian": "mpt",
"Miani": "pla",
"Michif": "crg",
"Michigamea": "cmm",
"Michoacán Mazahua": "mmc",
"Michoacán Nahuatl": "ncl",
"Mid Grand Valley Dani": "dnt",
"Mid-Southern Banda": "bjo",
"Middle Armenian": "axm",
"मध्य असमिया": "inc-mas",
"Middle Bengali": "inc-mbn",
"Middle Breton": "xbm",
"Middle Chinese": "ltc",
"Middle Cornish": "cnx",
"Middle Dutch": "dum",
"Middle English": "enm",
"Middle French": "frm",
"Middle Gujarati": "inc-mgu",
"Middle High German": "gmh",
"Middle Irish": "mga",
"Middle Kannada": "dra-mkn",
"Middle Khmer": "xhm",
"Middle Korean": "okm",
"Middle Low German": "gml",
"Middle Median": "xme-mid",
"Middle Mon": "mkh-mmn",
"Middle Mongol": "xng",
"Middle Newar": "nwx",
"Middle Norwegian": "gmq-mno",
"Middle Oriya": "inc-mor",
"Middle Persian": "pal",
"Middle Vietnamese": "mkh-mvi",
"Middle Watut": "mpl",
"Middle Welsh": "wlm",
"Midob": "mei",
"Migaama": "mmy",
"Migabac": "mpp",
"Miji": "sjl",
"Miju": "mxj",
"Mikasuki": "mik",
"Milang": "und-mil",
"Mili": "ymh",
"Millcayac": "sai-mil",
"Miltu": "mlj",
"Miluk": "iml",
"Milyan": "imy",
"Mimi of Decorse": "und-mmd",
"Mimi of Nachtigal": "und-mmn",
"Min Bei": "mnp",
"Min Dong": "cdo",
"Min Nan": "nan",
"Min Zhong": "czo",
"Mina": "hna",
"Minaean": "inm",
"Minang": "xrg",
"Minangkabau": "min",
"Minanibai": "mcv",
"Minaveha": "mvn",
"Minderico": "drc",
"Mindiri": "mpn",
"Mingang Doso": "mko",
"Mingo": "iro-min",
"Mingrelian": "xmf",
"Minica Huitoto": "hto",
"Minidien": "wii",
"Minigir": "vmg",
"Minjungbal": "xjb",
"Minkin": "xxm",
"Minoan": "omn",
"Minokok": "mqq",
"Minriq": "mnq",
"Mintil": "mzt",
"Miqie": "yiq",
"Mirandese": "mwl",
"Miraya Bikol": "rbl",
"Mire": "mvh",
"Mirgan": "zrg",
"Miriti": "mmv",
"Miriwoong Sign Language": "rsm",
"Miriwung": "mep",
"Mirpur Panjabi": "pmu",
"Misantla Totonac": "tlc",
"Miship": "mjs",
"Misima-Paneati": "mpx",
"Mising": "mrg",
"Miskito": "miq",
"Mitla Zapotec": "zaw",
"Mitlatongo Mixtec": "vmm",
"Mittu": "mwu",
"Mituku": "zmq",
"Miu": "mpo",
"Miwa": "vmi",
"Mixed Great Andamanese": "gac",
"Mixifore": "mfg",
"Mixtepec Mixtec": "mix",
"Mixtepec Zapotec": "zpm",
"Miya": "mkf",
"Miyako": "mvi",
"Miyobe": "soy",
"Mizo": "lus",
"Mlabri": "mra",
"Mlahsö": "lhs",
"Mlap": "kja",
"Mlomp": "mlo",
"Mmaala": "mmu",
"Mmani": "buy",
"Mmen": "bfm",
"Mo": "wkd",
"Mo'da": "gbn",
"Moabite": "obm",
"Moba": "mfq",
"Mobilian": "mod",
"Mobumrin Aizi": "ahm",
"Mocana": "sai-mcn",
"Mochi": "old",
"Mochica": "omc",
"Mocho": "mhc",
"Mocoví": "moc",
"Modang": "mxd",
"Modole": "mqo",
"Moere": "mvq",
"Mofu-Gudur": "mif",
"Mogholi": "mhj",
"Mogum": "mou",
"Mohawk": "moh",
"Mohegan-Pequot": "xpq",
"Moi (Congo)": "mow",
"Moi (Indonesia)": "mxn",
"Moikodi": "mkp",
"Moingi": "mwz",
"Mojave": "mov",
"Moji": "ymi",
"Mok": "mqt",
"Moken": "mwt",
"Mokerang": "mft",
"Mokilese": "mkj",
"Moklen": "mkm",
"Mokole": "mkl",
"Mokpwe": "bri",
"Moksha": "mdf",
"Molale": "mbe",
"Molbog": "pwm",
"Moldova Sign Language": "vsi",
"Molengue": "bxc",
"Molima": "mox",
"Molmo One": "aun",
"Molo": "zmo",
"Molof": "msl",
"Moloko": "mlw",
"Mom Jango": "ver",
"Moma": "myl",
"Momare": "msz",
"Mombo Dogon": "dmb",
"Mombum": "mso",
"Momina": "mmb",
"Momuna": "mqf",
"Mon": "mnw",
"Monastic Sign Language": "mzg",
"Mondropolon": "npn",
"Mondé": "mnd",
"Mongghul": "xgn-mgl",
"Mongo": "lol",
"Mongol": "mgt",
"Mongolian": "mn",
"Mongolian Sign Language": "msr",
"Mongondow": "mog",
"Moni": "mnz",
"Monimbo": "mom",
"Mono (California)": "mnr",
"Mono (Cameroon)": "mru",
"Mono (Congo)": "mnh",
"Monom": "moo",
"Monsang Naga": "nmh",
"Montagnais": "moe",
"Montana Salish": "fla",
"Montol": "mtl",
"Monumbo": "mxk",
"Monzombo": "moj",
"Moo": "gwg",
"Moore": "mos",
"Moose Cree": "crm",
"Mopan Maya": "mop",
"Mor (Austronesian)": "mhz",
"Mor (Papuan)": "moq",
"Moraid": "msg",
"Moran": "sit-mor",
"Morawa": "mze",
"Morelos Nahuatl": "nhm",
"Morerebi": "xmo",
"Moresada": "msx",
"Mori Atas": "mzq",
"Mori Bawah": "xmz",
"Morigi": "mdb",
"Moro": "mor",
"Moroccan Amazigh": "zgh",
"Moroccan Arabic": "ary",
"Moroccan Sign Language": "xms",
"Morokodo": "mgc",
"Morom": "bdo",
"Moronene": "mqn",
"Morori": "mok",
"Morouas": "mrp",
"Mortlockese": "mrl",
"Moru": "mgd",
"Mosimo": "mqv",
"Moskona": "mtj",
"Mota": "mtt",
"Motembo": "tmv",
"Motu": "meu",
"Mouk-Aria": "mwh",
"Mount Iraya Agta": "atl",
"Mount Iriga Agta": "agz",
"Mountain Koiari": "kpx",
"Mouwase": "jmw",
"Movima": "mzp",
"Moyadan Itneg": "ity",
"Moyon Naga": "nmo",
"Mozambican Sign Language": "mzy",
"Mozarabic": "mxi",
"Mpade": "mpi",
"Mpalitjanh": "xpj",
"Mpi": "mpz",
"Mpiemo": "mcx",
"Mpiin": "bnt-mpi",
"Mpinda": "pnd",
"Mpongmpong": "mgg",
"Mpoto": "mpa",
"Mpotovoro": "mvt",
"Mpuono": "bnt-mpu",
"Mpur": "akc",
"Mro Chin": "cmr",
"Mru": "mro",
"Mser": "kqx",
"Muak Sa-aak": "ukk",
"Mualang": "mtd",
"Mubami": "tsx",
"Mubi": "mub",
"Mucuchí": "sai-muc",
"Muda": "ymd",
"Mudburra": "dmw",
"Mudu Koraga": "vmd",
"Muduapa": "wiv",
"Muduga": "udg",
"Muellama": "sai-mue",
"Mufian": "aoj",
"Muher": "sem-mhr",
"Muinane": "bmr",
"Mukha-Dora": "mmk",
"Mukulu": "moz",
"Mulaha": "mfw",
"Mulam": "mlm",
"Mulao": "giu",
"Mullu Kurumba": "kpb",
"Mullukmulluk": "mpb",
"Muluridyi": "vmu",
"Mum": "kqa",
"Mumuye": "mzm",
"Muna": "mnb",
"Munda": "unx",
"Mundabli": "boe",
"Mundang": "mua",
"Mundani": "mnf",
"Mundari": "unr",
"Mundat": "mmf",
"Mundolinco": "art-mun",
"Mundurukú": "myu",
"Mungaka": "mhk",
"Mungbam": "mij",
"Munggui": "mth",
"Mungkip": "mpv",
"Muniche": "myr",
"Munit": "mtc",
"Munji": "mnj",
"Munsee": "umu",
"Muong": "mtq",
"Mur Pano": "tkv",
"Muratayak": "asx",
"Murik (Malaysia)": "mxr",
"Murik (New Guinea)": "mtf",
"Murkim": "rmh",
"Murle": "mur",
"Murrinh-Patha": "mwf",
"Mursi": "muz",
"Murui Huitoto": "huu",
"Murupi": "mqw",
"Muruwari": "zmu",
"Musan": "mmp",
"Musar": "mmi",
"Musasa": "smm",
"Musey": "mse",
"Musgu": "mug",
"Musi": "mui",
"Muskum": "mje",
"Musom": "msu",
"Mussau-Emira": "emi",
"Muthuvan": "muv",
"Mutu": "tuc",
"Muya": "mvm",
"Muyang": "muy",
"Muyuw": "myw",
"Muzi": "ymz",
"Muzo": "sai-muz",
"Mvanip": "mcj",
"Mvuba": "mxh",
"Mwaghavul": "sur",
"Mwali Comorian": "wlc",
"Mwan": "moa",
"Mwani": "wmw",
"Mwatebu": "mwa",
"Mwera": "mwe",
"Mwimbi-Muthambi": "mws",
"Mwotlap": "mlv",
"Mycenaean Greek": "gmy",
"Myene": "mye",
"Mysian": "yms",
"Mzieme Naga": "nme",
"Mághdì": "gmd",
"Mòcheno": "mhn",
"Mün Chin": "mwq",
"Mündü": "muh",
"N'Ko": "nqo",
"Na": "nbt",
"Na'vi": "art-nav",
"Naaba": "nao",
"Naba": "mne",
"Nabak": "naf",
"Nabi": "mty",
"Nachering": "ncd",
"Nadruvian": "ndf",
"Nadëb": "mbj",
"Nafaanra": "nfr",
"Nafi": "srf",
"Nafri": "nxx",
"Naga Pidgin": "nag",
"Nagarchal": "nbg",
"Nage": "nxe",
"Nagtipunan Agta": "phi-nag",
"Nagu": "ngr",
"Nagumi": "ngv",
"Nahali": "nlx",
"Nahari": "nhh",
"Nahavaq": "sns",
"Nahuatl": "nah",
"Nai": "bio",
"Najdi Arabic": "ars",
"Naka'ela": "nae",
"Nakai": "nkj",
"Nakame": "nib",
"Nakanai": "nak",
"Nakara": "nck",
"Nake": "nbk",
"Naki": "mff",
"Nakwi": "nax",
"Nalca": "nlc",
"Nali": "nss",
"Nalik": "nal",
"Nalu": "naj",
"Naluo Yi": "ylo",
"Nalögo": "nlz",
"Namakura": "nmk",
"Namat": "nkm",
"Nambikwara": "nab",
"Nambo": "ncm",
"Nambya": "nmq",
"Namia": "nnm",
"Namiae": "nvm",
"Namibian Sign Language": "nbs",
"Namla": "naa",
"Namo": "mxw",
"Namonuito": "nmt",
"Namosi-Naitasiri-Serua": "bwb",
"Namuyi": "nmy",
"Nanai": "gld",
"Nancere": "nnc",
"Nande": "nnb",
"Nandi": "niq",
"Nanerigé Sénoufo": "sen",
"Nanga Dama Dogon": "nzz",
"Nankina": "nnk",
"Nanti": "cox",
"Nanticoke": "nnt",
"Nanubae": "afk",
"Naolan": "nai-nao",
"Napu": "npy",
"Nar Phu": "npa",
"Nara": "nrb",
"Narak": "nac",
"Narango": "nrg",
"Narau": "nxu",
"Narim": "loh",
"Naro": "nhr",
"Narom": "nrm",
"Narragansett": "xnt",
"Narua": "nru",
"Narungga": "nnr",
"Nasal": "nsy",
"Nasarian": "nvh",
"Nasioi": "nas",
"Naskapi": "nsk",
"Nasu": "ywq",
"Natagaimas": "nts",
"Natchez": "ncz",
"Nateni": "ntm",
"Nathembo": "nte",
"Natioro": "nti",
"Natú": "sai-nat",
"Natügu": "ntu",
"Nauete": "nxa",
"Naukanski": "ynk",
"Nauna": "ncn",
"Nauo": "nwo",
"Nauruan": "na",
"Navajo": "nv",
"Navarro-Aragonese": "roa-oan",
"Navut": "nsw",
"Nawaru": "nwr",
"Nawathinehena": "nwa",
"Nawdm": "nmz",
"Nawuri": "naw",
"Naxi": "nxq",
"Nayi": "noz",
"Ncane": "ncr",
"Nchumbulu": "nlu",
"Nda'nda'": "nnz",
"Ndai": "gke",
"Ndaka": "ndk",
"Ndali": "ndh",
"Ndam": "ndm",
"Ndamba": "ndj",
"Ndambomo": "nxo",
"Ndasa": "nda",
"Ndau": "ndc",
"Nde-Gbite": "ned",
"Nde-Nsele-Nta": "ndd",
"Ndemli": "nml",
"Ndendeule": "dne",
"Ndengereko": "ndg",
"Nding": "eli",
"Ndjébbana": "djj",
"Ndo": "ndp",
"Ndobo": "ndw",
"Ndoe": "nbb",
"Ndogo": "ndz",
"Ndolo": "ndl",
"Ndom": "nqm",
"Ndombe": "ndq",
"Ndonga": "ng",
"Ndoola": "ndr",
"Ndrulo": "dno",
"Nduga": "ndx",
"Ndumu": "nmd",
"Ndunda": "nuh",
"Ndunga": "ndt",
"Ndut": "ndv",
"Ndyuka-Trio Pidgin": "njt",
"Ndzwani Comorian": "wni",
"Neapolitan": "nap",
"Nedebang": "nec",
"Nefamese": "nef",
"Nefusa": "jbn",
"Negerhollands": "dcr",
"Negeri Sembilan Malay": "zmi",
"Negidal": "neg",
"Nehan": "nsn",
"Nek": "nif",
"Nekgini": "nkg",
"Neko": "nej",
"Neku": "nek",
"Neme": "nex",
"Nemi": "nem",
"Nen": "nqn",
"Nend": "anh",
"Nengone": "nen",
"Neo": "neu",
"Nepalese Sign Language": "nsp",
"Nepali": "ne",
"Nepali Kurux": "kxl",
"Nete": "net",
"Neve'ei": "vnm",
"Neverver": "lgk",
"New Caledonian Javanese": "jas",
"New River Shasta": "nai-nrs",
"New Zealand Sign Language": "nzs",
"Newar": "new",
"Neyo": "ney",
"Nez Perce": "nez",
"Nga La": "hlt",
"Ngaanyatjarra": "ntj",
"Ngadha": "nxg",
"Ngadjunmaya": "nju",
"Ngadjuri": "jui",
"Ngaing": "nnf",
"Ngaju": "nij",
"Ngala": "nud",
"Ngalakan": "nig",
"Ngalkbun": "ngk",
"Ngalum": "szb",
"Ngam": "nmc",
"Ngamambo": "nbv",
"Ngambay": "sba",
"Ngamini": "nmv",
"Ngamo": "nbh",
"Ngan'gityemerri": "nam",
"Nganakarti": "xnk",
"Nganasan": "nio",
"Ngandi": "nid",
"Ngando (Central African Republic)": "ngd",
"Ngando (Congo)": "nxd",
"Ngandyera": "nne",
"Ngangam": "gng",
"Ngantangarra": "ntg",
"Nganyaywana": "nyx",
"Ngardi": "rxd",
"Ngarigu": "xni",
"Ngarinman": "nbj",
"Ngarinyin": "ung",
"Ngarla": "nrk",
"Ngarluma": "nrl",
"Ngarrindjeri": "nay",
"Ngas": "anc",
"Ngasa": "nsg",
"Ngatik Men's Creole": "ngm",
"Ngawn Chin": "cnw",
"Ngawun": "nxn",
"Ngazidja Comorian": "zdj",
"Ngbaka": "nga",
"Ngbaka Ma'bo": "nbm",
"Ngbaka Manza": "ngg",
"Ngbee": "jgb",
"Ngbinda": "nbd",
"Ngbundu": "nuu",
"Ngelima": "agh",
"Ngemba": "nge",
"Ngen": "gnj",
"Ngendelengo": "nql",
"Ngeq": "ngt",
"Ngete": "nnn",
"Nggem": "nbq",
"Nggwahyi": "ngx",
"Ngie": "ngj",
"Ngiemboon": "nnh",
"Ngile": "jle",
"Ngindo": "nnq",
"Ngiti": "niy",
"Ngiyambaa": "wyb",
"Ngizim": "ngi",
"Ngkoth": "aus-ngk",
"Ngkâlmpw Kanum": "kcd",
"Ngochang": "tbq-ngo",
"Ngom": "nra",
"Ngomba": "jgo",
"Ngombale": "nla",
"Ngombe (Central African Republic)": "nmj",
"Ngombe (Congo)": "ngc",
"Ngong": "nnx",
"Ngongo": "noq",
"Ngoni": "ngo",
"Ngoreme": "ngq",
"Ngoshie": "nsh",
"Ngul": "nlo",
"Ngulu": "ngp",
"Nguluwan": "nuw",
"Ngumbi": "nui",
"Ngunawal": "xul",
"Ngundi": "ndn",
"Ngundu": "nue",
"Ngungwel": "ngz",
"Ngurmbur": "nrx",
"Nguôn": "nuo",
"Ngwaba": "ngw",
"Ngwe": "nwe",
"Ngwo": "ngn",
"Ngäbere": "gym",
"Nhanda": "nha",
"Nheengatu": "yrl",
"Nhirrpi": "hrp",
"Nhuwala": "nhf",
"Nias": "nia",
"Nicaraguan Creole": "bzk",
"Nicaraguan Sign Language": "ncs",
"Nicola": "ath-nic",
"Niellim": "nie",
"Nigeria Mambila": "mzk",
"Nigerian Pidgin": "pcm",
"Nigerian Sign Language": "nsi",
"Nihali": "nll",
"Nii": "nii",
"Niksek": "gbe",
"Nila": "nil",
"Nilamba": "nim",
"Nimadi": "noe",
"Nimanbur": "nmp",
"Nimbari": "nmr",
"Nimboran": "nir",
"Nimi": "nis",
"Nimo": "niw",
"Nimoa": "nmw",
"Ninam": "shb",
"Nindi": "nxi",
"Ningera": "nby",
"Ninggerum": "nxr",
"Ningil": "niz",
"Ninia Yali": "nlk",
"Ninzo": "nin",
"Nipsan": "nps",
"Nisa": "njs",
"Nisenan": "nsz",
"Nisga'a": "ncg",
"Nisi": "yso",
"Niuafo'ou": "num",
"Niuatoputapu": "nkp",
"Niuean": "niu",
"Nivaclé": "cag",
"Nivkh": "niv",
"Niwer Mil": "hrc",
"Niya Prakrit": "pra-niy",
"Njalgulgule": "njl",
"Njebi": "nzb",
"Njen": "njj",
"Njerep": "njr",
"Njyem": "njy",
"Nkami": "nkq",
"Nkangala": "nkn",
"Nkari": "nkz",
"Nkem-Nkum": "isi",
"Nkhumbi": "khu",
"Nkongho": "nkc",
"Nkonya": "nko",
"Nkoroo": "nkx",
"Nkoya": "nka",
"Nkukoli": "nbo",
"Nkutu": "nkw",
"Nnam": "nbp",
"Nobiin": "fia",
"Nobonob": "gaw",
"Nocamán": "nom",
"Nocte Naga": "njb",
"Nogai": "nog",
"Noiri": "noi",
"Nokuku": "nkk",
"Nomaande": "lem",
"Nomane": "nof",
"Nomatsiguenga": "not",
"Nomlaki": "nol",
"Nomu": "noh",
"Nong Zhuang": "zhn",
"Nonuya": "noj",
"Nooksack": "nok",
"Noon": "snf",
"Noone": "nhu",
"Nootka": "nuk",
"Nopala Chatino": "cya",
"Noric": "nrc",
"Norman": "nrf",
"Norn": "nrn",
"Norra": "nrr",
"North Alaskan Inupiatun": "esi",
"North Ambrym": "mmg",
"North Asmat": "nks",
"North Awyu": "yir",
"North Babar": "bcd",
"North Boma": "boh",
"North Central Mixe": "neq",
"North Efate": "llp",
"North Fali": "fll",
"North Frisian": "frr",
"North Giziga": "gis",
"North Levantine Arabic": "apc",
"North Marquesan": "mrq",
"North Mesopotamian Arabic": "ayp",
"North Mofu": "mfk",
"North Moluccan Malay": "max",
"North Muyu": "kti",
"North Nuaulu": "nni",
"North Picene": "nrp",
"North Slavey": "scs",
"North Tairora": "tbg",
"North Tanna": "tnn",
"North Wahgi": "whg",
"North Watut": "una",
"Northeast Kiwai": "kiw",
"Northeast Maidu": "nmu",
"Northeast Pashayi": "aee",
"Northeastern Dinka": "dip",
"Northeastern Pomo": "pef",
"Northern Alta": "aqn",
"Northern Altai": "atv",
"Northern Amami-Oshima": "ryn",
"Northern Bai": "bfc",
"Northern Bontoc": "rbk",
"Northern Catanduanes Bicolano": "cts",
"Northern Dagara": "dgi",
"Northern East Cree": "crl",
"Northern Emberá": "emp",
"Northern Ghale": "ghh",
"Northern Grebo": "gbo",
"Northern Guiyang Hmong": "huj",
"Northern Haida": "hdn",
"Northern Hindko": "hno",
"Northern Huishui Hmong": "hmi",
"Northern Kalapuya": "nrt",
"Northern Kam": "doc",
"Northern Kankanay": "xnn",
"Northern Khmer": "kxm",
"Northern Kissi": "kqs",
"Northern Kurdish": "kmr",
"Northern Lorung": "lbr",
"Northern Luri": "lrc",
"Northern Mashan Hmong": "hmp",
"Northern Muji": "ymx",
"Northern Ndebele": "nd",
"Northern Ngbandi": "ngb",
"Northern Nisu": "yiv",
"Northern Nuni": "nuv",
"Northern Oaxaca Nahuatl": "nhy",
"Northern Ohlone": "cst",
"Northern One": "onr",
"Northern Paiute": "pao",
"Northern Pame": "pmq",
"Northern Pomo": "pej",
"Northern Puebla Nahuatl": "ncj",
"Northern Pumi": "pmi",
"Northern Pwo": "pww",
"Northern Qiandong Miao": "hea",
"Northern Qiang": "cng",
"Northern Rengma Naga": "nnl",
"Northern Roglai": "rog",
"Northern Saharan Berber": "mzb",
"Northern Sami": "se",
"Northern Selkup": "sel-nor",
"Northern Sierra Miwok": "nsq",
"Northern Sotho": "nso",
"Northern Subanen": "stb",
"Northern Tarahumara": "thh",
"Northern Tepehuan": "ntp",
"Northern Thai": "nod",
"Northern Tidong": "ntd",
"Northern Tlaxiaco Mixtec": "xtn",
"Northern Toussian": "tsp",
"Northern Tujia": "tji",
"Northern Tutchone": "ttm",
"Northern Valley Yokuts": "nai-nvy",
"Northern Yukaghir": "ykg",
"Northwest Alaska Inupiatun": "esk",
"Northwest Gbaya": "gya",
"Northwest Maidu": "mjd",
"Northwest Oaxaca Mixtec": "mxa",
"Northwest Pashayi": "glh",
"Northwestern Dinka": "diw",
"Northwestern Fars": "faz",
"Northwestern Ojibwa": "ojb",
"Northwestern Tamang": "tmk",
"Norwegian": "no",
"Norwegian Bokmål": "nb",
"Norwegian Nynorsk": "nn",
"Norwegian Sign Language": "nsl",
"Notre": "bly",
"Notsi": "ncf",
"Nottoway": "ntw",
"Nottoway-Meherrin": "nwy",
"Novial": "nov",
"Noxilo": "art-nox",
"Noy": "noy",
"Nsari": "asj",
"Nsenga": "nse",
"Nshi": "nsc",
"Nsong": "soo",
"Nsongo": "nsx",
"Ntcham": "bud",
"Ntomba": "nto",
"Ntra'ngith": "dgt",
"Nubaca": "baf",
"Nubi": "kcn",
"Nuer": "nus",
"Nuguria": "nur",
"Nuk": "noc",
"Nukak Makú": "mbr",
"Nukna": "klt",
"Nukuini": "nuc",
"Nukumanu": "nuq",
"Nukunu": "nnv",
"Nukunul": "xnu",
"Nukuoro": "nkr",
"Numana": "nbr",
"Numanggang": "nop",
"Numbami": "sij",
"Nume": "tgs",
"Numee": "kdk",
"Numidian": "nxm",
"Nung": "nut",
"Nungali": "nug",
"Nunggubuyu": "nuy",
"Nungon": "paa-nun",
"Nungu": "rin",
"Nupbikha": "npb",
"Nupe": "nup",
"Nusa Laut": "nul",
"Nusu": "nuf",
"Nutabe": "cba-nut",
"Nyabwa": "nwb",
"Nyah Kur": "cbn",
"Nyaheun": "nev",
"Nyakyusa": "nyy",
"Nyali": "nlj",
"Nyam": "nmi",
"Nyamal": "nly",
"Nyambo": "now",
"Nyamusa-Molo": "nwm",
"Nyamwanga": "mwn",
"Nyamwezi": "nym",
"Nyaneka": "nyk",
"Nyang'i": "nyp",
"Nyanga (Congo)": "nyj",
"Nyanga (Togo)": "ayg",
"Nyanga-li": "nyc",
"Nyangatom": "nnj",
"Nyangbo": "nyb",
"Nyangga": "nny",
"Nyangumarta": "nna",
"Nyankole": "nyn",
"Nyarafolo Senoufo": "sev",
"Nyaturu": "rim",
"Nyaw": "nyw",
"Nyawaygi": "nyt",
"Nyemba": "nba",
"Nyengo": "nye",
"Nyenkha": "neh",
"Nyeu": "nyl",
"Nyigina": "nyh",
"Nyiha": "nih",
"Nyika": "nkt",
"Nyimang": "nyi",
"Nyindrou": "lid",
"Nyindu": "nyg",
"Nyishi": "njz",
"Nyiyaparli": "xny",
"Nyokon": "nvo",
"Nyole (Kenya)": "nyd",
"Nyole (Uganda)": "nuj",
"Nyong": "muo",
"Nyoro": "nyo",
"Nyulnyul": "nyv",
"Nyunga": "nys",
"Nyungwe": "nyu",
"Nyâlayu": "yly",
"Nzadi": "nzd",
"Nzakambay": "nzy",
"Nzakara": "nzk",
"Nzanyi": "nja",
"Nzima": "nzi",
"Ná-Meo": "neo",
"Nüpode Huitoto": "hux",
"Nǀuu": "ngh",
"O'chi'chi'": "xoc",
"O'du": "tyh",
"O'odham": "ood",
"Obanliku": "bzy",
"Obispeño": "obi",
"Oblo": "obl",
"Obo Manobo": "obo",
"Obokuitai": "afz",
"Obolo": "ann",
"Obulom": "obu",
"Ocaina": "oca",
"Occitan": "oc",
"Ocotepec Mixtec": "mie",
"Ocotlán Zapotec": "zac",
"Od": "odk",
"Odiai": "bhf",
"Odoodee": "kkc",
"Odual": "odu",
"Odut": "oda",
"Ofayé": "opy",
"Ofo": "ofo",
"Ogbah": "ogc",
"Ogbia": "ogb",
"Ogbogolo": "ogg",
"Ogbronuagum": "ogu",
"Ogea": "eri",
"Oirata": "oia",
"Ojibwe": "oj",
"Ojitlán Chinantec": "chj",
"Okanagan": "oka",
"Oki-No-Erabu": "okn",
"Okiek": "oki",
"Okinawan": "ryu",
"Oko-Eni-Osayen": "oks",
"Oko-Juwoi": "okj",
"Okobo": "okb",
"Okodia": "okd",
"Okolod": "kqv",
"Okpamheri": "opa",
"Okpe (Northwestern Edo)": "okx",
"Okpe (Southwestern Edo)": "oke",
"Okpela": "atg",
"Oksapmin": "opm",
"Oku": "oku",
"Okwanuchu": "nai-okw",
"Old Anatolian Turkish": "trk-oat",
"Old Armenian": "xcl",
"Old Avar": "oav",
"Old Bengali": "inc-obn",
"Old Breton": "obt",
"Old Burmese": "obr",
"Old Catalan": "roa-oca",
"Old Chinese": "och",
"Old Church Slavonic": "cu",
"Old Cornish": "oco",
"Old Czech": "zlw-ocs",
"Old Danish": "gmq-oda",
"Old Dutch": "odt",
"Old East Slavic": "orv",
"Old English": "ang",
"Old French": "fro",
"Old Frisian": "ofs",
"Old Galician-Portuguese": "roa-opt",
"Old Georgian": "oge",
"Old Gujarati": "inc-ogu",
"Old High German": "goh",
"पुरानी हिंदी": "inc-ohi",
"Old Hungarian": "ohu",
"Old Irish": "sga",
"Old Japanese": "ojp",
"Old Javanese": "kaw",
"Old Kamta": "inc-ork",
"Old Kannada": "dra-okn",
"Old Kentish Sign Language": "okl",
"Old Khmer": "okz",
"Old Komi": "urj-koo",
"Old Korean": "oko",
"Old Leonese": "roa-ole",
"Old Lithuanian": "olt",
"Old Manipuri": "omp",
"Old Marathi": "omr",
"Old Median": "xme-old",
"Old Mon": "omx",
"Old Norse": "non",
"Old Novgorodian": "zle-ono",
"Old Nubian": "onw",
"Old Occitan": "pro",
"Old Oriya": "inc-oor",
"Old Ossetic": "oos",
"Old Persian": "peo",
"Old Polish": "zlw-opl",
"Old Prussian": "prg",
"Old Punjabi": "inc-opa",
"Old Ruthenian": "zle-ort",
"Old Saxon": "osx",
"Old South Arabian": "sem-srb",
"Old Spanish": "osp",
"Old Sundanese": "osn",
"Old Swedish": "gmq-osw",
"Old Tamil": "oty",
"Old Tati": "xme-ott",
"Old Telugu": "dra-ote",
"Old Tibetan": "otb",
"Old Tupi": "tpw",
"Old Turkic": "otk",
"Old Uyghur": "oui",
"Old Welsh": "owl",
"Olekha": "ole",
"Ollari": "gdb",
"Olo": "ong",
"Oloma": "olm",
"Olrat": "olr",
"Olu'bo": "lul",
"Olukumi": "ulb",
"Olulumo-Ikom": "iko",
"Oluta Popoluca": "plo",
"Olutsotso": "lto",
"Omagua": "omg",
"Omaha-Ponca": "oma",
"Omani Arabic": "acx",
"Omba": "omb",
"Ombamba": "mbm",
"Ombo": "oml",
"Ometepec Nahuatl": "nht",
"Omi": "omi",
"Omok": "omk",
"Omotik": "omt",
"Omurano": "omu",
"Oneida": "one",
"Ong": "oog",
"Ongota": "bxe",
"Onin": "oni",
"Onjob": "onj",
"Ono": "ons",
"Onobasulu": "onn",
"Onondaga": "ono",
"Ontenu": "ont",
"Ontong Java": "ojv",
"Oorlams": "oor",
"Opao": "opo",
"Opata": "opt",
"Opuuo": "lgn",
"Opón": "sai-opo",
"Oraon Sadri": "sdr",
"Orejón": "ore",
"Oring": "org",
"Oriya": "or",
"Orizaba Nahuatl": "nlv",
"Orléanais": "roa-orl",
"Ormu": "orz",
"Ormuri": "oru",
"Oro": "orx",
"Oro Win": "orw",
"Oroch": "oac",
"Oroha": "ora",
"Orok": "oaa",
"Orokaiva": "okv",
"Oroko": "bdu",
"Orokolo": "oro",
"Oromo": "om",
"Oroqen": "orh",
"Orowe": "bpk",
"Oruma": "orr",
"Orya": "ury",
"Osage": "osa",
"Osamayi": "syx",
"Osatu": "ost",
"Oscan": "osc",
"Osing": "osi",
"Ososo": "oso",
"Ossetian": "os",
"Ot Danum": "otd",
"Otank": "uta",
"Oti": "oti",
"Otomaco": "sai-oto",
"Otoro": "otr",
"Ottawa": "otw",
"Ottoman Turkish": "ota",
"Otuke": "otu",
"Ouma": "oum",
"Oune": "oue",
"Owa": "stn",
"Owenia": "wsr",
"Owiniga": "owi",
"Oy": "oyb",
"Oya'oya": "oyy",
"Oyda": "oyd",
"Ozolotepec Zapotec": "zao",
"Ozumacín Chinantec": "chz",
"Pa": "ppt",
"Pa Di": "pdi",
"Pa'a": "pqa",
"Pa'o Karen": "blk",
"Pa-Hng": "pha",
"Paama": "pma",
"Paasaal": "sig",
"Pacahuara": "pcp",
"Pacoh": "pac",
"Padoe": "pdo",
"Paelignian": "pgn",
"Paeonian": "ine-pae",
"Pagi": "pgi",
"Pagibete": "pae",
"Pagu": "pgu",
"Pahanan Agta": "apf",
"Pahari-Potwari": "phr",
"Pahi": "lgt",
"Pahlavani": "phv",
"Pai Tavytera": "pta",
"Pai-lang": "tbq-plg",
"Paicî": "pri",
"Paikoneka": "awd-pai",
"Paipai": "ppi",
"Paisaci Prakrit": "inc-psc",
"Paite": "pck",
"Paiwan": "pwn",
"Pajapan Nahuatl": "nhp",
"Pak-Tong": "pkg",
"Pakanha": "pkn",
"Pakistan Sign Language": "pks",
"Paku": "pku",
"Paku Karen": "kpp",
"Pal": "abw",
"Palaic": "plq",
"Palaka Senoufo": "plr",
"Palantla Chinantec": "cpa",
"Palauan": "pau",
"Palawan Batak": "bya",
"Paleni": "pnl",
"Palenquero": "pln",
"Palewyami": "nai-ply",
"Pali": "pi",
"Palikur": "plu",
"Paliyan": "pcf",
"Pallanganmiddang": "pmd",
"Palor": "fap",
"Palta": "sai-pal",
"Palu'e": "ple",
"Paluan": "plz",
"Palya Bareli": "bpx",
"Pam": "pmn",
"Pambia": "pmb",
"Pamigua": "sai-pam",
"Pamlico": "pmk",
"Pamona": "pmf",
"Pamosu": "hih",
"Pamplona Atta": "att",
"Pana (Central Africa)": "pnz",
"Pana (West Africa)": "pnq",
"Panamanian Sign Language": "lsp",
"Panamint": "par",
"Panare": "pbh",
"Panará": "kre",
"Panasuan": "psn",
"Panawa": "pwb",
"Pancana": "pnp",
"Panchpargania": "tdb",
"Pande": "bkj",
"Pangasinan": "pag",
"Pangseng": "pgs",
"Pangutaran Sama": "slm",
"Pangwa": "pbr",
"Pangwali": "pgg",
"Panim": "pnr",
"Paniya": "pcg",
"Pankararé": "pax",
"Pankararú": "paz",
"Pankhu": "pkh",
"Pannei": "pnc",
"Panobo": "pno",
"Panyjima": "pnw",
"Panzaleo": "sai-pnz",
"Pao": "ppa",
"Papantla Totonac": "top",
"Papapana": "ppn",
"Papar": "dpp",
"Papasena": "pas",
"Papel": "pbo",
"Papi": "ppe",
"Papiamentu": "pap",
"Papitalai": "pat",
"Papora": "ppu",
"Papua New Guinean Sign Language": "pgz",
"Papuan Malay": "pmy",
"Papuma": "ppm",
"Para Naga": "pzn",
"Parachi": "prc",
"Paraguayan Guaraní": "gug",
"Paraguayan Sign Language": "pys",
"Parakanã": "pak",
"Paranan": "prf",
"Paranawát": "paf",
"Paratió": "sai-par",
"Paraujano": "pbg",
"Parauk": "prk",
"Parawen": "prw",
"Pardhan": "pch",
"Pardhi": "pcl",
"Pare": "asa",
"Pareci": "pab",
"Paredarerme": "xpd",
"Parenga": "pcj",
"Parkari Koli": "kvx",
"Parthian": "xpr",
"Parya": "paq",
"Pará Arára": "aap",
"Pará Gavião": "gvp",
"Pashto": "ps",
"Pasi": "psq",
"Pass Valley Yali": "yac",
"Passé": "awd-pas",
"Patagón": "sai-ptg",
"Patamona": "pbc",
"Patani": "ptn",
"Pataxó Hã-Ha-Hãe": "pth",
"Patep": "ptp",
"Pathiya": "pty",
"Patpatar": "gfk",
"Pattani": "lae",
"Pattani Malay": "mfa",
"Pattapu": "ptq",
"Patwin": "pwi",
"Paulohi": "plh",
"Paumarí": "pad",
"Paunaca": "pnk",
"Pauri Bareli": "bfb",
"Pauserna": "psm",
"Pawaia": "pwa",
"Pawnee": "paw",
"Payaguá": "sai-pyg",
"Paynamar": "pmr",
"Pazeh": "pzh",
"Pe": "pai",
"Pear": "pcb",
"Pech": "pay",
"Pecheneg": "xpc",
"Peerapper": "xpw",
"Peere": "pfe",
"Pei": "ppq",
"Pekal": "pel",
"Pela": "bxd",
"Pele-Ata": "ata",
"Pemon": "aoc",
"Penang Sign Language": "psg",
"Penchal": "pek",
"Pendau": "ums",
"Pengo": "peg",
"Pennsylvania German": "pdc",
"Penobscot": "aaq",
"Penrhyn": "pnh",
"Pentlatch": "ptw",
"Perai": "wet",
"Peranakan Indonesian": "pea",
"Perema": "wom",
"Pericú": "nai-per",
"Pero": "pip",
"Persian": "fa",
"Persian Sign Language": "psc",
"Peruvian Sign Language": "prl",
"Petapa Zapotec": "zpe",
"Petats": "pex",
"Petjo": "pey",
"Peñoles Mixtec": "mil",
"Phai": "prt",
"Phake": "phk",
"Phala": "ypa",
"Phalura": "phl",
"Phana'": "phq",
"Phangduwali": "phw",
"Phende": "pem",
"Philippine Sign Language": "psp",
"Philistine": "und-phi",
"Phimbi": "phm",
"Phoenician": "phn",
"Phola": "ypg",
"Pholo": "yip",
"Phom": "nph",
"Phong-Kniang": "pnx",
"Phrae Pwo": "kjt",
"Phrygian": "xpg",
"Phu Thai": "pht",
"Phuan": "phu",
"Phudagi": "phd",
"Phuie": "pug",
"Phukha": "phh",
"Phuma": "ypm",
"Phunoi": "pho",
"Phuong": "phg",
"Phupa": "ypp",
"Phupha": "yph",
"Phuthi": "bnt-phu",
"Phuza": "ypz",
"Piamatsina": "ptr",
"Piame": "pin",
"Piapoco": "pio",
"Piaroa": "pid",
"Picard": "pcd",
"Pichinglis": "fpe",
"Pichis Ashéninka": "cpu",
"Pictish": "xpi",
"Picuris": "nai-pic",
"Pidgin Delaware": "dep",
"Pidgin Iha": "ihb",
"Pidgin Onin": "onx",
"Piedmontese": "pms",
"Pijao": "pij",
"Pije": "piz",
"Pijin": "pis",
"Pilagá": "plg",
"Pileni": "piv",
"Pima Bajo": "pia",
"Pimbwe": "piw",
"Pinai-Hagahai": "pnn",
"Pingelapese": "pif",
"Pini": "pii",
"Pinigura": "pnv",
"Pinjarup": "pnj",
"Pinji": "pic",
"Pinotepa Nacional Mixtec": "mio",
"Pintiini": "pti",
"Pintupi-Luritja": "piu",
"Pinyin": "pny",
"Pipil": "ppl",
"Pirahã": "myp",
"Piratapuyo": "pir",
"Pirlatapa": "bxi",
"Piro": "pie",
"Pirriya": "xpa",
"Pisabo": "pig",
"Pisaflores Tepehua": "tpp",
"Piscataway": "psy",
"Pisidian": "xps",
"Pitcairn-Norfolk": "pih",
"Pite Sami": "sje",
"Piti": "pcn",
"Pitjantjatjara": "pjt",
"Pitta-Pitta": "pit",
"Piu": "pix",
"Piya-Kwonci": "piy",
"Plains Apache": "apk",
"Plains Cree": "crk",
"Plains Indian Sign Language": "psd",
"Plains Miwok": "pmw",
"Plapo Krumen": "ktj",
"Plautdietsch": "pdt",
"Playero": "gob",
"Pnar": "pbv",
"Pochuri Naga": "npo",
"Pochutec": "xpo",
"Podoko": "pbi",
"Pogolo": "poy",
"Pohnpeian": "pon",
"Poitevin-Saintongeais": "roa-poi",
"Pokangá": "pok",
"Poke": "pof",
"Pol": "pmm",
"Polabian": "pox",
"Polci": "plj",
"Polish": "pl",
"Polish Sign Language": "pso",
"Polonombauk": "plb",
"Pom": "pmo",
"Ponam": "ncc",
"Pongu": "png",
"Ponosakan": "pns",
"Pontic Greek": "pnt",
"Ponyo": "npg",
"Poqomam": "poc",
"Poqomchi'": "poh",
"Porohanon": "prh",
"Port Sandwich": "psw",
"Port Sorell": "xpl",
"Port Vato": "ptv",
"Portuguese": "pt",
"Portuguese Sign Language": "psr",
"Potawatomi": "pot",
"Potiguára": "pog",
"Poumei Naga": "pmx",
"Pouye": "bye",
"Powari": "pwr",
"Powhatan": "pim",
"Poyanáwa": "pyn",
"Prakrit": "inc-pra",
"Prasuni": "prn",
"Primitive Irish": "pgl",
"Principense": "pre",
"Proto-Abkhaz-Abaza": "cau-abz-pro",
"Proto-Afroasiatic": "afa-pro",
"Proto-Albanian": "sqj-pro",
"Proto-Algic": "aql-pro",
"Proto-Algonquian": "alg-pro",
"Proto-Amuesha-Chamicuro": "awd-amc-pro",
"Proto-Anatolian": "ine-ana-pro",
"Proto-Apachean": "apa-pro",
"Proto-Arawa": "auf-pro",
"Proto-Arawak": "awd-pro",
"Proto-Armenian": "hyx-pro",
"Proto-Arnhem": "aus-arn-pro",
"Proto-Aroid": "omv-aro-pro",
"Proto-Aslian": "mkh-asl-pro",
"Proto-Atayalic": "map-ata-pro",
"Proto-Athabaskan": "ath-pro",
"Proto-Atlantic-Congo": "alv-pro",
"Proto-Austroasiatic": "aav-pro",
"Proto-Austronesian": "map-pro",
"Proto-Avaro-Andian": "cau-ava-pro",
"Proto-Bahnaric": "mkh-ban-pro",
"Proto-Balto-Slavic": "ine-bsl-pro",
"Proto-Bantoid": "nic-bod-pro",
"Proto-Bantu": "bnt-pro",
"Proto-Basque": "euq-pro",
"Proto-Batak": "btk-pro",
"Proto-Be": "qfa-onb-pro",
"Proto-Be-Tai": "qfa-bet-pro",
"Proto-Benue-Congo": "nic-bco-pro",
"Proto-Berber": "ber-pro",
"Proto-Bodo-Garo": "tbq-bdg-pro",
"Proto-Bongo-Bagirmi": "csu-bba-pro",
"Proto-Boran": "sai-bor-pro",
"Proto-Brythonic": "cel-bry-pro",
"Proto-Bua": "alv-bua-pro",
"Proto-Bungku-Tolaki": "poz-btk-pro",
"Proto-Caddoan": "cdd-pro",
"Proto-Cangin": "alv-cng-pro",
"Proto-Cariban": "sai-car-pro",
"Proto-Celtic": "cel-pro",
"Proto-Central Chadic": "cdc-cbm-pro",
"Proto-Central Indo-Aryan": "inc-cen-pro",
"Proto-Central Jê": "sai-cje-pro",
"Proto-Central New South Wales": "aus-cww-pro",
"Proto-Central Sudanic": "csu-pro",
"Proto-Central Togo": "alv-gtm-pro",
"Proto-Central-Eastern Malayo-Polynesian": "poz-cet-pro",
"Proto-Cerrado": "sai-cer-pro",
"Proto-Chadic": "cdc-pro",
"Proto-Chamic": "cmc-pro",
"Proto-Chatino": "omq-cha-pro",
"Proto-Chibchan": "cba-pro",
"Proto-Chimakuan": "chi-pro",
"Proto-Chinookan": "nai-ckn-pro",
"Proto-Chukotko-Kamchatkan": "qfa-cka-pro",
"Proto-Chumash": "nai-chu-pro",
"Proto-Circassian": "cau-cir-pro",
"Proto-Cupan": "azc-cup-pro",
"Proto-Cushitic": "cus-pro",
"Proto-Daju": "sdv-daj-pro",
"Proto-Daly": "aus-dal-pro",
"Proto-Dargwa": "cau-drg-pro",
"Proto-Dizoid": "omv-diz-pro",
"Proto-Dravidian": "dra-pro",
"Proto-Eastern Jebel": "sdv-eje-pro",
"Proto-Eastern Malayo-Polynesian": "pqe-pro",
"Proto-Eastern Oti-Volta": "nic-eov-pro",
"Proto-Eastern Polynesian": "poz-pep-pro",
"Proto-Edekiri": "alv-edk-pro",
"Proto-Edoid": "alv-edo-pro",
"Proto-Eskimo": "esx-esk-pro",
"Proto-Eskimo-Aleut": "esx-pro",
"Proto-Fali": "alv-fli-pro",
"Proto-Finnic": "urj-fin-pro",
"Proto-Gbe": "alv-gbe-pro",
"Proto-Georgian-Zan": "ccs-gzn-pro",
"Proto-Germanic": "gem-pro",
"Proto-Grassfields": "nic-grf-pro",
"Proto-Great Andamanese": "qfa-adm-pro",
"Proto-Guang": "alv-gng-pro",
"Proto-Gur": "nic-gur-pro",
"Proto-Gurunsi": "nic-gns-pro",
"Proto-Halmahera-Cenderawasih": "poz-hce-pro",
"Proto-Heiban": "alv-hei-pro",
"Proto-Hellenic": "grk-pro",
"Proto-Highland East Cushitic": "cus-hec-pro",
"Proto-Hlai": "qfa-lic-pro",
"Proto-Hmong": "hmn-pro",
"Proto-Hmong-Mien": "hmx-pro",
"Proto-Hrusish": "sit-hrs-pro",
"Proto-Huitoto-Ocaina": "sai-hoc-pro",
"Proto-Hurro-Urartian": "qfa-hur-pro",
"Proto-Idomoid": "alv-ido-pro",
"Proto-Igboid": "alv-igb-pro",
"Proto-Ijoid": "ijo-pro",
"Proto-Indo-Aryan": "inc-pro",
"Proto-Indo-European": "ine-pro",
"Proto-Indo-Iranian": "iir-pro",
"Proto-Inuit": "esx-inu-pro",
"Proto-Iranian": "ira-pro",
"Proto-Iroquoian": "iro-pro",
"Proto-Italic": "itc-pro",
"Proto-Iwaidjan": "aus-wdj-pro",
"Proto-Japonic": "jpx-pro",
"Proto-Jukunoid": "nic-jkn-pro",
"Proto-Jê": "sai-jee-pro",
"Proto-Kadu": "qfa-kad-pro",
"Proto-Kalamian": "phi-kal-pro",
"Proto-Kalapuyan": "nai-klp-pro",
"Proto-Kam-Sui": "qfa-kms-pro",
"Proto-Kampa": "awd-kmp-pro",
"Proto-Karen": "kar-pro",
"Proto-Kartvelian": "ccs-pro",
"Proto-Katuic": "mkh-kat-pro",
"Proto-Kham": "sit-kha-pro",
"Proto-Khasian": "aav-khs-pro",
"Proto-Khmeric": "mkh-kmr-pro",
"Proto-Khmuic": "mkh-khm-pro",
"Proto-Khoe": "khi-kho-pro",
"Proto-Koman": "ssa-kom-pro",
"Proto-Komisenian": "ira-kms-pro",
"Proto-Koreanic": "qfa-kor-pro",
"Proto-Kra": "qfa-kra-pro",
"Proto-Kra-Dai": "qfa-tak-pro",
"Proto-Kru": "kro-pro",
"Proto-Kuki-Chin": "tbq-kuk-pro",
"Proto-Kuliak": "ssa-klk-pro",
"Proto-Kurdish": "ku-pro",
"Proto-Kwa": "alv-kwa-pro",
"Proto-Lalo": "tbq-lal-pro",
"Proto-Lampungic": "poz-lgx-pro",
"Proto-Lezghian": "cau-lzg-pro",
"Proto-Lolo-Burmese": "tbq-lob-pro",
"Proto-Loloish": "tbq-lol-pro",
"Proto-Lower Cross River": "nic-lcr-pro",
"Proto-Luish": "sit-luu-pro",
"Proto-Maidun": "nai-mdu-pro",
"Proto-Malayic": "poz-mly-pro",
"Proto-Malayo-Chamic": "poz-mcm-pro",
"Proto-Malayo-Polynesian": "poz-pro",
"Proto-Malayo-Sumbawan": "poz-msa-pro",
"Proto-Mande": "dmn-pro",
"Proto-Mangbetu": "csu-maa-pro",
"Proto-Mari": "chm-pro",
"Proto-Masa": "cdc-mas-pro",
"Proto-Mayan": "myn-pro",
"Proto-Mazatec": "omq-maz-pro",
"Proto-Medo-Parthian": "ira-mpr-pro",
"Proto-Mien": "hmx-mie-pro",
"Proto-Min": "zhx-min-pro",
"Proto-Mixe-Zoque": "nai-miz-pro",
"Proto-Mixtec": "omq-mxt-pro",
"Proto-Mixtecan": "omq-mix-pro",
"Proto-Mon-Khmer": "mkh-pro",
"Proto-Mongolic": "xgn-pro",
"Proto-Monic": "mkh-mnc-pro",
"Proto-Mordvinic": "urj-mdv-pro",
"Proto-Mumuye": "alv-mum-pro",
"Proto-Munda": "mun-pro",
"Proto-Munji-Yidgha": "ira-mny-pro",
"Proto-Muskogean": "nai-mus-pro",
"Proto-Na-Dene": "xnd-pro",
"Proto-Nahuan": "azc-nah-pro",
"Proto-Nakh": "cau-nkh-pro",
"Proto-Nawiki": "awd-nwk-pro",
"Proto-Nguni": "bnt-ngu-pro",
"Proto-Nicobarese": "aav-nic-pro",
"Proto-Niger-Congo": "nic-pro",
"Proto-Nilo-Saharan": "ssa-pro",
"Proto-Nilotic": "sdv-nil-pro",
"Proto-Norse": "gmq-pro",
"Proto-North Caucasian": "ccn-pro",
"Proto-North Halmahera": "paa-nha-pro",
"Proto-North Iroquoian": "iro-nor-pro",
"Proto-North Sarawak": "poz-swa-pro",
"Proto-Northeast Caucasian": "cau-nec-pro",
"Proto-Northern Jê": "sai-nje-pro",
"Proto-Northwest Caucasian": "cau-nwc-pro",
"Proto-Nubian": "nub-pro",
"Proto-Nuclear Polynesian": "poz-pnp-pro",
"Proto-Numic": "azc-num-pro",
"Proto-Nupoid": "alv-nup-pro",
"Proto-Nuristani": "iir-nur-pro",
"Proto-Nyima": "sdv-nyi-pro",
"Proto-Nyulnyulan": "aus-nyu-pro",
"Proto-Oceanic": "poz-oce-pro",
"Proto-Ogoni": "nic-ogo-pro",
"Proto-Omotic": "omv-pro",
"Proto-Ongan": "qfa-ong-pro",
"Proto-Ossetic": "os-pro",
"Proto-Oti-Volta": "nic-ovo-pro",
"Proto-Oto-Manguean": "omq-pro",
"Proto-Oto-Pamean": "omq-otp-pro",
"Proto-Otomi": "oto-otm-pro",
"Proto-Otomian": "oto-pro",
"Proto-Pakanic": "mkh-pkn-pro",
"Proto-Palaungic": "mkh-pal-pro",
"Proto-Pama-Nyungan": "aus-pam-pro",
"Proto-Paresi-Waura": "awd-prw-pro",
"Proto-Pathan": "ira-pat-pro",
"Proto-Pearic": "mkh-pea-pro",
"Proto-Permic": "urj-prm-pro",
"Proto-Philippine": "phi-pro",
"Proto-Plateau": "nic-plt-pro",
"Proto-Plateau Penutian": "nai-plp-pro",
"Proto-Pnar-Khasi-Lyngngam": "aav-pkl-pro",
"Proto-Polynesian": "poz-pol-pro",
"Proto-Pomeranian": "zlw-pom-pro",
"Proto-Pomo": "nai-pom-pro",
"Proto-Rukai": "dru-pro",
"Proto-Ryukyuan": "jpx-ryu-pro",
"Proto-Saka": "xsc-sak-pro",
"Proto-Saka-Wakhi": "xsc-skw-pro",
"Proto-Salish": "sal-pro",
"Proto-Samic": "smi-pro",
"Proto-Samoyedic": "syd-pro",
"Proto-Sanglechi-Ishkashimi": "ira-sgi-pro",
"Proto-Sara": "csu-sar-pro",
"Proto-Scythian": "xsc-pro",
"Proto-Selkup": "sel-pro",
"Proto-Semitic": "sem-pro",
"Proto-Shughni-Roshani": "ira-shr-pro",
"Proto-Shughni-Yazghulami": "ira-shy-pro",
"Proto-Shughni-Yazghulami-Munji": "ira-sym-pro",
"Proto-Sino-Tibetan": "sit-pro",
"Proto-Siouan": "sio-pro",
"Proto-Siouan-Catawban": "nai-sca-pro",
"Proto-Slavic": "sla-pro",
"Proto-Sogdic": "ira-sgc-pro",
"Proto-Somaloid": "cus-som-pro",
"Proto-Songhay": "son-pro",
"Proto-Sotho-Tswana": "bnt-sts-pro",
"Proto-South Cushitic": "cus-sou-pro",
"Proto-South Sulawesi": "poz-ssw-pro",
"Proto-Southern Jê": "sai-sje-pro",
"Proto-Southwestern Tai": "tai-swe-pro",
"Proto-Sunda-Sulawesi": "poz-sus-pro",
"Proto-Ta-Arawak": "awd-taa-pro",
"Proto-Tai": "tai-pro",
"Proto-Takic": "azc-tak-pro",
"Proto-Taman": "sdv-tmn-pro",
"Proto-Tani": "sit-tan-pro",
"Proto-Taranoan": "sai-tar-pro",
"Proto-Tatic": "xme-ttc-pro",
"Proto-Tocharian": "ine-toc-pro",
"Proto-Totozoquean": "nai-tot-pro",
"Proto-Trans-New Guinea": "ngf-pro",
"Proto-Trique": "omq-tri-pro",
"Proto-Tsezian": "cau-tsz-pro",
"Proto-Tsimshianic": "nai-tsi-pro",
"Proto-Tungusic": "tuw-pro",
"Proto-Tupi-Guarani": "tup-gua-pro",
"Proto-Tupian": "tup-pro",
"Proto-Turkic": "trk-pro",
"Proto-Ubangian": "nic-ubg-pro",
"Proto-Ugric": "urj-ugr-pro",
"Proto-Upper Cross River": "nic-ucr-pro",
"Proto-Uralic": "urj-pro",
"Proto-Utian": "nai-utn-pro",
"Proto-Uto-Aztecan": "azc-pro",
"Proto-Vietic": "mkh-vie-pro",
"Proto-Volta-Congo": "nic-vco-pro",
"Proto-Volta-Niger": "alv-von-pro",
"Proto-West Germanic": "gmw-pro",
"Proto-West Semitic": "sem-wes-pro",
"Proto-Western Mande": "dmn-mdw-pro",
"Proto-Witotoan": "sai-wit-pro",
"Proto-Yeniseian": "qfa-yen-pro",
"Proto-Yoruba": "alv-yor-pro",
"Proto-Yoruboid": "alv-yrd-pro",
"Proto-Yukaghir": "qfa-yuk-pro",
"Proto-Yupik": "ypk-pro",
"Proto-Zapotec": "omq-zpc-pro",
"Proto-Zapotecan": "omq-zap-pro",
"Proto-Zaza-Gorani": "ira-zgr-pro",
"Providencia Sign Language": "prz",
"Psikye": "kvj",
"Puare": "pux",
"Pudtol Atta": "atp",
"Puebla Mazatec": "pbm",
"Puelche": "pue",
"Puerto Rican Sign Language": "psl",
"Puimei Naga": "npu",
"Puinave": "pui",
"Puiron": "sit-prn",
"Pukapukan": "pkp",
"Pulabu": "pup",
"Puluwat": "puw",
"Puma": "pum",
"Pumpokol": "xpm",
"Pumé": "yae",
"Punan Aput": "pud",
"Punan Bah-Biau": "pna",
"Punan Batu": "pnm",
"Punan Merah": "puf",
"Punan Merap": "puc",
"Punan Tubu": "puj",
"Punic": "xpu",
"Punjabi": "pa",
"Punu": "puu",
"Puoc": "puo",
"Puquina": "puq",
"Puragi": "pru",
"Purari": "iar",
"Purepecha": "pua",
"Puri": "prr",
"Purik": "prx",
"Purisimeño": "puy",
"Puruborá": "pur",
"Puruhá": "sai-prh",
"Purukotó": "sai-pur",
"Purum": "pub",
"Putai": "mfl",
"Putoh": "put",
"Putukwam": "afe",
"Puxian": "cpx",
"Puyo-Paekche": "xpp",
"Puyuma": "pyu",
"Pwaamei": "pme",
"Pwapwa": "pop",
"Pyapun": "pcw",
"Pye Krumen": "pye",
"Pyemmairre": "xpb",
"Pyen": "pyy",
"Pykobjê": "sai-pyk",
"Pyu": "pby",
"Páez": "pbb",
"Pááfang": "pfa",
"Päri": "lkr",
"Pémono": "pev",
"Pévé": "lme",
"Pökoot": "pko",
"Q'anjob'al": "kjb",
"Q'eqchi": "kek",
"Qabiao": "laq",
"Qaqet": "byx",
"Qatabanian": "xqt",
"Qau": "gqu",
"Qila Muji": "ymq",
"Qimant": "ahg",
"Quapaw": "qua",
"Quebec Sign Language": "fcs",
"Quechua": "qu",
"Quenya": "qya",
"Querétaro Otomi": "otq",
"Quetzaltepec Mixe": "pxm",
"Queyu": "qvy",
"Quiavicuzas Zapotec": "zpj",
"Quileute": "qui",
"Quimbaya": "sai-qmb",
"Quinault": "qun",
"Quinigua": "nai-qng",
"Quinqui": "quq",
"Quioquitani-Quierí Zapotec": "ztq",
"Quiotepec Chinantec": "chq",
"Quiripi": "qyp",
"Quitemo": "sai-qtm",
"Rabha": "rah",
"Rabona": "sai-rab",
"Rade": "rad",
"Raetic": "xrr",
"Raga": "lml",
"Rahambuu": "raz",
"Rajah Kabunsuwan Manobo": "mqk",
"Rajasthani": "raj",
"Rajbanshi": "rjs",
"Raji": "rji",
"Rajong": "rjg",
"Rajput Garasia": "gra",
"Rakahanga-Manihiki": "rkh",
"Rakhine": "rki",
"Ralte": "ral",
"Rama": "rma",
"Ramandi": "tks",
"Ramanos": "sai-ram",
"Ramoaaina": "rai",
"Ramopa": "kjx",
"Rampi": "lje",
"Rana Tharu": "thr",
"Rang": "rax",
"Rangkas": "rgk",
"Ranglong": "rnl",
"Rao": "rao",
"Rapa": "ray",
"Rapa Nui": "rap",
"Rapoisi": "kyx",
"Rapting": "rpt",
"Rara Bakati'": "lra",
"Rarotongan": "rar",
"Rasawa": "rac",
"Ratagnon": "btn",
"Ratahan": "rth",
"Rathawi": "rtw",
"Rathwi Bareli": "bgd",
"Raute": "rau",
"Ravula": "yea",
"Rawa": "rwo",
"Rawang": "raw",
"Rawat": "jnl",
"Rawo": "rwa",
"Rayón Zoque": "zor",
"Razajerdi": "rat",
"Razihi": "rzh",
"Reang": "ria",
"Red Gelao": "gir",
"Reel": "atu",
"Rejang": "rej",
"Rejang Kayan": "ree",
"Reli": "rei",
"Rema": "bow",
"Rembarunga": "rmb",
"Rembong": "reb",
"Remo": "rem",
"Remontado Agta": "agv",
"Rempi": "rmp",
"Remun": "lkj",
"Rendille": "rel",
"Rengao": "ren",
"Rennellese": "mnv",
"Repanbitip": "rpn",
"Rer Bare": "rer",
"Rerau": "rea",
"Rerep": "pgk",
"Reshe": "res",
"Resígaro": "rgr",
"Retta": "ret",
"Reyesano": "rey",
"Rhine Franconian": "gmw-rfr",
"Riang": "ril",
"Riantana": "ran",
"Ribun": "rir",
"Rigwe": "iri",
"Rikbaktsa": "rkb",
"Rincón Zapotec": "zar",
"Ringgou": "rgu",
"Ririo": "rri",
"Ritarungo": "rit",
"Riung": "riu",
"Riverain Sango": "snj",
"Rogo": "rod",
"Rohingya": "rhg",
"Roma": "rmm",
"Romagnol": "rgn",
"Romam": "rmx",
"Romani": "rom",
"Romani Greek": "rge",
"Romanian": "ro",
"Romanian Sign Language": "rms",
"Romano-Serbian": "rsb",
"Romanova": "rmv",
"Romansch": "rm",
"Romblomanon": "rol",
"Rombo": "rof",
"Romkun": "rmk",
"Ron": "cla",
"Ronga": "rng",
"Rongga": "ror",
"Rongmei Naga": "nbu",
"Rongpo": "rnp",
"Ronji": "roe",
"Roon": "rnn",
"Roria": "rga",
"Roro": "rro",
"Rotokas": "roo",
"Rotuman": "rtm",
"Rouran": "xgn-rou",
"Roviana": "rug",
"Ruching Palaung": "pce",
"Rudbari": "rdb",
"Rufiji": "rui",
"Ruga": "ruh",
"Rukai": "dru",
"Rukiga": "cgg",
"Ruma": "ruz",
"Rumai Palaung": "rbb",
"Rumu": "klq",
"Runga": "rou",
"Rungtu": "rtc",
"Rungus": "drg",
"Rungwa": "rnw",
"Russenorsk": "crp-rsn",
"Russian": "ru",
"Russian Sign Language": "rsl",
"Rusyn": "rue",
"Rutul": "rut",
"Ruuli": "ruc",
"Ruwund": "rnd",
"Rwa": "rwk",
"Rwanda-Rundi": "rw",
"Réunion Creole French": "rcf",
"S'gaw Karen": "ksw",
"Sa": "sax",
"Sa'a": "apb",
"Sa'ban": "snv",
"Sa'och": "scq",
"Saafi-Saafi": "sav",
"Saam": "raq",
"Saamia": "lsm",
"Saanich": "str",
"Saare": "uss",
"Saaroa": "sxr",
"Saba": "saa",
"Sabaean": "xsa",
"Sabah Bisaya": "bsy",
"Sabah Malay": "msi",
"Sabanê": "sae",
"Sabaot": "spy",
"Sabine": "sbv",
"Sabir": "pml",
"Sabu": "hvn",
"Sabüm": "sbo",
"Sacapulteco": "quv",
"Sadri": "sck",
"Saek": "skb",
"Saep": "spd",
"Safaitic": "sem-saf",
"Safaliba": "saf",
"Safeyoka": "apz",
"Safwa": "sbk",
"Sagala": "sbm",
"Sagalla": "tga",
"Sahaptin": "nai-spt",
"Saho": "ssy",
"Sahu": "saj",
"Saisiyat": "xsy",
"Sajau Basap": "sjb",
"Sakachep": "sch",
"Sakam": "skm",
"Sakao": "sku",
"Sakata": "skt",
"Sake": "sak",
"Sakirabiá": "skf",
"Sakizaya": "szy",
"Sala": "shq",
"Salampasu": "slx",
"Salar": "slr",
"Salas": "sgu",
"Salchuq": "slq",
"Saleman": "sau",
"Saliba (Colombia)": "slc",
"Saliba (New Guinea)": "sbe",
"Salinan": "sln",
"Salt-Yui": "sll",
"Saluan": "loe",
"Salumá": "slj",
"Salvadoran Lenca": "nai-sln",
"Salvadoran Sign Language": "esn",
"Sam": "snx",
"Sama": "smd",
"Samaritan Aramaic": "sam",
"Samaritan Hebrew": "smp",
"Samarokena": "tmj",
"Samatao": "ysd",
"Samba": "smx",
"Sambali": "xsb",
"Sambalpuri": "spv",
"Sambe": "xab",
"Samberigi": "ssx",
"Samburu": "saq",
"Samei": "smh",
"Samo": "smq",
"Samoan": "sm",
"Samoan Plantation Pidgin": "cpe-spp",
"Samogitian": "sgs",
"Samosa": "swm",
"Sampang": "rav",
"Samre": "sxm",
"Samtao": "stu",
"Samvedi": "smv",
"San Agustín Mixtepec Zapotec": "ztm",
"San Baltazar Loxicha Zapotec": "zpx",
"San Felipe Otlaltepec Popoloca": "pow",
"San Jerónimo Tecóatl Mazatec": "maa",
"San Juan Atzingo Popoloca": "poe",
"San Juan Colorado Mixtec": "mjc",
"San Juan Guelavía Zapotec": "zab",
"San Juan Quiahije Chatino": "ctp-san",
"San Juan Teita Mixtec": "xtj",
"San Luís Temalacayuca Popoloca": "pps",
"San Marcos Tlalcoyalco Popoloca": "pls",
"San Martín Itunyoso Triqui": "trq",
"San Miguel Creole French": "scf",
"San Miguel Piedras Mixtec": "xtp",
"San Miguel el Grande Mixtec": "mig",
"San Pablo Güilá Zapotec": "ztu",
"San Pedro Amuzgos Amuzgo": "azg",
"San Pedro Quiatoni Zapotec": "zpf",
"San Vicente Coatlán Zapotec": "zpt",
"Sanapaná": "spn",
"Sanaviron": "sai-san",
"Sandawe": "sad",
"Sanga (Congo)": "sng",
"Sanga (Nigeria)": "xsn",
"Sanggau": "scg",
"Sangil": "snl",
"Sangir": "sxn",
"Sangisari": "sgr",
"Sangkong": "sgk",
"Sanglechi": "sgy",
"Sango": "sg",
"Sangtam Naga": "nsa",
"Sangu (Gabon)": "snq",
"Sangu (Tanzania)": "sbp",
"Sani": "ysn",
"Sanie": "ysy",
"Saniyo-Hiyewe": "sny",
"Sankaran Maninka": "msc",
"Sansi": "ssi",
"संस्कृत": "sa",
"Santa Catarina Albarradas Zapotec": "ztn",
"Santa Inés Ahuatempan Popoloca": "pca",
"Santa Inés Yatzechi Zapotec": "zpn",
"Santa Lucía Monteverde Mixtec": "mdv",
"Santa María La Alta Nahuatl": "nhz",
"Santa María Quiegolani Zapotec": "zpi",
"Santa María Zacatepec Mixtec": "mza",
"Santa Teresa Cora": "cok",
"Santali": "sat",
"Santiago Xanica Zapotec": "zpr",
"Santo Domingo Albarradas Zapotec": "zas",
"Sanumá": "xsu",
"Sapa": "tys",
"Saparua": "spr",
"Sapará": "sai-sap",
"Sapo": "krn",
"Saponi": "spi",
"Saposa": "sps",
"Sapuan": "spu",
"Sapé": "spc",
"Sar": "mwm",
"Sara": "sre",
"Sara Kaba": "sbz",
"Sara Kaba Deme": "kwg",
"Sara Kaba Náà": "kwv",
"Saraiki": "skr",
"Saramaccan": "srm",
"Sarangani Blaan": "bps",
"Sarangani Manobo": "mbs",
"Sarasira": "zsa",
"Saraveca": "sar",
"Sarcee": "srs",
"Sardinian": "sc",
"Sarikoli": "srh",
"Sarli": "sdf",
"Sartang": "onp",
"Sarua": "swy",
"Sarudu": "sdu",
"Saruga": "sra",
"Sasak": "sas",
"Sasaru": "sxs",
"Sassarese": "sdc",
"Satawalese": "stw",
"Saterland Frisian": "stq",
"Sateré-Mawé": "mav",
"Sathmar Swabian": "gmw-stm",
"Saudi Arabian Sign Language": "sdl",
"Sauraseni Apabhramsa": "inc-sap",
"Sauraseni Prakrit": "psu",
"Saurashtra": "saz",
"Sauri": "srt",
"Sause": "sao",
"Sausi": "ssj",
"Savi": "sdg",
"Savosavo": "svs",
"Sawai": "szw",
"Saweru": "swr",
"Sawi": "saw",
"Sawila": "swt",
"Sawriya Paharia": "mjt",
"Saxwe Gbe": "sxw",
"Saya": "say",
"Sayula Popoluca": "pos",
"Scanian": "gmq-scy",
"Scots": "sco",
"Scottish Gaelic": "gd",
"Seba": "kdg",
"Sebat Bet Gurage": "sgw",
"Seberuang": "sbx",
"Sebop": "sib",
"Sebuyau": "snb",
"Sechelt": "sec",
"Sechura": "sai-sec",
"Secoya": "sey",
"Sedang": "sed",
"Sedoa": "tvw",
"Seenku": "sos",
"Segai": "sge",
"Segeju": "seg",
"Seget": "sbg",
"Sehwi": "sfw",
"Seim": "sim",
"Seimat": "ssg",
"Seit-Kaitetu": "hik",
"Sekani": "sek",
"Sekapan": "skp",
"Sekar": "skz",
"Seke": "skj",
"Sekele": "vaj",
"Seki": "syi",
"Seko Padang": "skx",
"Seko Tengah": "sko",
"Sekpele": "lip",
"Selangor Sign Language": "kgi",
"Selaru": "slu",
"Selayar": "sly",
"Selee": "snw",
"Selepet": "spl",
"Selk'nam": "ona",
"Selonian": "sxl",
"Selungai Murut": "slg",
"Seluwasan": "sws",
"Sema": "nsm",
"Semai": "sea",
"Semandang": "sdm",
"Semaq Beri": "szc",
"Sembakung Murut": "sbr",
"Semelai": "sza",
"Semimi": "etz",
"Semnam": "ssm",
"Semnani": "smy",
"Sempan": "xse",
"Sena": "seh",
"Senara Sénoufo": "seq",
"Senaya": "syn",
"Sene": "sej",
"Seneca": "see",
"Sengele": "szg",
"Senggi": "snu",
"Sengo": "spk",
"Sengseng": "ssz",
"Senhaja De Srair": "sjs",
"Sensi": "sni",
"Sentani": "set",
"Senthang Chin": "sez",
"Sentinelese": "std",
"Sepa (Indonesia)": "spb",
"Sepa (New Guinea)": "spe",
"Sepen": "spm",
"Sepik Iwam": "iws",
"Sepik Mari": "mbx",
"Sera": "sry",
"Serbo-Croatian": "sh",
"Sere": "swf",
"Serer": "srr",
"Seri": "sei",
"Serili": "sve",
"Seroa": "kqu",
"Serrano": "ser",
"Seru": "szd",
"Serua": "srw",
"Serudung Murut": "srk",
"Serui-Laut": "seu",
"Seta": "stf",
"Setaman": "stm",
"Seti": "sbi",
"Severn Ojibwa": "ojs",
"Sewa Bay": "sew",
"Seychellois Creole": "crs",
"Seze": "sze",
"Sha": "scw",
"Shabak": "sdb",
"Shabo": "sbf",
"Shahmirzadi": "srz",
"Shahrudi": "shm",
"Shall-Zwall": "sha",
"Shama-Sambuga": "sqa",
"Shamang": "xsh",
"Shambala": "ksb",
"Shan": "shn",
"Shanenawa": "swo",
"Shanga": "sho",
"Shangzhai": "jih",
"Shaozhou Tuhua": "zhx-sht",
"Sharanahua": "mcd",
"Shark Bay": "ssv",
"Sharwa": "swq",
"Shasta": "sht",
"Shatt": "shj",
"Shau": "sqh",
"Shawnee": "sjw",
"She": "shx",
"Shebayo": "awd-she",
"Shehri": "shv",
"Shekkacho": "moy",
"Sheko": "she",
"Shelta": "sth",
"Shendu": "shl",
"Sheni": "scv",
"Sherbro": "bun",
"Sherdukpen": "sdp",
"Sherpa": "xsr",
"Sheshi Kham": "kip",
"Shi": "shr",
"Shihhi Arabic": "ssh",
"Shiki": "gua",
"Shilluk": "shk",
"Shina": "scl",
"Shinasha": "bwo",
"Shipibo-Conibo": "shp",
"Shixing": "sxg",
"Sholaga": "sle",
"Shom Peng": "sii",
"Shona": "sn",
"Shoo-Minda-Nye": "bcv",
"Shor": "cjs",
"Shoshone": "shh",
"Shua": "shg",
"Shuar": "jiv",
"Shuba": "cbq",
"Shughni": "sgh",
"Shumashti": "sts",
"Shumcho": "scu",
"Shuswap": "shs",
"Shuwa-Zamani": "ksa",
"Shwai": "shw",
"Shwe Palaung": "pll",
"Sialum": "slw",
"Siamou": "sif",
"Sian": "spg",
"Siane": "snp",
"Siang": "sya",
"Siar-Lak": "sjr",
"Sibe": "nco",
"Siberian Tatar": "sty",
"Sibu Melanau": "sdx",
"Sicanian": "sxc",
"Sicel": "scx",
"Sichuan Yi": "ii",
"Sicilian": "scn",
"Siculo-Arabic": "sqr",
"Sidamo": "sid",
"Sidetic": "xsd",
"Sie": "erg",
"Sierra Leone Sign Language": "sgx",
"Sierra Negra Nahuatl": "nsu",
"Sierra de Juárez Zapotec": "zaa",
"Sighu": "sxe",
"Sihan": "snr",
"Sika": "ski",
"Sikaiana": "sky",
"Sikaritai": "tty",
"Sikiana": "sik",
"Sikkimese": "sip",
"Sikule": "skh",
"Sila": "slt",
"Silacayoapan Mixtec": "mks",
"Sileibi": "sbq",
"Silesian": "szl",
"Silimo": "wul",
"Siliput": "mkc",
"Silopi": "xsp",
"Silt'e": "stv",
"Simaa": "sie",
"Simalungun Batak": "bts",
"Simba": "sbw",
"Simbali": "smg",
"Simbari": "smb",
"Simbo": "sbb",
"Simeku": "smz",
"Simeulue": "smr",
"Simte": "smt",
"Sinacantán": "nai-sin",
"Sinagen": "siu",
"Sinasina": "sst",
"Sinaugoro": "snc",
"Sindarin": "sjn",
"Sindhi": "sd",
"Sindhi Bhil": "sbn",
"Sindihui Mixtec": "xts",
"Singa": "sgm",
"Singapore Sign Language": "sls",
"Singpho": "sgp",
"Sinhalese": "si",
"Sinicahua Mixtec": "xti",
"Sininkere": "skq",
"Sinte Romani": "rmo",
"Sinyar": "sys",
"Sinúfana": "sai-sin",
"Sio": "xsi",
"Siona": "snn",
"Sipakapense": "qum",
"Sira": "swj",
"Siraya": "fos",
"Sirenik": "ysr",
"Siri": "sir",
"Siriano": "sri",
"Sirionó": "srq",
"Sirmauri": "srx",
"Siroi": "ssd",
"Sissala": "sld",
"Sissano": "sso",
"Situ": "sit-sit",
"Siuslaw": "sis",
"Sivandi": "siy",
"Siwai": "siw",
"Siwi": "siz",
"Siwu": "akp",
"Siyin Chin": "csy",
"Skagit": "ska",
"Skalvian": "svx",
"Ske": "ske",
"Skepi Creole Dutch": "skw",
"Skolt Sami": "sms",
"Skou": "skv",
"Slavey": "den",
"Slavomolisano": "svm",
"Slovak": "sk",
"Slovakian Sign Language": "svk",
"Slovene": "sl",
"Slovincian": "zlw-slv",
"Small Flowery Miao": "sfm",
"Smärky Kanum": "kxq",
"Snohomish": "sno",
"So'a": "ssq",
"Sobei": "sob",
"Sochiapam Chinantec": "cso",
"Soga": "xog",
"Sogdian": "sog",
"Sok": "skk",
"Sokna": "swn",
"Soko": "soc",
"Sokoro": "sok",
"Solano": "xso",
"Soli": "sby",
"Solon": "tuw-sol",
"Solong": "aaw",
"Solos": "sol",
"Som": "smc",
"Somali": "so",
"Somba-Siawari": "bmu",
"Somra": "ntx",
"Somrai": "sor",
"Somray": "smu",
"Somyev": "kgt",
"Sonaga": "ysg",
"Sonde": "shc",
"Songe": "sop",
"Songlai Chin": "csj",
"Songomeno": "soe",
"Songoora": "sod",
"Sonha": "soi",
"Sonia": "siq",
"Soninke": "snk",
"Sonsorolese": "sov",
"Soo": "teu",
"Sop": "urw",
"Soqotri": "sqt",
"Sora": "srb",
"Sori-Harengan": "sbh",
"Sorkhei": "sqo",
"Sorothaptic": "sxo",
"Sorsogon Ayta": "ays",
"Sos Kundi": "sdk",
"Sota Kanum": "krz",
"Sotho": "st",
"Sou": "sqq",
"South African Sign Language": "sfs",
"South Awyu": "aws",
"South Boma": "bnt-sbo",
"South Central Banda": "lnl",
"South Central Dinka": "dib",
"South Efate": "erk",
"South Fali": "fal",
"South Giziga": "giz",
"South Lembata": "lmf",
"South Levantine Arabic": "ajp",
"South Marquesan": "mqm",
"South Muyu": "kts",
"South Nuaulu": "nxl",
"South Picene": "spx",
"South Slavey": "xsl",
"South Tairora": "omw",
"South Ucayali Ashéninka": "cpy",
"South Watut": "mcy",
"Southeast Ambrym": "tvk",
"Southeast Babar": "vbb",
"Southeast Ijo": "ijs",
"Southeast Pashayi": "psi",
"Southeast Tasmanian": "xpf",
"Southeastern Dinka": "dks",
"Southeastern Ixtlán Zapotec": "zpd",
"Southeastern Kolami": "nit",
"Southeastern Nochixtlán Mixtec": "mxy",
"Southeastern Pomo": "pom",
"Southeastern Puebla Nahuatl": "npl",
"Southeastern Tarahumara": "tcu",
"Southeastern Tepehuan": "stp",
"Southern Alta": "agy",
"Southern Altai": "alt",
"Southern Amami-Oshima": "ams",
"Southern Bai": "bfs",
"Southern Birifor": "biv",
"Southern Bobo": "bwq",
"Southern Bontoc": "obk",
"Southern Carrier": "caf",
"Southern Catanduanes Bicolano": "bln",
"Southern Dagaare": "dga",
"Southern East Cree": "crj",
"Southern Ghale": "ghe",
"Southern Grebo": "grj",
"Southern Guiyang Hmong": "hmy",
"Southern Haida": "hax",
"Southern Hindko": "hnd",
"Southern Kalapuya": "sxk",
"Southern Kalinga": "ksc",
"Southern Kam": "kmc",
"Southern Kissi": "kss",
"Southern Kiwai": "kjd",
"Southern Kurdish": "sdh",
"Southern Lolopo": "ysp",
"Southern Lorung": "lrr",
"Southern Luri": "luz",
"Southern Ma'di": "snm",
"Southern Mashan Hmong": "hma",
"Southern Mnong": "mnn",
"Southern Muji": "ymc",
"Southern Ndebele": "nr",
"Southern Ngbandi": "nbw",
"Southern Nicobarese": "nik",
"Southern Nisu": "nsd",
"Southern Nuni": "nnw",
"Southern Ohlone": "css",
"Southern One": "osu",
"Southern Pame": "pmz",
"Southern Pomo": "peq",
"Southern Puebla Mixtec": "mit",
"Southern Puget Sound Salish": "slh",
"Southern Pumi": "pmj",
"Southern Qiandong Miao": "hms",
"Southern Qiang": "qxs",
"Southern Rengma Naga": "nre",
"Southern Rincon Zapotec": "zsr",
"Southern Roglai": "rgs",
"Southern Sama": "ssb",
"Southern Sami": "sma",
"Southern Samo": "sbd",
"Southern Selkup": "sel-sou",
"Southern Sierra Miwok": "skd",
"Southern Thai": "sou",
"Southern Tidong": "itd",
"Southern Tiwa": "tix",
"Southern Toussian": "wib",
"Southern Tujia": "tjs",
"Southern Tutchone": "tce",
"Southern Valley Yokuts": "nai-svy",
"Southern Yukaghir": "yux",
"Southwest Gbaya": "gso",
"Southwest Palawano": "plv",
"Southwest Pashayi": "psh",
"Southwest Tanna": "nwi",
"Southwestern Bontoc": "vbk",
"Southwestern Dinka": "dik",
"Southwestern Fars": "fay",
"Southwestern Guiyang Hmong": "hmg",
"Southwestern Huishui Hmong": "hmh",
"Southwestern Nisu": "nsv",
"Southwestern Tamang": "tsf",
"Southwestern Tarahumara": "twr",
"Southwestern Tepehuan": "tla",
"Southwestern Tlaxiaco Mixtec": "meh",
"Sowa": "sww",
"Sowanda": "sow",
"Soyaltepec Mazatec": "vmp",
"Soyaltepec Mixtec": "vmq",
"Spanish": "es",
"Spanish Sign Language": "ssp",
"Spiti Bhoti": "spt",
"Spokane": "spo",
"Squamish": "squ",
"Sranan Tongo": "srn",
"Sri Lankan Creole Malay": "sci",
"Sri Lankan Sign Language": "sqs",
"Stod Bhoti": "sbu",
"Stoney": "sto",
"Suabo": "szp",
"Suarmin": "seo",
"Suau": "swp",
"Suba": "sxb",
"Suba-Simbiti": "ssc",
"Subi": "xsj",
"Subiya": "sbs",
"Subtiaba": "sut",
"Sudanese Arabic": "apd",
"Sudest": "tgo",
"Sudovian": "xsv",
"Suena": "sue",
"Suga": "sgi",
"Suganga": "sug",
"Sugut Dusun": "kzs",
"Sui": "swi",
"Suki": "sui",
"Suku": "sub",
"Sukuma": "suk",
"Sukur": "syk",
"Sukurum": "zsu",
"Sula": "szn",
"Sulka": "sua",
"Sulod": "srg",
"Sulung": "suv",
"Suma": "sqm",
"Sumariup": "siv",
"Sumau": "six",
"Sumbawa": "smw",
"Sumbwa": "suw",
"Sumerian": "sux",
"Sumtu Chin": "csv",
"Sunam": "ssk",
"Sundanese": "su",
"Sunum": "ymn",
"Sunwar": "suz",
"Suoy": "syo",
"Supyire": "spp",
"Sur": "tdl",
"Surbakhal": "sbj",
"Suri": "suq",
"Surigaonon": "sgd",
"Surjapuri": "sjp",
"Sursurunga": "sgz",
"Suruahá": "swx",
"Surubu": "sde",
"Suruí": "sru",
"Suruí Do Pará": "mdz",
"Susquehannock": "sqn",
"Susu": "sus",
"Susuami": "ssu",
"Suundi": "sdj",
"Suwawa": "swu",
"Suyá": "suy",
"Svan": "sva",
"Swabian": "swg",
"Swahili": "sw",
"Swampy Cree": "csw",
"Swazi": "ss",
"Swedish": "sv",
"Swedish Sign Language": "swl",
"Swiss-French Sign Language": "ssr",
"Swiss-German Sign Language": "sgg",
"Swiss-Italian Sign Language": "slf",
"Swo": "sox",
"Syenara Senoufo": "shz",
"Sylheti": "syl",
"Sácata": "sai-sac",
"São Paulo Kaingáng": "zkp",
"Sãotomense": "cri",
"Sìcìté Sénoufo": "sep",
"Sô": "sss",
"T'en": "tct",
"Taabwa": "tap",
"Tabaa Zapotec": "zat",
"Tabancale": "sai-tab",
"Tabaru": "tby",
"Tabasaran": "tab",
"Tabasco Chontal": "chf",
"Tabasco Nahuatl": "nhc",
"Tabasco Zoque": "zoq",
"Tabla": "tnm",
"Tabo": "knv",
"Tabriak": "tzx",
"Tacahua Mixtec": "xtt",
"Tacana": "tna",
"Tachawit": "shy",
"Tadaksahak": "dsq",
"Tadyawan": "tdy",
"Tae'": "rob",
"Tafi": "tcd",
"Tafreshi": "xme-taf",
"Tagabawa": "bgs",
"Tagakaulu Kalagan": "klg",
"Tagal Murut": "mvv",
"Tagalog": "tl",
"Tagbanwa": "tbw",
"Tagbu": "tbm",
"Tagdal": "tda",
"Tagish": "tgx",
"Tagoi": "tag",
"Tagwana Senoufo": "tgw",
"Tahitian": "ty",
"Tahltan": "tht",
"Tai": "taw",
"Tai Daeng": "tyr",
"Tai Dam": "blt",
"Tai Do": "tyj",
"Tai Dón": "twh",
"Tai Hang Tong": "thc",
"Tai Hongjin": "tiz",
"Tai Laing": "tjl",
"Tai Loi": "tlq",
"Tai Long": "thi",
"Tai Nüa": "tdd",
"Tai Pao": "tpo",
"Tai Thanh": "tmm",
"Tai Ya": "cuu",
"Taiap": "gpn",
"Taikat": "aos",
"Taimyr Pidgin Russian": "crp-tpr",
"Tainae": "ago",
"Tairuma": "uar",
"Taishanese": "zhx-tai",
"Taita": "dav",
"Taivoan": "tvx",
"Taiwan Sign Language": "tss",
"Taje": "pee",
"Tajik": "tg",
"Tajiki Arabic": "abh",
"Tajio": "tdj",
"Tajuasohn": "tja",
"Takelma": "tkm",
"Takia": "tbc",
"Takka Apabhramsa": "inc-tak",
"Takua": "tkz",
"Takuu": "nho",
"Takwane": "tke",
"Tal": "tal",
"Tala": "tak",
"Talaud": "tld",
"Taliabu": "tlv",
"Talieng": "tdf",
"Talinga-Bwisi": "tlj",
"Talise": "tlr",
"Tallán": "sai-tal",
"Talodi": "tlo",
"Taloki": "tlk",
"Talondo'": "tln",
"Talossan": "tzl",
"Talu": "yta",
"Talysh": "tly",
"Tama (Chad)": "tma",
"Tama (Colombia)": "ten",
"Tamagario": "tcg",
"Tamambo": "mla",
"Taman (Indonesia)": "tmn",
"Taman (Myanmar)": "tcl",
"Tamanaku": "tmz",
"Tamazola Mixtec": "vmx",
"Tambas": "tdk",
"Tambora": "xxt",
"Tambotalo": "tls",
"Tambunan Dusun": "kzt",
"Tami": "tmy",
"Tamil": "ta",
"Tamki": "tax",
"Tamnim Citak": "tml",
"Tampias Lobu": "low",
"Tampuan": "tpu",
"Tampulma": "tpm",
"Tanacross": "tcb",
"Tanahmerah": "tcm",
"Tanapag": "tpv",
"Tandaganon": "tgn",
"Tandia": "tni",
"Tanema": "tnx",
"Tangale": "tan",
"Tangam": "sit-tgm",
"Tangchangya": "tnv",
"Tanggu": "tgu",
"Tangkhul Naga": "nmf",
"Tangko": "tkx",
"Tanglang": "ytl",
"Tangoa": "tgp",
"Tangsa": "nst",
"Tanguat": "tbs",
"Tangut": "txg",
"Tangwang": "crp-tnw",
"Tanimbili": "tbe",
"Tanimuca-Retuarã": "tnc",
"Tanjijili": "uji",
"Tanudan Kalinga": "kml",
"Tanzanian Sign Language": "tza",
"Taos": "twf",
"Tapachultec": "nai-tap",
"Taparita": "sai-tpr",
"Tapayuna": "sai-tap",
"Tapeba": "tbb",
"Tapei": "afp",
"Tapieté": "tpj",
"Tapirapé": "taf",
"Tar Gula": "kcm",
"Tara Baka": "bdh",
"Tarairiú": "sai-trr",
"Tarantino": "roa-tar",
"Tarao": "tro",
"Taraon": "mhu",
"Tareng": "tgr",
"Tariana": "tae",
"Tarifit": "rif",
"Tarjumo": "txj",
"Tarok": "yer",
"Taroko": "trv",
"Tarpia": "tpf",
"Tartessian": "txr",
"Taruma": "tdm",
"Tasawaq": "twq",
"Tashelhit": "shi",
"Tasmanian": "xtz",
"Tasmate": "tmt",
"Tat": "ttt",
"Tataltepec Chatino": "cta",
"Tatana": "txx",
"Tatar": "tt",
"Tataviam": "azc-tat",
"Tatuyo": "tav",
"Tauade": "ttd",
"Taulil": "tuh",
"Taungyo": "tco",
"Taupota": "tpa",
"Tause": "tad",
"Taushiro": "trr",
"Tausug": "tsg",
"Tauya": "tya",
"Taveta": "tvs",
"Tavoyan": "tvn",
"Tavringer Romani": "rmu",
"Tawala": "tbo",
"Tawandê": "xtw",
"Tawang Monpa": "twm",
"Tawasa": "nai-taw",
"Taworta": "tbp",
"Tawoyan": "twy",
"Tawr Chin": "tcp",
"Tay Khang": "tnu",
"Tayabas Ayta": "ayy",
"Taymanitic": "sem-tay",
"Tayo": "cks",
"Taíno": "tnq",
"Tboli": "tbl",
"Tchitchege": "tck",
"Tchumbuli": "bqa",
"Te'un": "tve",
"Teanu": "tkw",
"Tebul Sign Language": "tsy",
"Tebul Ure Dogon": "dtu",
"Tecpatlán Totonac": "tcw",
"Tedaga": "tuq",
"Tedim Chin": "ctd",
"Tee": "tkq",
"Tefaro": "tfo",
"Tegali": "ras",
"Tehit": "kps",
"Tehuelche": "teh",
"Teiwa": "twe",
"Tejalapan Zapotec": "ztt",
"Teke-Fuumu": "ifm",
"Teke-Kukuya": "kkw",
"Teke-Laali": "lli",
"Teke-Tege": "teg",
"Teke-Tsaayi": "tyi",
"Teke-Tyee": "tyx",
"Tektiteko": "ttc",
"Tela-Masbuar": "tvm",
"Telefol": "tlf",
"Telugu": "te",
"Teluti": "tlt",
"Tem": "kdh",
"Temascaltepec Nahuatl": "nhv",
"Tembé": "tqb",
"Teme": "tdo",
"Temein": "teq",
"Temi": "soz",
"Temiar": "tea",
"Temne": "tem",
"Temoaya Otomi": "ott",
"Temoq": "tmo",
"Tempasuk Dusun": "tdu",
"Ten'edn": "tnz",
"Tenango Otomi": "otn",
"Tene Kan Dogon": "dtk",
"Tenggarong Kutai Malay": "vkt",
"Tengger": "tes",
"Tenharim": "pah",
"Tenino": "tqn",
"Tenis": "tns",
"Tennet": "tex",
"Teochew": "zhx-teo",
"Teojomulco Chatino": "omq-teo",
"Teop": "tio",
"Teor": "tev",
"Tepecano": "tep",
"Tepetotutla Chinantec": "cnt",
"Tepeuxila Cuicatec": "cux",
"Tepinapa Chinantec": "cte",
"Tepo Krumen": "ted",
"Teposcolula Mixtec": "omq-tel",
"Tequistlatec": "nai-teq",
"Ter Sami": "sjt",
"Tera": "ttr",
"Terebu": "trb",
"Terei": "buo",
"Tereno": "ter",
"Teressa": "tef",
"Tereweng": "twg",
"Teribe": "tfr",
"Terik": "tec",
"Termanu": "twu",
"Ternate": "tft",
"Ternateño": "tmg",
"Tese": "keg",
"Teshenawa": "twc",
"Tetela": "tll",
"Tetelcingo Nahuatl": "nhg",
"Tetete": "teb",
"Tetserret": "tez",
"Tetum": "tet",
"Tetun Dili": "tdt",
"Teushen": "sai-teu",
"Teutila Cuicatec": "cut",
"Tewa": "tew",
"Texcatepec Otomi": "otx",
"Texistepec Popoluca": "poq",
"Texmelucan Zapotec": "zpz",
"Tezoatlán Mixtec": "mxb",
"Tha": "thy",
"Thachanadan": "thn",
"Thado Chin": "tcz",
"Thai": "th",
"Thai Mon": "mnw-tha",
"Thai Sign Language": "tsq",
"Thai Song": "soa",
"Thaiphum Chin": "cth",
"Thakali": "ths",
"Thamudic": "sem-tha",
"Thangal Naga": "nki",
"Thangmi": "thf",
"Thao": "ssf",
"Tharaka": "thk",
"Tharrgari": "dhr",
"Thavung": "thm",
"Thawa": "xtv",
"Tho": "tou",
"Thompson": "thp",
"Thopho": "ytp",
"Thracian": "txh",
"Thu Lao": "tyl",
"Thulung": "tdh",
"Thurawal": "tbh",
"Thuri": "thu",
"Tiagbamrin Aizi": "ahi",
"Tiale": "mnl",
"Tiang": "tbj",
"Tibea": "ngy",
"Tibetan": "bo",
"Ticuna": "tca",
"Tidaá Mixtec": "mtx",
"Tidore": "tvo",
"Tiemacèwè Bozo": "boo",
"Tiene": "tii",
"Tifal": "tif",
"Tigak": "tgc",
"Tigon Mbembe": "nza",
"Tigre": "tig",
"Tigrinya": "ti",
"Tii": "txq",
"Tijaltepec Mixtec": "xtl",
"Tikar": "tik",
"Tikopia": "tkp",
"Tilapa Otomi": "otl",
"Tillamook": "til",
"Tilquiapan Zapotec": "zts",
"Tilung": "tij",
"Tima": "tms",
"Timbe": "tim",
"Timor Pidgin": "tvy",
"Timote": "sai-tim",
"Timucua": "tjm",
"Timugon Murut": "tih",
"Tinani": "lbf",
"Tindi": "tin",
"Tingui-Boto": "tgv",
"Tinigua": "tit",
"Tinoc Kallahan": "tne",
"Tinputz": "tpz",
"Tipai": "nai-tip",
"Tippera": "tpe",
"Tira": "tic",
"Tirahi": "tra",
"Tiranige Diga Dogon": "tde",
"Tircul": "pyx",
"Tiri": "cir",
"Tiruray": "tiy",
"Tita": "tdq",
"Titan": "ttv",
"Tiv": "tiv",
"Tiwa": "lax",
"Tiwi": "tiw",
"Tiéfo": "tiq",
"Tiéyaxo Bozo": "boz",
"Tjurruru": "tju",
"Tlachichilco Tepehua": "tpt",
"Tlacoapa Me'phaa": "tpl",
"Tlacoatzintepec Chinantec": "ctl",
"Tlacolulita Zapotec": "zpk",
"Tlahuica": "ocu",
"Tlahuitoltepec Mixe": "mxp",
"Tlamacazapa Nahuatl": "nuz",
"Tlazoyaltepec Mixtec": "mqh",
"Tlingit": "tli",
"To": "toz",
"To'abaita": "mlu",
"Toaripi": "tqo",
"Toba": "tob",
"Toba Batak": "bbc",
"Toba-Maskoy": "tmf",
"Tobagonian Creole English": "tgh",
"Tobanga": "tng",
"Tobati": "tti",
"Tobelo": "tlb",
"Tobian": "tox",
"Tobilung": "tgb",
"Tobo": "tbv",
"Tocantins Asurini": "asu",
"Tocharian A": "xto",
"Tocharian B": "txb",
"Tocho": "taz",
"Toda": "tcx",
"Todrah": "tdr",
"Tofa": "kim",
"Tofanma": "tlg",
"Tofin Gbe": "tfi",
"Togbo-Vara Banda": "tor",
"Togoyo": "tgy",
"Tojolabal": "toj",
"Tok Pisin": "tpi",
"Toka-Leya": "dov",
"Tokano": "zuh",
"Tokelauan": "tkl",
"Toki Pona": "tok",
"Toku-No-Shima": "tkn",
"Tol": "jic",
"Tolai": "ksd",
"Tolaki": "lbw",
"Tolomako": "tlm",
"Tolowa": "tol",
"Toma": "tod",
"Tomadino": "tdi",
"Tombelala": "ttp",
"Tombonuo": "txa",
"Tombulu": "tom",
"Tomini": "txm",
"Tommeginne": "xpv",
"Tommo So": "dto",
"Tomo Kan Dogon": "dtm",
"Tomoip": "tqp",
"Tondano": "tdn",
"Tonga (Malawi)": "tog",
"Tonga (Mozambique)": "toh",
"Tonga (Zambia)": "toi",
"Tongan": "to",
"Tongwe": "tny",
"Tonjon": "tjn",
"Tonkawa": "tqw",
"Tonsawang": "tnw",
"Tonsea": "txs",
"Tontemboan": "tnt",
"Toogee": "xpx",
"Tooro": "ttj",
"Topoiyo": "toy",
"Toposa": "toq",
"Toraja-Sa'dan": "sda",
"Toram": "trj",
"Torau": "ttu",
"Toro": "tdv",
"Toro So Dogon": "dts",
"Toro Tegu Dogon": "dtt",
"Toromono": "tno",
"Torona": "tqr",
"Torres Strait Creole": "tcs",
"Torricelli": "tei",
"Torricelli Yau": "yyu",
"Torwali": "trw",
"Torá": "trz",
"Tosu": "sit-tos",
"Totela": "ttl",
"Toto": "txo",
"Totoli": "txe",
"Totomachapan Zapotec": "zph",
"Totontepec Mixe": "mto",
"Totoro": "ttk",
"Touo": "tqu",
"Toura": "neb",
"Tourangeau": "roa-tou",
"Towei": "ttn",
"Translingual": "mul",
"Transylvanian Saxon": "gmw-tsx",
"Traveller Danish": "rmd",
"Traveller Norwegian": "rmg",
"Traveller Scottish": "trl",
"Tregami": "trm",
"Tremembé": "tme",
"Trieng": "stg",
"Trimuris": "tip",
"Tring": "tgq",
"Tringgus": "trx",
"Trinidad and Tobago Sign Language": "lst",
"Trinidadian Creole English": "trf",
"Trinitario": "trn",
"Trió": "tri",
"Truká": "tka",
"Trumai": "tpy",
"Ts'ün-Lao": "tsl",
"Tsaangi": "tsa",
"Tsafiki": "cof",
"Tsakhur": "tkr",
"Tsakonian": "tsd",
"Tsakwambo": "kvz",
"Tsamai": "tsb",
"Tsat": "huq",
"Tsetsaut": "txc",
"Tsez": "ddo",
"Tshangla": "tsj",
"Tshobdun": "sit-tsh",
"Tshwa": "hio",
"Tsikimba": "kdl",
"Tsimané": "cas",
"Tsimshian": "tsi",
"Tsishingini": "tsw",
"Tso": "ldp",
"Tsogo": "tsv",
"Tsonga": "ts",
"Tsotsitaal": "fly",
"Tsou": "tsu",
"Tsum": "ttz",
"Tsuvadi": "tvd",
"Tsuvan": "tsh",
"Tswa": "tsc",
"Tswana": "tn",
"Tswapong": "two",
"Tuamotuan": "pmt",
"Tuareg": "tmh",
"Tubar": "tbu",
"Tucano": "tuo",
"Tugen": "tuy",
"Tugun": "tzn",
"Tugutil": "tuj",
"Tukang Besi North": "khc",
"Tukang Besi South": "bhq",
"Tuki": "bag",
"Tukpa": "tpq",
"Tukudede": "tkd",
"Tukumanféd": "tkf",
"Tula": "tul",
"Tule-Kaweah Yokuts": "nai-tky",
"Tulehu": "tlu",
"Tulishi": "tey",
"Tulu": "tcy",
"Tulu-Bohuai": "rak",
"Tulua": "aus-tul",
"Tuma-Irumu": "iou",
"Tumak": "tmc",
"Tumbuka": "tum",
"Tumi": "kku",
"Tumleo": "tmq",
"Tumshuqese": "xtq",
"Tumtum": "tbr",
"Tumulung Sisaala": "sil",
"Tundra Enets": "enh",
"Tundra Nenets": "yrk",
"Tunen": "tvu",
"Tungag": "lcm",
"Tunggare": "trt",
"Tunia": "tug",
"Tunica": "tun",
"Tunisian Arabic": "aeb",
"Tunisian Berber": "sds",
"Tunisian Sign Language": "tse",
"Tunjung": "tjg",
"Tunni": "tqq",
"Tunumiisut": "esx-tut",
"Tunzu": "dza",
"Tuoba": "qfa-xgx-tuo",
"Tuotomb": "ttf",
"Tuparí": "tpr",
"Tupinambá": "tpn",
"Tupinikin": "tpk",
"Tupuri": "tui",
"Turaka": "trh",
"Turi": "trd",
"Turiwára": "twt",
"Turka": "tuz",
"Turkana": "tuv",
"Turkish": "tr",
"Turkish Sign Language": "tsm",
"Turkmen": "tk",
"Turks and Caicos Creole English": "tch",
"Turoyo": "tru",
"Turumsa": "tqm",
"Turung": "try",
"Tuscarora": "tus",
"Tutelo": "tta",
"Tutong": "ttg",
"Tutsa Naga": "tvt",
"Tutuba": "tmi",
"Tututepec Mixtec": "mtu",
"Tututni": "tuu",
"Tuvaluan": "tvl",
"Tuvan": "tyv",
"Tuwali Ifugao": "ifk",
"Tuwari": "tww",
"Tuwuli": "bov",
"Tuxináwa": "tux",
"Tuxá": "tud",
"Tuyuca": "tue",
"Tuyuhun": "qfa-xgx-tuh",
"Twana": "twa",
"Twendi": "twn",
"Tyap": "kcg",
"Tyaraity": "woa",
"Tyerrernotepanner": "xph",
"Tz'utujil": "tzj",
"Tzeltal": "tzh",
"Tzotzil": "tzo",
"Tày": "tyz",
"Tày Tac": "tyt",
"Tây Bồi": "tas",
"Téén": "lor",
"Tübatulabal": "tub",
"U": "uuu",
"Uab Meto": "aoz",
"Uamué": "uam",
"Uare": "ksj",
"Ubaghara": "byc",
"Ubang": "uba",
"Ubi": "ubi",
"Ubir": "ubr",
"Ubykh": "uby",
"Ucayali-Yurúa Ashéninka": "cpb",
"Uda": "uda",
"Udi": "udi",
"Udihe": "ude",
"Udmurt": "udm",
"Uduk": "udu",
"Ufim": "ufi",
"Ugandan Sign Language": "ugn",
"Ugaritic": "uga",
"Ughele": "uge",
"Uhami": "uha",
"Uisai": "uis",
"Ujir": "udj",
"Ukaan": "kcf",
"Ukhwejo": "ukh",
"Ukit": "umi",
"Ukpe-Bayobiri": "ukp",
"Ukpet-Ehom": "akd",
"Ukrainian": "uk",
"Ukrainian Sign Language": "ukl",
"Ukue": "uku",
"Ukuriguma": "ukg",
"Ukwa": "ukq",
"Ukwuani-Aboh-Ndoni": "ukw",
"Ulau-Suain": "svb",
"Ulch": "ulc",
"Uldeme": "udl",
"Ulithian": "uli",
"Ullatan": "ull",
"Ulumanda'": "ulm",
"Ulwa": "ulw",
"Uma": "ppk",
"Uma' Lasan": "xky",
"Uma' Lung": "ulu",
"Umanakaina": "gdn",
"Umatilla": "uma",
"Umbindhamu": "umd",
"Umbrian": "xum",
"Umbu-Ungu": "ubu",
"Umbugarla": "umr",
"Umbundu": "umb",
"Umbuygamu": "umg",
"Ume Sami": "sju",
"Umeda": "upi",
"Umiida": "xud",
"Umiray Dumaget Agta": "due",
"Umon": "umm",
"Umotína": "umo",
"Umpila": "ump",
"Una": "mtg",
"Unami": "unm",
"Unas": "art-una",
"Unde Kaili": "unz",
"Undetermined": "und",
"Uneapa": "bbn",
"Uneme": "une",
"Unggaranggu": "xun",
"Unggumi": "xgu",
"Unserdeutsch": "uln",
"Unua": "onu",
"Unubahe": "unu",
"Uokha": "uok",
"Upper Chehalis": "cjh",
"Upper Grand Valley Dani": "dna",
"Upper Kinabatangan": "dmg",
"Upper Kuskokwim": "kuu",
"Upper Necaxa Totonac": "tku",
"Upper Sorbian": "hsb",
"Upper Ta'oih": "tth",
"Upper Tanana": "tau",
"Upper Taromi": "tov",
"Upper Umpqua": "xup",
"Ura (New Guinea)": "uro",
"Ura (Vanuatu)": "uur",
"Uradhi": "urf",
"Urak Lawoi'": "urk",
"Urali": "url",
"Urapmin": "urm",
"Urarina": "ura",
"Urartian": "xur",
"Urat": "urt",
"Urdu": "ur",
"Urhobo": "urh",
"Uri": "uvh",
"Urigina": "urg",
"Urim": "uri",
"Urimo": "urx",
"Uripiv-Wala-Rano-Atchin": "upv",
"Urningangg": "urc",
"Uru": "ure",
"Uru-Eu-Wau-Wau": "urz",
"Uru-Pa-In": "urp",
"Uruangnirin": "urn",
"Uruava": "urv",
"Urubú-Kaapor": "urb",
"Uruguayan Sign Language": "ugy",
"Urum": "uum",
"Urumi": "uru",
"Usaghade": "usk",
"Usan": "wnu",
"Usarufa": "usa",
"Ushojo": "ush",
"Usila Chinantec": "cuc",
"Uspanteco": "usp",
"Usui": "usi",
"Utarmbung": "omo",
"Ute": "ute",
"Utu": "utu",
"Uvbie": "evh",
"Uwinymil": "aus-uwi",
"Uya": "usu",
"Uyajitaya": "duk",
"Uyghur": "ug",
"Uzbek": "uz",
"Uzbeki Arabic": "auz",
"Uzekwe": "eze",
"Vaagri Booli": "vaa",
"Vaghri": "vgr",
"Vaghua": "tva",
"Vagla": "vag",
"Vai": "vai",
"Vaiphei": "vap",
"Vale": "vae",
"Valencian Sign Language": "vsv",
"Valle Nacional Chinantec": "cvn",
"Valley Maidu": "vmv",
"Valman": "van",
"Valpei": "vlp",
"Vamale": "mkt",
"Vame": "mlr",
"Vandalic": "xvn",
"Vangunu": "mpr",
"Vanimo": "vam",
"Vanji": "ira-wnj",
"Vanuma": "vau",
"Vao": "vao",
"Varhadi": "vah",
"Varisi": "vrs",
"Varli": "vav",
"Vasavi": "vas",
"Vayu": "vay",
"Veddah": "ved",
"Vehes": "val",
"Vemgo-Mabas": "vem",
"Venda": "ve",
"Venetian": "vec",
"Venetic": "xve",
"Venezuelan Sign Language": "vsl",
"Ventureño": "veo",
"Veps": "vep",
"Vera'a": "vra",
"Vestinian": "xvs",
"Vidunda": "vid",
"Viemo": "vig",
"Vietnamese": "vi",
"Vilamovian": "wym",
"Vilela": "vil",
"Vili": "vif",
"Villa Viciosa Agta": "dyg",
"Vincentian Creole English": "svc",
"Virgin Islands Creole": "vic",
"Vishavan": "vis",
"Viti": "vit",
"Vitou": "vto",
"Viya": "gev",
"Vlax Romani": "rmy",
"Volapük": "vo",
"Volga German": "gmw-vog",
"Volscian": "xvo",
"Vono": "kch",
"Voro": "vor",
"Votic": "vot",
"Vracada Apabhramsa": "inc-vra",
"Vumbu": "vum",
"Vunapu": "vnp",
"Vunjo": "vun",
"Vurës": "msn",
"Vute": "vut",
"Võro": "vro",
"Wa": "wbm",
"Wa'ema": "wag",
"Waama": "wwa",
"Waamwang": "wmn",
"Wab": "wab",
"Wabo": "wbb",
"Waboda": "kmx",
"Waci Gbe": "wci",
"Wadaginam": "wdg",
"Waddar": "wbq",
"Wadi Wadi": "xwd",
"Wadiyara Koli": "kxp",
"Wadjabangayi": "wdy",
"Wadjiginy": "wdj",
"Wadjigu": "wdu",
"Wae Rana": "wrx",
"Waffa": "waj",
"Wagawaga": "wgb",
"Wagaya": "wga",
"Wagdi": "wbr",
"Wageman": "waq",
"Wagi": "fad",
"Wahau Kayan": "whu",
"Wahau Kenyah": "whk",
"Wahgi": "wgi",
"Waigali": "wbk",
"Waigeo": "wgo",
"Waikuri": "nai-wai",
"Wailaki": "wlk",
"Wailapa": "wlr",
"Waima'a": "wmh",
"Waimaha": "bao",
"Waimiri-Atroari": "atr",
"Wainumá": "awd-wai",
"Waioli": "wli",
"Waitaká": "sai-wai",
"Waiwai": "waw",
"Waja": "wja",
"Wajarri": "wbv",
"Wajuk": "xwj",
"Waka": "wav",
"Wakawaka": "wkw",
"Wakhi": "wbl",
"Wakoná": "waf",
"Wala": "lgl",
"Walak": "wlw",
"Walangama": "nlw",
"Wali (Ghana)": "wlx",
"Wali (Sudan)": "wll",
"Waling": "wly",
"Walio": "wla",
"Walla Walla": "waa",
"Wallisian": "wls",
"Walloon": "wa",
"Walmajarri": "wmt",
"Wam": "wmo",
"Wamas": "wmc",
"Wambaya": "wmb",
"Wambon": "wms",
"Wambule": "wme",
"Wamey": "cou",
"Wamin": "wmi",
"Wampar": "lbq",
"Wampur": "waz",
"Wan": "wan",
"Wanambre": "wnb",
"Wanap": "wnp",
"Wancho": "nnp",
"Wanda": "wbh",
"Wandala": "mfi",
"Wandamen": "wad",
"Wandarang": "wnd",
"Wandji": "wdd",
"Waneci": "wne",
"Wanga": "lwg",
"Wanggamala": "wnm",
"Wangganguru": "wgg",
"Wanggom": "wng",
"Wangkayutyuru": "wky",
"Wangkumara": "xwk",
"Wanham": "sai-wnm",
"Wanji": "wbi",
"Wanman": "wbt",
"Wannu": "jub",
"Wano": "wno",
"Wantoat": "wnc",
"Wanukaka": "wnk",
"Wanyi": "wny",
"Wané": "hwa",
"Wapan": "juk",
"Wapishana": "wap",
"Wappo": "wao",
"War-Jaintia": "aml",
"Wara": "wbf",
"Warao": "wba",
"Warapu": "wra",
"Waray Sorsogon": "srv",
"Waray-Waray": "war",
"Wardaman": "wrr",
"Wardandi": "wxw",
"Warekena": "gae",
"Warembori": "wsa",
"Wari'": "pav",
"Waris": "wrs",
"Waritai": "wbe",
"Wariyangga": "wri",
"Warji": "wji",
"Warkay-Bipim": "bgv",
"Warlmanpa": "wrl",
"Warlpiri": "wbp",
"Warluwara": "wrb",
"Warnang": "wrn",
"Waropen": "wrp",
"Warray": "wrz",
"Warrgamay": "wgy",
"Warrwa": "wwr",
"Waru": "wru",
"Warumungu": "wrm",
"Waruna": "wrv",
"Warungu": "wrg",
"Warwar Feni": "hrw",
"Wasa": "wss",
"Wasco-Wishram": "wac",
"Wasembo": "gsp",
"Washo": "was",
"Waskia": "wsk",
"Wastek": "hus",
"Wasu": "wsu",
"Watakataui": "wtk",
"Watam": "wax",
"Wathaurong": "wth",
"Watiwa": "wtf",
"Watubela": "wah",
"Waube": "kop",
"Wauja": "wau",
"Wauyai": "wuy",
"Wawa": "www",
"Wawonii": "wow",
"Waxianghua": "wxa",
"Wayampi": "oym",
"Wayana": "way",
"Wayanad Chetti": "ctt",
"Wayoró": "wyr",
"Wayumará": "sai-way",
"Wayuu": "guc",
"Wedau": "wed",
"Weh": "weh",
"Welaung": "weu",
"Weliki": "klh",
"Welsh": "cy",
"Welsh Romani": "rmw",
"Wemale": "weo",
"Wemba-Wemba": "xww",
"Weme Gbe": "wem",
"Wendat": "wdt",
"Weri": "wer",
"Wersing": "kvw",
"West Albay Bikol": "fbl",
"West Ambae": "nnd",
"West Central Banda": "bbp",
"West Coast Bajau": "bdr",
"West Damar": "drn",
"West Flemish": "vls",
"West Frisian": "fy",
"West Greenlandic Pidgin": "crp-gep",
"West Lembata": "lmj",
"West Makian": "mqs",
"West Masela": "mss",
"West Tarangan": "txn",
"West Uvean": "uve",
"West-Central Limba": "lia",
"Western Apache": "apw",
"Western Arrernte": "are",
"Western Bolivian Guaraní": "gnw",
"Western Bru": "brv",
"Western Bukidnon Manobo": "mbb",
"Western Cham": "cja",
"Western Dani": "dnw",
"Western Durango Nahuatl": "azn",
"Western Fijian": "wyy",
"Western Gurung": "gvr",
"Western Highland Chatino": "ctp",
"Western Huasteca Nahuatl": "nhw",
"Western Jicaque": "und-wji",
"Western Juxtlahuaca Mixtec": "jmx",
"Western Karaboro": "kza",
"Western Katu": "kuf",
"Western Kayah": "kyu",
"Western Keres": "kjq",
"Western Krahn": "krw",
"Western Lalu": "ywl",
"Western Lawa": "lcp",
"Western Magar": "mrd",
"Western Maninkakan": "mlq",
"Western Mari": "mrj",
"Western Mashan Hmong": "hmw",
"Western Meohang": "raf",
"Western Muria": "mut",
"Western Neo-Aramaic": "amw",
"Western Ojibwa": "ojw",
"Western Panjabi": "pnb",
"Western Penan": "pne",
"Western Pwo": "pwo",
"Western Sisaala": "ssl",
"Western Subanon": "suc",
"Western Tamang": "tdg",
"Western Tawbuid": "twb",
"Western Totonac": "tqt",
"Western Tunebo": "tnb",
"Western Xiangxi Miao": "mmr",
"Western Xwla Gbe": "xwl",
"Western Yugur": "ybe",
"Wewaw": "wea",
"Weyewa": "wew",
"White Gelao": "giw",
"White Hmong": "mww",
"White Lachi": "lwh",
"Whitesands": "tnp",
"Wiarumus": "tua",
"Wichita": "wic",
"Wichí Lhamtés Güisnay": "mzh",
"Wichí Lhamtés Nocten": "mtp",
"Wichí Lhamtés Vejoz": "wlv",
"Wik-Epa": "wie",
"Wik-Iiyanh": "wij",
"Wik-Keyangan": "wif",
"Wik-Me'anha": "wih",
"Wik-Mungkan": "wim",
"Wik-Ngathana": "wig",
"Wikalkan": "wik",
"Wikngenchera": "wua",
"Wilawila": "wil",
"Winnebago": "win",
"Wintu": "wnw",
"Winyé": "kst",
"Wipi": "gdr",
"Wiradhuri": "wrh",
"Wiraféd": "wir",
"Wirangu": "wgu",
"Wiru": "wiu",
"Wirö": "wpc",
"Wiwa": "mbp",
"Wiyot": "wiy",
"Woccon": "xwc",
"Wogamusin": "wog",
"Wogeo": "woc",
"Woi": "wbw",
"Woiwurrung": "wyi",
"Wojenaka": "jod",
"Wolane": "wle",
"Wolani": "wod",
"Wolaytta": "wal",
"Woleaian": "woe",
"Wolio": "wlo",
"Wolof": "wo",
"Womo": "wmx",
"Wong-gie": "aus-won",
"Wongo": "won",
"Woods Cree": "cwd",
"Woria": "wor",
"Worimi": "kda",
"Worodougou": "jud",
"Worora": "wro",
"Wotapuri-Katarqalai": "wsv",
"Wotu": "wtw",
"Woun Meu": "noa",
"Written Oirat": "xwo",
"Wu": "wuu",
"Wudu": "wud",
"Wuhuan": "qfa-xgx-wuh",
"Wulguru": "aus-wul",
"Wuliwuli": "wlu",
"Wulna": "wux",
"Wumboko": "bqm",
"Wumbvu": "wum",
"Wumeng Nasu": "ywu",
"Wunai Bunu": "bwn",
"Wunambal": "wub",
"Wurrugu": "wur",
"Wusa Nasu": "yig",
"Wushi": "bse",
"Wusi": "wsi",
"Wutung": "wut",
"Wutunhua": "wuh",
"Wuvulu-Aua": "wuv",
"Wyandot": "wya",
"Wára": "tci",
"Wãpha": "juw",
"Wè Northern": "wob",
"Wè Southern": "gxx",
"Wè Western": "wec",
"Xadani Zapotec": "zax",
"Xakriabá": "xkr",
"Xamtanga": "xan",
"Xanaguía Zapotec": "ztg",
"Xaragure": "axx",
"Xavante": "xav",
"Xerénte": "xer",
"Xetá": "xet",
"Xhosa": "xh",
"Xianbei": "qfa-xgx-xbi",
"Xiang": "hsn",
"Xibe": "sjo",
"Xicotepec de Juárez Totonac": "too",
"Xinca": "xin",
"Xingú Asuriní": "asn",
"Xipaya": "xiy",
"Xiri": "xii",
"Xiriâna": "xir",
"Xishanba Lalo": "ywt",
"Xocó": "sai-xoc",
"Xokleng": "xok",
"Xukurú": "xoo",
"Xwela Gbe": "xwe",
"Xârâcùù": "ane",
"Yaa": "iyx",
"Yaaku": "muu",
"Yabarana": "yar",
"Yabaâna": "ybn",
"Yaben": "ybm",
"Yabong": "ybo",
"Yabula Yabula": "yxy",
"Yace": "ekr",
"Yaeyama": "rys",
"Yafi": "wfg",
"Yagara": "yxg",
"Yagaria": "ygr",
"Yagnobi": "yai",
"Yagomi": "ygm",
"Yagua": "yad",
"Yagwoia": "ygw",
"Yahadian": "ner",
"Yahang": "rhp",
"Yahuna": "ynu",
"Yaka": "yaf",
"Yakaikeke": "ykk",
"Yakan": "yka",
"Yakima": "yak",
"Yakkha": "ybh",
"Yakoma": "yky",
"Yakut": "sah",
"Yala": "yba",
"Yalahatan": "jal",
"Yalakalore": "xyl",
"Yalarnnga": "ylr",
"Yale": "nce",
"Yaleba": "ylb",
"Yalunka": "yal",
"Yalálag Zapotec": "zpu",
"Yamap": "ymp",
"Yamba": "yam",
"Yambes": "ymb",
"Yambeta": "yat",
"Yamdena": "jmd",
"Yameo": "yme",
"Yami": "tao",
"Yaminahua": "yaa",
"Yamongeri": "ymg",
"Yamphu": "ybi",
"Yan-nhangu": "jay",
"Yana": "ynn",
"Yanda": "yda",
"Yanda Dogon": "dym",
"Yandjibara": "xyb",
"Yandruwandha": "ynd",
"Yanesha'": "ame",
"Yangben": "yav",
"Yangkaal": "aus-ynk",
"Yangkam": "bsx",
"Yangman": "jng",
"Yango": "yng",
"Yangulam": "ynl",
"Yangum Dey": "yde",
"Yangum Gel": "ygl",
"Yangum Mon": "ymo",
"Yankunytjatjara": "kdd",
"Yanomamö": "guu",
"Yanomámi": "wca",
"Yansi": "yns",
"Yanyuwa": "jao",
"Yao": "yao",
"Yao (South America)": "sai-yao",
"Yaosakor Asmat": "asy",
"Yaouré": "yre",
"Yapese": "yap",
"Yapunda": "yev",
"Yaqay": "jaq",
"Yaqui": "yaq",
"Yarawata": "yrw",
"Yareba": "yrb",
"Yareni Zapotec": "zae",
"Yarli": "yxl",
"Yarluyandi": "yry",
"Yaroamë": "yro",
"Yarumá": "sai-yar",
"Yarí": "yri",
"Yasa": "yko",
"Yatay": "yty",
"Yatee Zapotec": "zty",
"Yatzachi Zapotec": "zav",
"Yaul": "yla",
"Yaur": "jau",
"Yautepec Zapotec": "zpb",
"Yavitero": "yvt",
"Yawa": "yva",
"Yawalapití": "yaw",
"Yawanawa": "ywn",
"Yawarawarga": "yww",
"Yaweyuha": "yby",
"Yawijibaya": "jbw",
"Yawiyo": "ybx",
"Yawuru": "ywr",
"Yaygir": "xya",
"Yazghulami": "yah",
"Yei": "jei",
"Yekhee": "ets",
"Yekora": "ykr",
"Yele": "yle",
"Yelmek": "jel",
"Yelogu": "ylg",
"Yemba": "ybb",
"Yemeni Arabic": "ayn",
"Yemsa": "jnj",
"Yendang": "yen",
"Yeni": "yei",
"Yeniche": "yec",
"Yerakai": "yra",
"Yeretuar": "gop",
"Yerong": "yrn",
"Yerukula": "yeu",
"Yeskwa": "yes",
"Yessan-Mayo": "yss",
"Yetfa": "yet",
"Yevanic": "yej",
"Yeyi": "yey",
"Yiddish": "yi",
"Yidgha": "ydg",
"Yidiny": "yii",
"Yil": "yll",
"Yilan Creole": "ycr",
"Yimas": "yee",
"Yimchungru Naga": "yim",
"Yinbaw Karen": "kvu",
"Yinchia": "yin",
"Yindjibarndi": "yij",
"Yindjilandji": "yil",
"Yine": "pib",
"Yinggarda": "yia",
"Yinhawangka": "ywg",
"Yiningayi": "ygi",
"Yintale Karen": "kvy",
"Yinwum": "yxm",
"Yir-Yoront": "yiy",
"Yirandali": "ljw",
"Yis": "yis",
"Yitha Yitha": "xth",
"Yoba": "yob",
"Yocoboué Dida": "gud",
"Yogad": "yog",
"Yoidik": "ydk",
"Yoke": "yki",
"Yola": "yol",
"Yolmo": "scp",
"Yolngu Sign Language": "ygs",
"Yoloxochitl Mixtec": "xty",
"Yom": "pil",
"Yombe": "yom",
"Yonaguni": "yoi",
"Yong": "yno",
"Yongkom": "yon",
"Yopno": "yut",
"Yora": "mts",
"Yoron": "yox",
"Yorta Yorta": "xyy",
"Yoruba": "yo",
"Yosondúa Mixtec": "mpm",
"Youle Jinuo": "jiu",
"Younuo Bunu": "buh",
"Yout Wam": "ytw",
"Yoy": "yoy",
"Yuaga": "nua",
"Yucatec Maya": "yua",
"Yucatec Maya Sign Language": "msd",
"Yuchi": "yuc",
"Yucuañe Mixtec": "mvg",
"Yucuna": "ycn",
"Yug": "yug",
"Yugambal": "yub",
"Yugoslavian Sign Language": "ysl",
"Yugul": "ygu",
"Yuhup": "yab",
"Yuki": "yuk",
"Yukpa": "yup",
"Yukuben": "ybl",
"Yulu": "yul",
"Yuma": "yum",
"Yumana": "awd-yum",
"Yup'ik": "esu",
"Yupiltepeque": "nai-yup",
"Yupua": "sai-yup",
"Yuqui": "yuq",
"Yuracare": "yuz",
"Yuri": "sai-yri",
"Yurok": "yur",
"Yuru": "ljx",
"Yurumanguí": "sai-yur",
"Yurutí": "yui",
"Yutanduchi Mixtec": "mab",
"Yuwana": "yau",
"Yuyu": "yxu",
"Yámana": "yag",
"Zaachila Zapotec": "ztx",
"Zabana": "kji",
"Zacatepec Chatino": "ctz",
"Zacatlán-Ahuacatlán-Tepetzintla Nahuatl": "nhi",
"Zaghawa": "zag",
"Zaiwa": "atb",
"Zakhring": "zkr",
"Zambian Sign Language": "zsl",
"Zan Gula": "zna",
"Zanaki": "zak",
"Zande": "zne",
"Zangskari": "zau",
"Zangwal": "zah",
"Zaniza Zapotec": "zpw",
"Zapotec": "zap",
"Zaramo": "zaj",
"Zari": "zaz",
"Zarma": "dje",
"Zauzou": "zal",
"Zay": "zwa",
"Zayein Karen": "kxk",
"Zayse-Zergulla": "zay",
"Zazaki": "zza",
"Zazao": "jaj",
"Zbu": "sit-zbu",
"Zealandic": "zea",
"Zeem": "zua",
"Zemba": "dhm",
"Zeme Naga": "nzm",
"Zemgalian": "xzm",
"Zenag": "zeg",
"Zenaga": "zen",
"Zenzontepec Chatino": "czn",
"Zhaba": "zhb",
"Zhang-Zhung": "xzh",
"Zhire": "zhi",
"Zhoa": "zhw",
"Zhuang": "za",
"Zhár": "jjr",
"Zia": "zia",
"Zialo": "zil",
"Zigula": "ziw",
"Zimakani": "zik",
"Zimba": "zmb",
"Zimbabwe Sign Language": "zib",
"Zinza": "zin",
"Zipser German": "gmw-zps",
"Zire": "sih",
"Zirenkel": "zrn",
"Ziriya": "zir",
"Zizilivakan": "ziz",
"Zo'é": "pto",
"Zokhuo": "yzk",
"Zoogocho Zapotec": "zpq",
"Zotung Chin": "czt",
"Zou": "zom",
"Zulgo-Gemzek": "gnd",
"Zulu": "zu",
"Zumaya": "zuy",
"Zumbun": "jmb",
"Zuni": "zun",
"Zuojiang Zhuang": "zzj",
"Zuwara": "ber-zuw",
"Zyphe": "zyp",
"Záparo": "zro",
"Àhàn": "ahn",
"Áncá": "acb",
"Ömie": "aom",
"Önge": "oon",
"ǀXam": "xam",
"ǁAni": "hnh",
"ǁGana": "gnk",
"ǁXegwi": "xeg",
"ǂHoan": "huc",
"ǃKung": "khi-kun",
"ǃXóõ": "nmn"
}
mxni5hnbpxf0opkjpcj0zg6678fp4v2
मॉड्यूल:wikimedia languages
828
304697
487858
477708
2026-09-02T20:55:17Z
SM7
6218
updating...
487858
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local language_like_module = "Module:language-like"
local load_module = "Module:load"
local wm_languages_data_module = "Module:wikimedia languages/data"
local get_by_code -- Defined below.
local gmatch = string.gmatch
local is_known_language_tag = mw.language.isKnownLanguageTag
local make_object -- Defined below.
local require = require
local setmetatable = setmetatable
local type = type
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_lang_data_module_name(...)
get_lang_data_module_name = require(languages_module).getDataModuleName
return get_lang_data_module_name(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local wm_languages_data
local function get_wm_languages_data()
wm_languages_data, get_wm_languages_data = load_data(wm_languages_data_module), nil
return wm_languages_data
end
local WikimediaLanguage = {}
WikimediaLanguage.__index = WikimediaLanguage
function WikimediaLanguage:getCode()
return self._code
end
function WikimediaLanguage:getCanonicalName()
return self._data[1]
end
--function WikimediaLanguage:getAllNames()
-- return self._data.names
--end
--[==[Returns a table of types as a lookup table (with the types as keys).
Currently, the only possible type is {Wikimedia language}.]==]
function WikimediaLanguage:getTypes()
local types = self._types
if types == nil then
types = {["Wikimedia language"] = true}
local rawtypes = self._data.type
if rawtypes then
for t in gmatch(rawtypes, "[^,]+") do
types[t] = true
end
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the Wikimedia language has all of them.]==]
function WikimediaLanguage:hasType(...)
WikimediaLanguage.hasType = require(language_like_module).hasType
return self:hasType(...)
end
function WikimediaLanguage:getWiktionaryLanguage()
local object = self._wiktionaryLanguageObject
if object == nil then
object = get_lang(self._data.wiktionary_code, nil, "allow etym")
self._wiktionaryLanguageObject = object
end
return object
end
-- Do NOT use this method!
-- All uses should be pre-approved on the talk page!
function WikimediaLanguage:getData()
return self._data
end
--[==[Returns the name of the module containing the Wikimedia language's data (if any). Currently, this is always [[Module:wikimedia languages/data]].]==]
function WikimediaLanguage:getDataModuleName()
return wm_languages_data_module
end
function export.makeObject(code, data)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
return setmetatable({_data = data, _code = code}, WikimediaLanguage)
end
make_object = export.makeObject
function export.getByCode(code)
-- Only accept codes the software recognises.
if not is_known_language_tag(code) then
return nil
end
local data = (wm_languages_data or get_wm_languages_data())[code]
-- If there is no specific Wikimedia code, then "borrow" the information
-- from the general Wiktionary language code.
local name, wiktionary_code
if data ~= nil then
name, wiktionary_code = data[1], data.wiktionary_code
if not (name == nil or wiktionary_code == nil) then
return make_object(code, data)
end
end
-- Get the associated Wiktionary language, using the wiktionary_code key or
-- else the input code.
if wiktionary_code == nil then
wiktionary_code = code
end
local lang = get_lang(wiktionary_code, nil, "allow etym", "allow family")
if lang ~= nil then
return make_object(code, {
name == nil and lang:getCanonicalName() or name,
wiktionary_code = wiktionary_code,
})
end
-- If there's no Wiktionary language for the relevant code, throw an error.
-- This should never happen.
local msg, arg3
if data == nil then
msg = "code '%s' is a valid Wikimedia language code, but there is no corresponding data in [[%s]], [[%s]] or [[Module:families/data]]"
elseif wiktionary_code ~= code then
msg = "code '%s' is a valid Wikimedia language code and has data in [[%s]], but its 'wiktionary_code' key '%s' is not valid"
arg3 = wiktionary_code
else
msg = "code '%s' is a valid Wikimedia language code and has data in [[%s]], but no corresponding data in [[%s]] or [[Module:families/data]]"
end
error(msg:format(code, wm_languages_data_module, arg3 or get_lang_data_module_name(code)))
end
get_by_code = export.getByCode
function export.getByCodeWithFallback(code)
local object = get_by_code(code)
if object ~= nil then
return object
end
local lang = get_lang(code, nil, "allow etym")
return lang ~= nil and lang:getWikimediaLanguages()[1] or nil
end
return export
ef45ys2do2au63pewsjhq7qzjxsy1nr
मॉड्यूल:wikimedia languages/data
828
304698
487859
477709
2026-09-02T20:55:51Z
SM7
6218
updating...
487859
Scribunto
text/plain
local m = {}
--[=[
This table maps *FROM* Wikimedia language codes (used in lang-specific Wikipedias and Wiktionaries) into English Wiktionary language codes.
See also the following:
* `interwiki_langs` in [[Module:translations/data]], which maps in the other direction (from English Wiktionary codes to foreign Wiktionaries),
specifically for {{t+}};
* the `wiktprefix` field of the `metadata` variable in [[MediaWiki:Gadget-TranslationAdder-Data.js]], which also maps from English Wiktionary
codes to foreign Wiktionaries for use with the TranslationAdder gadget;
* the `clean` variable in [[MediaWiki:Gadget-TranslationAdder-Data.js]], which maps from user-entered foreign Wiktionary codes or names to
English Wiktionary codes for use with the TranslationAdder gadget;
* the `wikimedia_codes` field of the language data in e.g. [[Module:languages/data/2]], which also maps from English Wiktionary codes to
Wikimedia language codes.
]=]
m["als"] = {
wiktionary_code = "gsw",
}
m["azb"] = {
"South Azerbaijani",
wiktionary_code = "az",
}
m["bat-smg"] = {
wiktionary_code = "sgs",
}
m["be-tarask"] = {
"Taraškievica Belarusian",
wiktionary_code = "be",
}
m["bs"] = {
"Bosnian",
wiktionary_code = "sh",
}
m["bxr"] = {
wiktionary_code = "bua",
}
m["diq"] = {
wiktionary_code = "zza",
}
m["eml"] = {
"Emiliano-Romagnolo",
wiktionary_code = "egl",
}
m["fiu-vro"] = {
wiktionary_code = "vro",
}
m["gn"] = {
"Guarani",
wiktionary_code = "gug",
}
m["gom"] = {
"Goan Konkani",
wiktionary_code = "kok",
}
m["hr"] = {
"Croatian",
wiktionary_code = "sh",
}
m["hu-formal"] = {
"Formal Hungarian",
wiktionary_code = "hu",
}
m["ksh"] = {
wiktionary_code = "gmw-cfr",
}
m["ku"] = {
"Kurdish",
wiktionary_code = "kmr",
}
m["kv"] = {
"Komi",
wiktionary_code = "kpv",
}
m["nrm"] = {
wiktionary_code = "nrf",
}
m["prs"] = {
wiktionary_code = "fa",
}
m["roa-rup"] = {
wiktionary_code = "rup",
}
m["roa-tara"] = {
wiktionary_code = "roa-tar",
}
m["simple"] = {
"Simple English",
wiktionary_code = "en",
}
m["sr"] = {
"Serbian",
wiktionary_code = "sh",
}
m["zh-classical"] = {
wiktionary_code = "ltc",
}
m["zh-min-nan"] = {
"Southern Min",
wiktionary_code = "nan-hbl",
}
m["zh-yue"] = {
wiktionary_code = "yue",
}
return m
lmump47f458boo0u2lfz8extxjktqmm
मॉड्यूल:writing systems/data
828
304772
487854
477919
2026-09-02T20:26:17Z
SM7
6218
updating...
487854
Scribunto
text/plain
local m = {}
m["abjad"] = {
"abjad",
185087,
otherNames = {"consonantary", "consonantal alphabet"},
}
m["abugida"] = {
"abugida",
335806,
otherNames = {"alphasyllabary"},
}
m["alphabet"] = {
"alphabet",
9779,
category = "alphabetic writing system",
}
m["logography"] = {
"logography",
3953107,
otherNames = {"ideography"},
category = "logographic writing system",
}
m["pictography"] = {
"pictography",
860735,
category = "pictographic writing system",
}
m["semisyllabary"] = {
"semisyllabary",
3781304,
otherNames = {"semi-syllabary"},
}
m["syllabary"] = {
"syllabary",
182133,
}
return require("Module:languages").finalizeData(m, "writing system")
kg18gfc02y6mi29hadprv64y8e0afuo
साँचा:no deprecated lang param usage
10
304797
487751
478013
2026-09-02T15:06:23Z
SM7
6218
487751
wikitext
text/x-wiki
<onlyinclude>{{{1|}}}</onlyinclude>{{documentation}}
r4cd6eb8p4xjus4wmk4qvx6l1j575js
मॉड्यूल:langues/data
828
304860
487881
478542
2026-09-03T10:15:55Z
SM7
6218
updating...
487881
Scribunto
text/plain
-- Page de vérification : Wiktionnaire:Liste des langues/Liste automatique
local l = {}
-- Langues
l['a’ou de Bigong'] = { nom = 'a’ou de Bigong' }
l['a’ou de Hongfeng'] = { nom = 'a’ou de Hongfeng' }
l['aa'] = { nom = 'afar', wiktionnaire = true }
l['aaa'] = { nom = 'ghotuo' }
l['aab'] = { nom = 'alumu-tesu' }
l['aac'] = { nom = 'ari' }
l['aad'] = { nom = 'amal' }
l['aae'] = { nom = 'arbërisht' }
l['aaf'] = { nom = 'aranadan' }
l['aag'] = { nom = 'ambrak' }
l['aah'] = { nom = 'abu’' }
l['aai'] = { nom = 'arifama-miniafia' }
l['aak'] = { nom = 'ankave' }
l['aal'] = { nom = 'afade' }
l['aam'] = { nom = 'aramanik' }
l['aan'] = { nom = 'anambé' }
l['aao'] = { nom = 'arabe saharien' }
l['aap'] = { nom = 'arara' }
l['aaq'] = { nom = 'abénaquis de l’Est' }
l['aas'] = { nom = 'aasá' }
l['aat'] = { nom = 'albanais arvanite' }
l['aau'] = { nom = 'abau' }
l['aav'] = { nom = 'langues austro-asiatiques', tri = 'austro asiatiques langues' }
l['aaw'] = { nom = 'arawé' }
l['aax'] = { nom = 'atas de Mandobo' }
l['aaz'] = { nom = 'amarasi' }
l['ab'] = { nom = 'abkhaze', wiktionnaire = true }
l['aba'] = { nom = 'abé' }
l['abai sembuak'] = { nom = 'abai sembuak' }
l['abai tubu'] = { nom = 'abai tubu' }
l['abb'] = { nom = 'bankon' }
l['abc'] = { nom = 'ambala' }
l['abd'] = { nom = 'manide' }
l['abe'] = { nom = 'abénaquis de l’Ouest' }
l['abf'] = { nom = 'abaï soungaï' }
l['abg'] = { nom = 'abaga' }
l['abh'] = { nom = 'arabe tadjik' }
l['abi'] = { nom = 'abidji' }
l['abj'] = { nom = 'aka-bea' }
l['abl'] = { nom = 'abung' }
l['abm'] = { nom = 'abanyom' }
l['abn'] = { nom = 'abua' }
l['abo'] = { nom = 'abon' }
l['abp'] = { nom = 'abellen' }
l['abq'] = { nom = 'abaza' }
l['abr'] = { nom = 'abron' }
l['abs'] = { nom = 'malais ambonais' }
l['abt'] = { nom = 'ambulas' }
l['abu'] = { nom = 'abouré' }
l['abv'] = { nom = 'arabe baharna' }
l['abx'] = { nom = 'abaknon' }
l['aby'] = { nom = 'aneme wake' }
l['abz'] = { nom = 'abui' }
l['aca'] = { nom = 'achagua' }
l['acd'] = { nom = 'gichode' }
l['ace'] = { nom = 'achinais' }
l['acf'] = { nom = 'créole sainte-lucien' }
l['ach'] = { nom = 'acoli' }
l['aci'] = { nom = 'aka-cari' }
l['ack'] = { nom = 'aka-kora' }
l['acl'] = { nom = 'akar-bale' }
l['acm'] = { nom = 'arabe irakien' }
l['acn'] = { nom = 'achang' }
l['acp'] = { nom = 'acipa de l’Est' }
l['acq'] = { nom = 'arabe Ta’izzi-Adeni' }
l['acr'] = { nom = 'achi' }
l['acs'] = { nom = 'acroá' }
l['act'] = { nom = 'achterhooks' }
l['acu'] = { nom = 'achuar' }
l['acv'] = { nom = 'achumawi' }
l['acy'] = { nom = 'arabe chypriote' }
l['acz'] = { nom = 'acheron' }
l['ada'] = { nom = 'adangmé' }
l['add'] = { nom = 'dzodinka' }
l['ade'] = { nom = 'adele' }
l['adi'] = { nom = 'adi' }
l['adj'] = { nom = 'adioukrou' }
l['adl'] = { nom = 'galo' }
l['adn'] = { nom = 'adang' }
l['adp'] = { nom = 'adap' }
l['adq'] = { nom = 'adangbé' }
l['ads'] = { nom = 'langue des signes adamorobe', tri = 'signes adamorobe' }
l['adt'] = { nom = 'adnyamathanha' }
l['adu'] = { nom = 'aduge' }
l['adw'] = { nom = 'amundava' }
l['adx'] = { nom = 'amdo' }
l['ady'] = { nom = 'adyghé' }
l['adz'] = { nom = 'adzera' }
l['ae'] = { nom = 'avestique' }
l['aeb'] = { nom = 'arabe tunisien' }
l['aec'] = { nom = 'arabe saïdi' }
l['aek'] = { nom = 'haéké' }
l['ael'] = { nom = 'ambele' }
l['aem'] = { nom = 'arem' }
l['aer'] = { nom = 'arrernte de l’Est' }
l['aes'] = { nom = 'alsea' }
l['aew'] = { nom = 'ambakich' }
l['aey'] = { nom = 'amélé' }
l['aez'] = { nom = 'aeka' }
l['af'] = { nom = 'afrikaans', wiktionnaire = true }
l['afa'] = { nom = 'langues afro-asiatiques', tri = 'afro asiatiques langues' }
l['afb'] = { nom = 'arabe du Golfe', tri = 'arabe golfe' }
l['afh'] = { nom = 'afrihili' }
l['afi'] = { nom = 'akrukay' }
l['afn'] = { nom = 'défaka' }
l['afo'] = { nom = 'éloyi', tri = 'eloyi' }
l['afp'] = { nom = 'tapei' }
l['aft'] = { nom = 'afitti' }
l['afz'] = { nom = 'obokuitai' }
l['aga'] = { nom = 'aguano' }
l['agc'] = { nom = 'agatu' }
l['age'] = { nom = 'angal' }
l['agg'] = { nom = 'angor' }
l['agj'] = { nom = 'argobba' }
l['agl'] = { nom = 'fembe' }
l['agm'] = { nom = 'angaataha' }
l['agn'] = { nom = 'agutaynen' }
l['ago'] = { nom = 'tainae' }
l['agq'] = { nom = 'aghem' }
l['agr'] = { nom = 'aguaruna' }
l['ags'] = { nom = 'ésimbi', tri = 'esimbi' }
l['agt'] = { nom = 'agta du Cagayan central', tri = 'agta Cagayan central' }
l['agta de Dinapigue'] = { nom = 'agta de Dinapigue', tri = 'agta Dinapigue' }
l['agta de Nagtipunan'] = { nom = 'agta de Nagtipunan', tri = 'agta Nagtipunan' }
l['agu'] = { nom = 'aguacatèque' }
l['agx'] = { nom = 'aghoul' }
l['agy'] = { nom = 'alta du Sud' }
l['aha'] = { nom = 'ahanta' }
l['ahb'] = { nom = 'axamb' }
l['ahg'] = { nom = 'qimant' }
l['ahi'] = { nom = 'aïzi de Tiagbamrin' }
l['ahk'] = { nom = 'akha' }
l['ahl'] = { nom = 'igo' }
l['ahn'] = { nom = 'àhàn', tri = 'ahan' }
l['aho'] = { nom = 'ahom' }
l['ahp'] = { nom = 'aïzi d’Aproumu' }
l['ahs'] = { nom = 'ashe' }
l['aht'] = { nom = 'ahtna' }
l['aia'] = { nom = 'arosi' }
l['aib'] = { nom = 'aïnou (Chine)' }
l['aid'] = { nom = 'alngith' }
l['aie'] = { nom = 'amara' }
l['aif'] = { nom = 'agi' }
l['aig'] = { nom = 'créole anglais d’Antigua-et-Barbuda', tri = 'creole antigua et barbuda anglais' }
l['aih'] = { nom = 'ai-cham' }
l['aii'] = { nom = 'néo-araméen assyrien', tri = 'arameen neo assyrien' }
l['aij'] = { nom = 'lishanid noshan' }
l['aik'] = { nom = 'akyé' }
l['ail'] = { nom = 'aimele' }
l['aim'] = { nom = 'aimol' }
l['ain'] = { nom = 'aïnou (Japon)' }
l['air'] = { nom = 'airoran' }
l['ais'] = { nom = 'nataoran' }
l['ait'] = { nom = 'arikém' }
l['aiw'] = { nom = 'aari' }
l['aix'] = { nom = 'aighon' }
l['aiy'] = { nom = 'ali' }
l['aiz'] = { nom = 'aari-gayil' }
l['aja'] = { nom = 'aja' }
l['ajg'] = { nom = 'ajagbe' }
l['aji'] = { nom = 'ajië' }
l['ajt'] = { nom = 'judéo-tunisien' }
l['aju'] = { nom = 'judéo-marocain' }
l['ajw'] = { nom = 'ajawa' }
l['ak'] = { nom = 'akan', wiktionnaire = true }
l['akc'] = { nom = 'mpur' }
l['ake'] = { nom = 'akawaïo' }
l['akf'] = { nom = 'akpa' }
l['aki'] = { nom = 'aiome' }
l['akj'] = { nom = 'aka-jeru' }
l['akk'] = { nom = 'akkadien' }
l['akl'] = { nom = 'aklanon' }
l['akm'] = { nom = 'aka-bo' }
l['ako'] = { nom = 'akurio' }
l['akp'] = { nom = 'siwu' }
l['akr'] = { nom = 'araki' }
l['aks'] = { nom = 'akaselem' }
l['aku'] = { nom = 'akum' }
l['akv'] = { nom = 'akhvakh' }
l['akx'] = { nom = 'aka-kede' }
l['aky'] = { nom = 'aka-kol' }
l['akz'] = { nom = 'alabama' }
l['ala'] = { nom = 'alago' }
l['alc'] = { nom = 'kawésqar' }
l['ald'] = { nom = 'alladian' }
l['ale'] = { nom = 'aléoute' }
l['alg'] = { nom = 'langues algonquiennes', tri = 'algonquiennes langues' }
l['alh'] = { nom = 'alawa' }
l['ali'] = { nom = 'amaimon' }
l['alk'] = { nom = 'alak' }
l['all'] = { nom = 'allar' }
l['alm'] = { nom = 'amblong' }
l['aln'] = { nom = 'guègue' }
l['alo'] = { nom = 'larike-wakasihu' }
l['alp'] = { nom = 'alune' }
l['alq'] = { nom = 'algonquin' }
l['alr'] = { nom = 'alioutor' }
l['als'] = { nom = 'albanais tosk' }
l['alt'] = { nom = 'altaï du Sud' }
l['alu'] = { nom = '’are’are', tri = 'are are' }
l['alv'] = { nom = 'langues atlantico-congolaises', tri = 'atlantico congolaises langues' }
l['alx'] = { nom = 'amol' }
l['aly'] = { nom = 'alyawarr' }
l['am'] = { nom = 'amharique', wiktionnaire = true }
l['ama'] = { nom = 'amanayé' }
l['amb'] = { nom = 'ambo' }
l['amc'] = { nom = 'amahuaca' }
l['ame'] = { nom = 'yanesha' }
l['amf'] = { nom = 'hamar' }
l['amg'] = { nom = 'amurdak' }
l['ami'] = { nom = 'amis' }
l['amj'] = { nom = 'amdang' }
l['amk'] = { nom = 'ambai' }
l['aml'] = { nom = 'war-jaintia' }
l['amm'] = { nom = 'ama (Papouasie-Nouvelle-Guinée)' }
l['ammonite'] = { nom = 'ammonite' }
l['amn'] = { nom = 'amanab' }
l['amo'] = { nom = 'amo' }
l['amp'] = { nom = 'alamblak' }
l['amq'] = { nom = 'amahai' }
l['amr'] = { nom = 'amarakaeri' }
l['ams'] = { nom = 'amami du Sud' }
l['amt'] = { nom = 'amto' }
l['amu'] = { nom = 'amuzgo du Guerrero', tri = 'amuzgo Guerrero' }
l['amw'] = { nom = 'néo-araméen occidental', tri = 'arameen neo occidental' }
l['amx'] = { nom = 'anmatyerre' }
l['amy'] = { nom = 'ami' }
l['an'] = { nom = 'aragonais', wiktionnaire = true }
l['ana'] = { nom = 'andaquí' }
l['anauyá'] = { nom = 'anauyá' }
l['anb'] = { nom = 'andoa' }
l['anc'] = { nom = 'angas' }
l['and'] = { nom = 'ansus' }
l['ane'] = { nom = 'xârâcùù' }
l['anf'] = { nom = 'animere' }
l['ang'] = { nom = 'vieil anglais', wiktionnaire = true }
l['angevin'] = { nom = 'angevin' }
l['anggreso'] = { nom = 'anggreso' }
l['anh'] = { nom = 'nend' }
l['ani'] = { nom = 'andi' }
l['ank'] = { nom = 'ankwé' }
l['ann'] = { nom = 'obolo' }
l['ano'] = { nom = 'andoque' }
l['anp'] = { nom = 'angika' }
l['anq'] = { nom = 'jarawa (îles Andaman)', tri = 'jarawa andaman' }
l['ans'] = { nom = 'anserma' }
l['ant'] = { nom = 'antakarinya' }
l['anu'] = { nom = 'anyua' }
l['anv'] = { nom = 'denya' }
l['anw'] = { nom = 'anang' }
l['any'] = { nom = 'agni' }
l['aoa'] = { nom = 'angolar' }
l['aob'] = { nom = 'abom' }
l['aoc'] = { nom = 'pemon' }
l['aof'] = { nom = 'bragat' }
l['aog'] = { nom = 'angoram' }
l['aoh'] = { nom = 'arma' }
l['aoi'] = { nom = 'anindilyakwa' }
l['aoj'] = { nom = 'mufian' }
l['aom'] = { nom = 'ömie' }
l['aor'] = { nom = 'aore' }
l['ao mongsen'] = { nom = 'ao mongsen' }
l['aos'] = { nom = 'taikat' }
l['aot'] = { nom = 'a’tong' }
l['aou'] = { nom = 'a’ou' }
l['aoz'] = { nom = 'atoni' }
l['apa'] = { nom = 'langues apaches', tri = 'apaches langues' }
l['apb'] = { nom = 'sa’a' }
l['apc'] = { nom = 'arabe levantin' }
l['apd'] = { nom = 'arabe soudanais' }
l['ape'] = { nom = 'bukiyip' }
l['apf'] = { nom = 'agta de Pahanan', tri = 'agta Pahanan' }
l['aph'] = { nom = 'athpariya' }
l['api'] = { nom = 'apiaká' }
l['apj'] = { nom = 'jicarilla' }
l['apk'] = { nom = 'apache des Plaines' }
l['apl'] = { nom = 'lipan' }
l['apm'] = { nom = 'chiricahua' }
l['apn'] = { nom = 'apinajé' }
l['apo'] = { nom = 'apalik' }
l['apolista'] = { nom = 'apolista' }
l['app'] = { nom = 'apma' }
l['apq'] = { nom = 'pucikwar' }
l['apr'] = { nom = 'arop-lokep' }
l['aps'] = { nom = 'arop-sissano' }
l['apt'] = { nom = 'apatani' }
l['apu'] = { nom = 'apurinã' }
l['apw'] = { nom = 'apache de l’Ouest' }
l['apx'] = { nom = 'aputai' }
l['apy'] = { nom = 'apalai' }
l['apz'] = { nom = 'safeyoka' }
l['aqa'] = { nom = 'langues alacalufanes', tri = 'alacalufanes langues' }
l['aqc'] = { nom = 'artchi' }
l['aqd'] = { nom = 'ampari' }
l['aql'] = { nom = 'langues algiques', tri = 'algiques langues' }
l['aqn'] = { nom = 'alta du Nord' }
l['aqp'] = { nom = 'atakapa' }
l['aqt'] = { nom = 'angaité' }
l['aqz'] = { nom = 'akuntsu' }
l['ar'] = { nom = 'arabe', wiktionnaire = true }
l['arb'] = { nom = 'arabe standard moderne' }
l['arc'] = { nom = 'araméen' }
l['ard'] = { nom = 'arabana' }
l['are'] = { nom = 'arrernte de l’Ouest' }
l['arh'] = { nom = 'arhuaco' }
l['ari'] = { nom = 'arikara' }
l['ark'] = { nom = 'arikapú' }
l['arl'] = { nom = 'arabela' }
l['arn'] = { nom = 'mapuche' }
l['aro'] = { nom = 'araona' }
l['arp'] = { nom = 'arapaho' }
l['arq'] = { nom = 'arabe algérien' }
l['arr'] = { nom = 'karo (Brésil)' }
l['ars'] = { nom = 'arabe najdi' }
l['art'] = { nom = 'langues artificielles', tri = 'artificielles langues' }
l['aru'] = { nom = 'arawá' }
l['arv'] = { nom = 'arbore' }
l['arw'] = { nom = 'arawak' }
l['arx'] = { nom = 'aruá' }
l['ary'] = { nom = 'arabe marocain' }
l['arz'] = { nom = 'arabe égyptien' }
l['as'] = { nom = 'assamais', wiktionnaire = true }
l['asa'] = { nom = 'asu (Tanzanie)' }
l['asb'] = { nom = 'assiniboine' }
l['asd'] = { nom = 'asas' }
l['ase'] = { nom = 'langue des signes américaine', tri = 'signes americaine' }
l['asf'] = { nom = 'langue des signes australienne', tri = 'signes australienne' }
l['ash'] = { nom = 'abishira' }
l['asi'] = { nom = 'buruwai' }
l['asj'] = { nom = 'nsari' }
l['ask'] = { nom = 'ashkun' }
l['asl'] = { nom = 'asilulu' }
l['asn'] = { nom = 'asuriní de Xingú', tri = 'asuriní Xingú' }
l['aso'] = { nom = 'dano' }
l['asp'] = { nom = 'langue des signes algérienne', tri = 'signes algerienne' }
l['ass'] = { nom = 'ipulo' }
l['ast'] = { nom = 'asturien', wiktionnaire = true }
l['asu'] = { nom = 'asuriní du Tocantins', tri = 'asuriní Tocantins' }
l['asv'] = { nom = 'asoa' }
l['asx'] = { nom = 'muratayak' }
l['ata'] = { nom = 'pele-ata' }
l['atb'] = { nom = 'zaiwa' }
l['atc'] = { nom = 'atsahuaca' }
l['atd'] = { nom = 'manobo d’Ata', tri = 'manobo ata' }
l['ate'] = { nom = 'atemble' }
l['ath'] = { nom = 'langues athapascanes', tri = 'athapascanes langues' }
l['ati'] = { nom = 'attié' }
l['atj'] = { nom = 'atikamekw' }
l['atl'] = { nom = 'agta du mont Iraya', tri = 'agta Iraya' }
l['atm'] = { nom = 'ata' }
l['ato'] = { nom = 'atong' }
l['atp'] = { nom = 'atta de Pudtol' }
l['atq'] = { nom = 'atohwaim' }
l['atr'] = { nom = 'waimiri-atroari' }
l['ats'] = { nom = 'atsina' }
l['att'] = { nom = 'atta de Pamplona' }
l['atu'] = { nom = 'reel' }
l['atv'] = { nom = 'altaï du Nord' }
l['atw'] = { nom = 'atsugewi' }
l['atx'] = { nom = 'arutani' }
l['aty'] = { nom = 'anejom' }
l['atz'] = { nom = 'arta' }
l['aua'] = { nom = 'asumboa' }
l['auc'] = { nom = 'huaorani' }
l['aud'] = { nom = 'anuta' }
l['aue'] = { nom = 'kung-gobabis' }
l['auf'] = { nom = 'langues arauanes', tri = 'arauanes langues' }
l['aug'] = { nom = 'agouna' }
l['auh'] = { nom = 'aushi' }
l['aui'] = { nom = 'anuki' }
l['auj'] = { nom = 'awjilah' }
l['auk'] = { nom = 'heyo' }
l['aul'] = { nom = 'aulua' }
l['aum'] = { nom = 'asu (Nigeria)' }
l['aun'] = { nom = 'one de Molmo', tri = 'one molmo' }
l['aur'] = { nom = 'aruek' }
l['aus'] = { nom = 'langues australiennes', tri = 'australiennes langues' }
l['aut'] = { nom = 'austral' }
l['auu'] = { nom = 'auye' }
l['auw'] = { nom = 'awyi' }
l['aux'] = { nom = 'aurá' }
l['auy'] = { nom = 'auyana' }
l['av'] = { nom = 'avar', wiktionnaire = true }
l['avb'] = { nom = 'avau' }
l['avd'] = { nom = 'alviri-vidari' }
l['avi'] = { nom = 'avikam' }
l['avk'] = { nom = 'kotava' }
l['avl'] = { nom = 'arabe bedawi' }
l['avn'] = { nom = 'avatime' }
l['avo'] = { nom = 'agavotaguerra' }
l['avok'] = { nom = 'avok' }
l['avs'] = { nom = 'aushiri' }
l['avt'] = { nom = 'au' }
l['avu'] = { nom = 'avokaya' }
l['avv'] = { nom = 'avá-canoeiro' }
l['awa'] = { nom = 'awadhi' }
l['awb'] = { nom = 'awa (papou)' }
l['awc'] = { nom = 'cicipu' }
l['awd'] = { nom = 'langues arawakes', tri = 'arawakes langues' }
l['awe'] = { nom = 'aweti' }
l['awg'] = { nom = 'anguthimri' }
l['awh'] = { nom = 'awbono' }
l['awi'] = { nom = 'aekyom' }
l['awk'] = { nom = 'awabakal' }
l['awm'] = { nom = 'arawum' }
l['awn'] = { nom = 'awngi' }
l['awo'] = { nom = 'awak' }
l['awr'] = { nom = 'awera' }
l['aws'] = { nom = 'aghu du Sud', tri = 'aghu Sud' }
l['awt'] = { nom = 'araweté' }
l['awu'] = { nom = 'aghu central' }
l['awv'] = { nom = 'aghu de Jair', tri = 'aghu Jair' }
l['aww'] = { nom = 'awun' }
l['awx'] = { nom = 'awara' }
l['awy'] = { nom = 'aghu d’Edera', tri = 'aghu Edera' }
l['axb'] = { nom = 'abipón' }
l['axe'] = { nom = 'ayerrerenge' }
l['axg'] = { nom = 'arara de Mato Grosso' }
l['axx'] = { nom = 'xaragure' }
l['ay'] = { nom = 'aymara', wiktionnaire = true }
l['aya'] = { nom = 'awar' }
l['ayd'] = { nom = 'ayabadhu' }
l['aye'] = { nom = 'ayere' }
l['ayi'] = { nom = 'leyigha' }
l['ayl'] = { nom = 'arabe libyen' }
l['ayn'] = { nom = 'arabe sanaani' }
l['ayo'] = { nom = 'ayoreo' }
l['ayu'] = { nom = 'ayu' }
l['ayz'] = { nom = 'mai brat' }
l['az'] = { nom = 'azéri', wiktionnaire = true }
l['aza'] = { nom = 'azha' }
l['azb'] = { nom = 'azéri du Sud' }
l['azb-afs'] = { nom = 'afchar' }
l['azc'] = { nom = 'langues uto-aztèques', tri = 'uto azteques langues' }
l['azg'] = { nom = 'amuzgo de San Pedro Amuzgos', tri = 'amuzgo San Pedro Amuzgos' }
l['azj'] = { nom = 'azéri du Nord' }
l['azo'] = { nom = 'awing' }
l['azz'] = { nom = 'nahuatl du haut Puebla', tri = 'nahuatl Puebla haut' }
l['ba'] = { nom = 'bachkir' }
l['baa'] = { nom = 'babatana' }
l['bac'] = { nom = 'baduy' }
l['bad'] = { nom = 'langues bandas', tri = 'bandas langues' }
l['bae'] = { nom = 'baré' }
l['baf'] = { nom = 'nubaca' }
l['bag'] = { nom = 'tuki' }
l['bah'] = { nom = 'créole bahamien' }
l['bai'] = { nom = 'langues bamilékées', tri = 'bamilekees langues' }
l['baisha'] = { nom = 'baisha' }
l['bal'] = { nom = 'baloutche' }
l['ban'] = { nom = 'balinais' }
l['bana'] = { nom = 'bana (Chine)' }
l['bangru'] = { nom = 'bangru' }
l['bao'] = { nom = 'bara' }
l['baoting'] = { nom = 'baoting' }
l['bap'] = { nom = 'bantawa' }
l['bar'] = { nom = 'bavarois' }
l['barngala'] = { nom = 'barngala' }
l['barranbinya'] = { nom = 'barranbinya' }
l['bas'] = { nom = 'bassa (Cameroun)' }
l['basco-algonquin'] = { nom = 'basco-algonquin' }
l['basco-islandais'] = { nom = 'basco-islandais' }
l['bat'] = { nom = 'langues baltes', tri = 'baltes langues' }
l['bav'] = { nom = 'babungo' }
l['baw'] = { nom = 'bambili-bambui' }
l['bax'] = { nom = 'bamoun' }
l['bay'] = { nom = 'batuley' }
l['bba'] = { nom = 'bariba' }
l['bbb'] = { nom = 'barai' }
l['bbc'] = { nom = 'batak toba' }
l['bbd'] = { nom = 'bau' }
l['bbf'] = { nom = 'baibai' }
l['bbh'] = { nom = 'pakan' }
l['bbi'] = { nom = 'barombi' }
l['bbj'] = { nom = 'ghomala’' }
l['bbl'] = { nom = 'bats' }
l['bbo'] = { nom = 'konabéré' }
l['bbp'] = { nom = 'banda central de l’Ouest' }
l['bbr'] = { nom = 'girawa' }
l['bbu'] = { nom = 'kulung (Nigeria)' }
l['bbv'] = { nom = 'karnai' }
l['bbw'] = { nom = 'baba' }
l['bca'] = { nom = 'bai central' }
l['bcb'] = { nom = 'baïnouk-samik' }
l['bcc'] = { nom = 'baloutchi du Sud' }
l['bcd'] = { nom = 'babar du Nord' }
l['bce'] = { nom = 'mengambo' }
l['bcf'] = { nom = 'bamu' }
l['bcg'] = { nom = 'baga binari' }
l['bch'] = { nom = 'bariai' }
l['bci'] = { nom = 'baoulé' }
l['bcj'] = { nom = 'bardi' }
l['bck'] = { nom = 'bunuba' }
l['bcl'] = { nom = 'bikol central', wiktionnaire = true }
l['bcm'] = { nom = 'banoni' }
l['bcn'] = { nom = 'bali' }
l['bco'] = { nom = 'kaluli' }
l['bcp'] = { nom = 'bali (République démocratique du Congo)', tri = 'bali congo' }
l['bcq'] = { nom = 'gimira' }
l['bcr'] = { nom = 'babine-witsuwit’en' }
l['bcs'] = { nom = 'kohumono' }
l['bct'] = { nom = 'bendi' }
l['bcu'] = { nom = 'awad bing' }
l['bcv'] = { nom = 'shoo-minda-nye' }
l['bcw'] = { nom = 'bana (Cameroun)' }
l['bcy'] = { nom = 'bacama' }
l['bcz'] = { nom = 'baïnouk-gunyaamolo' }
l['bda'] = { nom = 'bayot' }
l['bdb'] = { nom = 'basap' }
l['bdc'] = { nom = 'emberá-baudó' }
l['bdd'] = { nom = 'bunama' }
l['bde'] = { nom = 'bade' }
l['bdf'] = { nom = 'biage' }
l['bdg'] = { nom = 'bonggi' }
l['bdh'] = { nom = 'baka (Soudan du Sud)', tri = 'baka soudan du sud' }
l['bdj'] = { nom = 'bai (Soudan du Sud)', tri = 'bai soudan du sud' }
l['bdk'] = { nom = 'boudoukh' }
l['bdl'] = { nom = 'bajau indonésien' }
l['bdm'] = { nom = 'boudouma' }
l['bdn'] = { nom = 'baldamu' }
l['bdo'] = { nom = 'morom' }
l['bdp'] = { nom = 'bende' }
l['bdq'] = { nom = 'bahnar' }
l['bdr'] = { nom = 'bajau de la côte occidentale' }
l['bds'] = { nom = 'burunge' }
l['bdt'] = { nom = 'gbaya bokoto' }
l['bdu'] = { nom = 'oroko' }
l['bdw'] = { nom = 'baham' }
l['bdy'] = { nom = 'bandjalang' }
l['be'] = { nom = 'biélorusse', wiktionnaire = true }
l['be-tarask'] = { nom = 'biélorusse (tarashkevitsa)' }
l['bea'] = { nom = 'dunneza' }
l['bec'] = { nom = 'iceve-maci' }
l['bed'] = { nom = 'bedoanas' }
l['bee'] = { nom = 'byangsi' }
l['bef'] = { nom = 'benabena' }
l['beg'] = { nom = 'belait' }
l['beh'] = { nom = 'biali' }
l['bei'] = { nom = 'bekati’' }
l['bej'] = { nom = 'bedja' }
l['bek'] = { nom = 'bebeli' }
l['bem'] = { nom = 'bemba' }
l['bengni'] = { nom = 'bengni' }
l['beo'] = { nom = 'beami' }
l['bep'] = { nom = 'besoa' }
l['beq'] = { nom = 'beembe' }
l['ber'] = { nom = 'langues berbères', tri = 'berberes langues' }
l['berrichon'] = { nom = 'berrichon' }
l['bes'] = { nom = 'besme' }
l['bet'] = { nom = 'bété de Guiberoua' }
l['bété'] = { nom = 'bété (Côte d’Ivoire)', tri = 'bete cote divoire' }
l['betoi'] = { nom = 'betoi' }
l['beu'] = { nom = 'blagar' }
l['bew'] = { nom = 'betawi' }
l['bey'] = { nom = 'beli (Papouasie-Nouvelle-Guinée)' }
l['bex'] = { nom = 'modo' }
l['bez'] = { nom = 'bena' }
l['bfa'] = { nom = 'bari (Soudan du Sud)', tri = 'bari soudan du sud' }
l['bfb'] = { nom = 'pauri bareli' }
l['bfc'] = { nom = 'bai du Nord' }
l['bfd'] = { nom = 'bafut' }
l['bff'] = { nom = 'bofi' }
l['bfg'] = { nom = 'busang' }
l['bfi'] = { nom = 'langue des signes britannique', tri = 'signes britannique' }
l['bfj'] = { nom = 'bafanji' }
l['bfm'] = { nom = 'mmem' }
l['bfn'] = { nom = 'bunaq' }
l['bfo'] = { nom = 'birifor malba' }
l['bfq'] = { nom = 'bagada' }
l['bfr'] = { nom = 'bazigar' }
l['bfs'] = { nom = 'bai du Sud' }
l['bft'] = { nom = 'balti' }
l['bfu'] = { nom = 'bunan' }
l['bfw'] = { nom = 'remo' }
l['bg'] = { nom = 'bulgare', wiktionnaire = true }
l['bgb'] = { nom = 'bobongko' }
l['bgf'] = { nom = 'bangando' }
l['bgg'] = { nom = 'bugun' }
l['bgj'] = { nom = 'bangolan' }
l['bgk'] = { nom = 'khabit' }
l['bgr'] = { nom = 'bawm' }
l['bgu'] = { nom = 'mbongno' }
l['bgv'] = { nom = 'warkay-bipim' }
l['bgz'] = { nom = 'banggai' }
l['bh'] = { nom = 'भोजपुरी', wiktionnaire = true }
l['bha'] = { nom = 'bharia' }
l['bhb'] = { nom = 'bhili' }
l['bhc'] = { nom = 'biga' }
l['bhf'] = { nom = 'odiai' }
l['bhg'] = { nom = 'binandere' }
l['bhi'] = { nom = 'bhilali' }
l['bhj'] = { nom = 'bahing' }
l['bhl'] = { nom = 'bimin' }
l['bhm'] = { nom = 'bathari' }
l['bhn'] = { nom = 'néo-araméen de Bohtan', tri = 'arameen neo bohtan' }
l['bho'] = { nom = 'भोजपुरी' }
l['bhq'] = { nom = 'tukang besi du Sud' }
l['bhs'] = { nom = 'buwal' }
l['bhv'] = { nom = 'bahau' }
l['bhw'] = { nom = 'biak' }
l['bhy'] = { nom = 'bhele' }
l['bhz'] = { nom = 'bada (Indonésie)' }
l['bi'] = { nom = 'bichlamar', wiktionnaire = true }
l['bia'] = { nom = 'badimaya' }
l['bib'] = { nom = 'bissa' }
l['bic'] = { nom = 'bikaru' }
l['bid'] = { nom = 'bidiyo' }
l['bie'] = { nom = 'bepour' }
l['bif'] = { nom = 'biafada' }
l['big'] = { nom = 'biangai' }
l['bij'] = { nom = 'vaghat-ya-bijim-legeri' }
l['bik'] = { nom = 'bikol' }
l['bil'] = { nom = 'bile' }
l['bim'] = { nom = 'bimoba' }
l['bin'] = { nom = 'édo', tri = 'edo' }
l['bio'] = { nom = 'nai' }
l['bip'] = { nom = 'bila' }
l['bir'] = { nom = 'bisorio' }
l['bisaya de Limbang'] = { nom = 'bisaya de Limbang' }
l['biv'] = { nom = 'birifor du Sud' }
l['biz'] = { nom = 'baloi' }
l['bja'] = { nom = 'ebudza' }
l['bjb'] = { nom = 'banggarla' }
l['bjc'] = { nom = 'bariji' }
l['bjg'] = { nom = 'bijogo' }
l['bjh'] = { nom = 'bahinemo' }
l['bji'] = { nom = 'burji' }
l['bjj'] = { nom = 'kanauji' }
l['bjm'] = { nom = 'bajelani' }
l['bjn'] = { nom = 'banjar', wiktionnaire = true }
l['bjp'] = { nom = 'fanamaket' }
l['bjr'] = { nom = 'binumarien' }
l['bjt'] = { nom = 'balante-ganja' }
l['bjv'] = { nom = 'bedjond' }
l['bjz'] = { nom = 'baruga' }
l['bka'] = { nom = 'kyak' }
l['bkc'] = { nom = 'baka (Cameroun-Gabon)', tri = 'baka cameroun gabon' }
l['bkd'] = { nom = 'binukid' }
l['bkh'] = { nom = 'bakoko' }
l['bki'] = { nom = 'baki' }
l['bkj'] = { nom = 'pande' }
l['bkl'] = { nom = 'berik' }
l['bkm'] = { nom = 'kom (Cameroun)' }
l['bkn'] = { nom = 'beketan' }
l['bkq'] = { nom = 'bakairí' }
l['bkr'] = { nom = 'bakumpai' }
l['bks'] = { nom = 'sorsoganon du Nord' }
l['bkt'] = { nom = 'boloki' }
l['bku'] = { nom = 'bouhid' }
l['bkx'] = { nom = 'baikeno' }
l['bky'] = { nom = 'bokyi' }
l['bkz'] = { nom = 'bungku' }
l['bla'] = { nom = 'pied-noir' }
l['blb'] = { nom = 'bilua' }
l['blc'] = { nom = 'nuxalk' }
l['bld'] = { nom = 'bolango' }
l['ble'] = { nom = 'balante-kentohe' }
l['blf'] = { nom = 'buol' }
l['bli'] = { nom = 'bolia' }
l['blj'] = { nom = 'bolongan' }
l['blk'] = { nom = 'pa’o' }
l['bll'] = { nom = 'biloxi' }
l['blm'] = { nom = 'beli (Soudan du Sud)', tri = 'beli soudan du sud' }
l['bln'] = { nom = 'bikol du Sud de Catanduanes' }
l['blo'] = { nom = 'anii' }
l['blq'] = { nom = 'baluan-pam' }
l['blr'] = { nom = 'blang' }
l['bls'] = { nom = 'balaesang' }
l['blt'] = { nom = 'tai dam' }
l['blv'] = { nom = 'kibala' }
l['blw'] = { nom = 'balangao' }
l['bly'] = { nom = 'notre' }
l['blz'] = { nom = 'balantak' }
l['bm'] = { nom = 'bambara', wiktionnaire = true }
l['bma'] = { nom = 'lame' }
l['bmc'] = { nom = 'biem' }
l['bmg'] = { nom = 'bamwe' }
l['bmh'] = { nom = 'kein' }
l['bmi'] = { nom = 'bagirmi' }
l['bmj'] = { nom = 'bote-majhi' }
l['bmk'] = { nom = 'ghayavi' }
l['bmn'] = { nom = 'bina (Papouasie-Nouvelle-Guinée)' }
l['bmr'] = { nom = 'muinane' }
l['bmu'] = { nom = 'burum-mindik' }
l['bmx'] = { nom = 'baimak' }
l['bn'] = { nom = 'बंगाली', wiktionnaire = true }
l['bnb'] = { nom = 'murut bookan' }
l['bnc'] = { nom = 'bontok' }
l['bne'] = { nom = 'bintauna' }
l['bng'] = { nom = 'benga' }
l['bni'] = { nom = 'bobangi' }
l['bnk'] = { nom = 'bierebo' }
l['bnm'] = { nom = 'batanga' }
l['bnn'] = { nom = 'bunun' }
l['bnp'] = { nom = 'bola (Papouasie-Nouvelle-Guinée)' }
l['bnq'] = { nom = 'bantik' }
l['bnr'] = { nom = 'butmas-tur' }
l['bnt'] = { nom = 'langues bantoues', tri = 'bantoues langues' }
l['bnv'] = { nom = 'bonerif' }
l['bny'] = { nom = 'bintulu' }
l['bnz'] = { nom = 'beezen' }
l['bo'] = { nom = 'tibétain', wiktionnaire = true }
l['boa'] = { nom = 'bora' }
l['bob'] = { nom = 'aweer' }
l['boe'] = { nom = 'mundabli' }
l['bof'] = { nom = 'bolon' }
l['bog'] = { nom = 'langue des signes malienne', tri = 'signes malienne' }
l['boh'] = { nom = 'boma' }
l['boi'] = { nom = 'barbareño' }
l['boj'] = { nom = 'anjam' }
l['bok'] = { nom = 'bonjo' }
l['bokar'] = { nom = 'bokar' }
l['bol'] = { nom = 'bole' }
l['bolze'] = { nom = 'bolze' }
l['bom'] = { nom = 'birom' }
l['bon'] = { nom = 'bine' }
l['bondska'] = { nom = 'bondska' }
l['boo'] = { nom = 'bozo de Tiemacèwè' }
l['boq'] = { nom = 'bogaya' }
l['bor'] = { nom = 'bororo' }
l['bot'] = { nom = 'bongo' }
l['botnien'] = { nom = 'botnien' }
l['bou'] = { nom = 'bondei' }
l['bouhin'] = { nom = 'bouhin' }
l['bourbonnais'] = { nom = 'bourbonnais' }
l['bourguignon'] = { nom = 'bourguignon' }
l['bov'] = { nom = 'tuwuli' }
l['bow'] = { nom = 'rema' }
l['box'] = { nom = 'buamu' }
l['boy'] = { nom = 'bodo (République centrafricaine)', tri = 'bodo centrafrique' }
l['boz'] = { nom = 'bozo-tigemaxoo' }
l['bpa'] = { nom = 'daakaka' }
l['bpg'] = { nom = 'bonggo' }
l['bph'] = { nom = 'botlikh' }
l['bpi'] = { nom = 'bagupi' }
l['bpj'] = { nom = 'binji' }
l['bpm'] = { nom = 'biyom' }
l['bpn'] = { nom = 'dzao min' }
l['bpp'] = { nom = 'kaure' }
l['bpr'] = { nom = 'blaan de Koronadal' }
l['bps'] = { nom = 'blaan de Sarangani' }
l['bpu'] = { nom = 'bongu' }
l['bpv'] = { nom = 'marind bian' }
l['bpy'] = { nom = 'manipourî de Bishnupriya' }
l['bqb'] = { nom = 'bagusa' }
l['bqc'] = { nom = 'boko' }
l['bqh'] = { nom = 'baima' }
l['bqi'] = { nom = 'bakhtiari' }
l['bqj'] = { nom = 'jóola banjal' }
l['bqo'] = { nom = 'balo' }
l['bqp'] = { nom = 'busa' }
l['bqq'] = { nom = 'biritai' }
l['bqr'] = { nom = 'bulusu' }
l['br'] = { nom = 'breton', wiktionnaire = true }
l['bra'] = { nom = 'braj' }
l['brabançon'] = { nom = 'brabançon' }
l['brb'] = { nom = 'lave' }
l['brc'] = { nom = 'créole hollandais de Berbice', tri = 'creole berbice hollandais' }
l['brd'] = { nom = 'baraadu' }
l['brg'] = { nom = 'baure' }
l['brh'] = { nom = 'brahui' }
l['bri'] = { nom = 'mokpwe' }
l['brm'] = { nom = 'barambu' }
l['brn'] = { nom = 'boruca' }
l['bro'] = { nom = 'brokkat' }
l['brp'] = { nom = 'barapasi' }
l['brt'] = { nom = 'bitare' }
l['bru'] = { nom = 'bru de l’Est' }
l['brv'] = { nom = 'bru de l’Ouest' }
l['brw'] = { nom = 'bellari' }
l['brx'] = { nom = 'bodo' }
l['bry'] = { nom = 'burui' }
l['bs'] = { nom = 'bosniaque', wiktionnaire = true }
l['bsc'] = { nom = 'bassari' }
l['bse'] = { nom = 'wushi' }
l['bsg'] = { nom = 'bashkardi' }
l['bsh'] = { nom = 'kati' }
l['bsk'] = { nom = 'bourouchaski' }
l['bsl'] = { nom = 'basa-gumna' }
l['bsm'] = { nom = 'busami' }
l['bsn'] = { nom = 'barasana' }
l['bsr'] = { nom = 'bassa-kontagora' }
l['bst'] = { nom = 'basketto' }
l['bsu'] = { nom = 'bahonsuai' }
l['bsw'] = { nom = 'baiso' }
l['bsx'] = { nom = 'yangkam' }
l['bsy'] = { nom = 'bisaya de Sabah' }
l['bsz'] = { nom = 'souletin' }
l['bta'] = { nom = 'bata' }
l['btc'] = { nom = 'bati (Cameroun)' }
l['btd'] = { nom = 'dairi' }
l['btf'] = { nom = 'birguit' }
l['bth'] = { nom = 'biatah bidayuh' }
l['btk'] = { nom = 'langues batakes', tri = 'batakes langues' }
l['btm'] = { nom = 'mandailing' }
l['btp'] = { nom = 'budibud' }
l['btr'] = { nom = 'baetora' }
l['btu'] = { nom = 'batu' }
l['btw'] = { nom = 'butuanon' }
l['btx'] = { nom = 'batak karo' }
l['btz'] = { nom = 'alas-kluet' }
l['bua'] = { nom = 'bouriate' }
l['bub'] = { nom = 'bua' }
l['buc'] = { nom = 'kibushi' }
l['bud'] = { nom = 'ntcham' }
l['bue'] = { nom = 'béothuk' }
l['buf'] = { nom = 'bushoong' }
l['bug'] = { nom = 'bugis' }
l['buh'] = { nom = 'younuo' }
l['bui'] = { nom = 'bongili' }
l['buk'] = { nom = 'bukawa' }
l['bularnu'] = { nom = 'bularnu' }
l['bum'] = { nom = 'boulou' }
l['bun'] = { nom = 'sherbro' }
l['burgonde'] = { nom = 'burgonde' }
l['bus'] = { nom = 'bokobaru' }
l['but'] = { nom = 'bungain' }
l['buu'] = { nom = 'budu' }
l['buw'] = { nom = 'bubi' }
l['bux'] = { nom = 'boghom' }
l['buy'] = { nom = 'bullom so' }
l['buz'] = { nom = 'bukwen' }
l['bva'] = { nom = 'baraïn' }
l['bvb'] = { nom = 'bube' }
l['bvj'] = { nom = 'ogoi' }
l['bvk'] = { nom = 'bukat' }
l['bvo'] = { nom = 'bolgo' }
l['bvp'] = { nom = 'bumang' }
l['bvq'] = { nom = 'birri' }
l['bvt'] = { nom = 'bati (Indonésie)' }
l['bvu'] = { nom = 'bukit' }
l['bvv'] = { nom = 'baniva' }
l['bvw'] = { nom = 'boga' }
l['bvx'] = { nom = 'dibole' }
l['bvy'] = { nom = 'utudnon' }
l['bvz'] = { nom = 'bauzi' }
l['bwa'] = { nom = 'bwatoo' }
l['bwb'] = { nom = 'namosi-naitasiri-serua' }
l['bwc'] = { nom = 'bwile' }
l['bwd'] = { nom = 'bwaidoka' }
l['bwe'] = { nom = 'bwe' }
l['bwf'] = { nom = 'boselewa' }
l['bwg'] = { nom = 'barwe' }
l['bwh'] = { nom = 'bishuo' }
l['bwi'] = { nom = 'baniwa' }
l['bwj'] = { nom = 'bwamu laa' }
l['bwk'] = { nom = 'bauwaki' }
l['bwl'] = { nom = 'ebwela' }
l['bwm'] = { nom = 'biwat' }
l['bwn'] = { nom = 'wunai bunu' }
l['bwo'] = { nom = 'shinasha' }
l['bwp'] = { nom = 'bawah de Mandobo' }
l['bwq'] = { nom = 'bobo madaré du Sud' }
l['bwr'] = { nom = 'babur' }
l['bws'] = { nom = 'bomboma' }
l['bwt'] = { nom = 'bafaw-balong' }
l['bwu'] = { nom = 'buli (Ghana)' }
l['bww'] = { nom = 'bwa' }
l['bwx'] = { nom = 'dongnu de Dahua' }
l['bwx-bun'] = { nom = 'bunuo' }
l['bwx-nao'] = { nom = 'naoklao' }
l['bwx-num'] = { nom = 'numao' }
l['bwx-nun'] = { nom = 'nunu de Lingyun' }
l['bwy'] = { nom = 'bwamu cwi' }
l['bwz'] = { nom = 'bwisi' }
l['bxb'] = { nom = 'belanda boor' }
l['bxd'] = { nom = 'bola (Chine)' }
l['bxe'] = { nom = 'ongota' }
l['bxf'] = { nom = 'bilur' }
l['bxg'] = { nom = 'bangala' }
l['bxi'] = { nom = 'pirlatapa' }
l['bxj'] = { nom = 'bayungu' }
l['bxk'] = { nom = 'bukusu' }
l['bxl'] = { nom = 'jalkunan' }
l['bxn'] = { nom = 'burduna' }
l['bxq'] = { nom = 'beele' }
l['bqx'] = { nom = 'bele' }
l['bxr'] = { nom = 'bouriate de Russie' }
l['bxs'] = { nom = 'busam' }
l['bxu-bar'] = { nom = 'bargu' }
l['bxw'] = { nom = 'bankagooma' }
l['byd'] = { nom = 'benyadu’' }
l['bye'] = { nom = 'pouye' }
l['byf'] = { nom = 'bété (Nigeria)' }
l['byn'] = { nom = 'bilen' }
l['byo'] = { nom = 'biyo' }
l['byq'] = { nom = 'basay' }
l['byr'] = { nom = 'baruya' }
l['byt'] = { nom = 'berti' }
l['byv'] = { nom = 'medumba' }
l['byz'] = { nom = 'banaro' }
l['bza'] = { nom = 'bandi' }
l['bzb'] = { nom = 'andio' }
l['bzc'] = { nom = 'malgache betsimisaraka du Sud' }
l['bzd'] = { nom = 'bribri' }
l['bze'] = { nom = 'bozo-djenama' }
l['bzf'] = { nom = 'boikin' }
l['bzg'] = { nom = 'babuza' }
l['bzh'] = { nom = 'buang mapos' }
l['bzi'] = { nom = 'bisu' }
l['bzj'] = { nom = 'créole bélizien' }
l['bzk'] = { nom = 'créole anglais nicaraguayen', tri = 'creole nicaraguayen anglais' }
l['bzl'] = { nom = 'boano (Sulawesi)' }
l['bzn'] = { nom = 'boano (Maluku)' }
l['bzp'] = { nom = 'kemberano' }
l['bzq'] = { nom = 'buli (Indonésie)' }
l['bzt'] = { nom = 'brithenig' }
l['bzu'] = { nom = 'burmeso' }
l['bzv'] = { nom = 'bebe' }
l['bzw'] = { nom = 'basa' }
l['bzx'] = { nom = 'bozo-kelengaxo' }
l['bzz'] = { nom = 'evant' }
l['ca'] = { nom = 'catalan', wiktionnaire = true }
l['ca-valencia'] = { nom = 'valencien' }
l['caa'] = { nom = 'ch’orti’' }
l['cab'] = { nom = 'garifuna' }
l['cac'] = { nom = 'chuj' }
l['cad'] = { nom = 'caddo' }
l['cae'] = { nom = 'léhar' }
l['caf'] = { nom = 'porteur du Sud' }
l['cag'] = { nom = 'nivaklé' }
l['cai'] = { nom = 'langues centre-amérindiennes', tri = 'centre amerindiennes langues' }
l['caj'] = { nom = 'chané' }
l['cak'] = { nom = 'cakchiquel' }
l['cal'] = { nom = 'carolinien' }
l['calabrais centro-méridional'] = { nom = 'calabrais centro-méridional' }
l['cam'] = { nom = 'cèmuhî' }
l['can'] = { nom = 'chambri' }
l['cao'] = { nom = 'chácobo' }
l['cap'] = { nom = 'chipaya' }
l['caq'] = { nom = 'car' }
l['car'] = { nom = 'kali’na' }
l['cas'] = { nom = 'tsimané' }
l['catio ancien'] = { nom = 'catio ancien' }
l['cau'] = { nom = 'langues caucasiennes', tri = 'caucasiennes langues' }
l['cav'] = { nom = 'cavineña' }
l['caw'] = { nom = 'kallawaya' }
l['cax'] = { nom = 'chiquitano' }
l['cay'] = { nom = 'cayuga' }
l['caz'] = { nom = 'canichana' }
l['cba'] = { nom = 'langues chibchas', tri = 'chibchas langues' }
l['cbb'] = { nom = 'cabiyarí' }
l['cbc'] = { nom = 'carapana' }
l['cbd'] = { nom = 'carijona' }
l['cbg'] = { nom = 'chimila' }
l['cbi'] = { nom = 'cayapa' }
l['cbk'] = { nom = 'chavacano' }
l['cbk-zam'] = { nom = 'chavacano de Zamboanga' }
l['cbn'] = { nom = 'nyahkur' }
l['cbo'] = { nom = 'izora' }
l['cbr'] = { nom = 'cashibo' }
l['cbs'] = { nom = 'cashinahua' }
l['cbt'] = { nom = 'chayahuita' }
l['cbu'] = { nom = 'candoshi' }
l['cbv'] = { nom = 'kakua' }
l['cca'] = { nom = 'cauca' }
l['ccc'] = { nom = 'chamicuro' }
l['ccd'] = { nom = 'cafundó' }
l['cch'] = { nom = 'atsam' }
l['ccn'] = { nom = 'langues caucasiennes du Nord', tri = 'caucasiennes du nord langues' }
l['cco'] = { nom = 'chinantèque de Comaltepec', tri = 'chinanteque Comaltepec' }
l['ccp'] = { nom = 'changma kodha' }
l['ccr'] = { nom = 'cacaopera' }
l['ccs'] = { nom = 'langues caucasiennes du Sud', tri = 'caucasiennes du sud langues' }
l['cdc'] = { nom = 'langues tchadiques', tri = 'tchadiques langues' }
l['cdd'] = { nom = 'langues caddoanes', tri = 'caddoanes langues' }
l['cde'] = { nom = 'chenchu' }
l['cdf'] = { nom = 'chiru' }
l['cdh'] = { nom = 'chambeali' }
l['cdi'] = { nom = 'chodri' }
l['cdm'] = { nom = 'chepang' }
l['cdn'] = { nom = 'chaudangsi' }
l['cdo'] = { nom = 'mindong' }
l['cdr'] = { nom = 'kamuku' }
l['cds'] = { nom = 'langue des signes tchadienne', tri = 'signes tchadienne' }
l['cdy'] = { nom = 'chadong' }
l['cdz'] = { nom = 'koda' }
l['ce'] = { nom = 'tchétchène' }
l['cea'] = { nom = 'chehalis inférieur' }
l['ceb'] = { nom = 'cebuano' }
l['ceg'] = { nom = 'chamacoco' }
l['cel'] = { nom = 'langues celtiques', tri = 'celtiques langues' }
l['celtique asturien'] = { nom = 'celtique asturien' }
l['cet'] = { nom = 'jalaa' }
l['cfa'] = { nom = 'dijim-bwilim' }
l['cfd'] = { nom = 'cara' }
l['cfm'] = { nom = 'falam' }
l['cgc'] = { nom = 'kagayanen' }
l['cgk'] = { nom = 'chocangacakha' }
l['cgg'] = { nom = 'kiga' }
l['ch'] = { nom = 'chamorro', wiktionnaire = true }
l['chali'] = { nom = 'chali' }
l['champenois'] = { nom = 'champenois' }
l['chaná'] = { nom = 'chaná' }
l['changjiang'] = { nom = 'changjiang' }
l['charrúa'] = { nom = 'charrúa' }
l['chb'] = { nom = 'muisca' }
l['chc'] = { nom = 'catawba' }
l['chd'] = { nom = 'chontal des hautes terres', tri = 'chontal hautes terres' }
l['chf'] = { nom = 'chontal du Tabasco', tri = 'chontal Tabasco' }
l['chg'] = { nom = 'tchaghataï' }
l['chh'] = { nom = 'chinook' }
l['chirino'] = { nom = 'chirino' }
l['chj'] = { nom = 'chinantèque d’Ojitlán', tri = 'chinanteque Ojitlan' }
l['chk'] = { nom = 'chuuk' }
l['chl'] = { nom = 'cahuilla' }
l['chm'] = { nom = 'mari' }
l['chn'] = { nom = 'jargon chinook' }
l['cho'] = { nom = 'choctaw' }
l['chp'] = { nom = 'chipewyan' }
l['chq'] = { nom = 'chinantèque de Quiotepec', tri = 'chinanteque Quiotepec' }
l['chr'] = { nom = 'cherokee', wiktionnaire = true }
l['chs'] = { nom = 'langues chumash', tri = 'chumash langues' }
l['cht'] = { nom = 'cholón' }
l['chw'] = { nom = 'echuwabo' }
l['chy'] = { nom = 'cheyenne' }
l['chz'] = { nom = 'chinantèque d’Ozumacín', tri = 'chinanteque Ozumacin' }
l['cia'] = { nom = 'cia-cia' }
l['cic'] = { nom = 'chickasaw' }
l['cid'] = { nom = 'chimariko' }
l['cie'] = { nom = 'cineni' }
l['cilentain méridional'] = { nom = 'cilentain méridional' }
l['cim'] = { nom = 'cimbre' }
l['cin'] = { nom = 'cinta-larga' }
l['cip'] = { nom = 'chiapanèque' }
l['cir'] = { nom = 'tîrî' }
l['ciw'] = { nom = 'chippewa' }
l['ciy'] = { nom = 'chaima' }
l['cja'] = { nom = 'cham occidental' }
l['cje'] = { nom = 'chru' }
l['cjh'] = { nom = 'chehalis supérieur' }
l['cji'] = { nom = 'chamalal' }
l['cjm'] = { nom = 'cham oriental' }
l['cjp'] = { nom = 'cabécar' }
l['cjs'] = { nom = 'chor' }
l['cjv'] = { nom = 'chuave' }
l['cjy'] = { nom = 'jinyu' }
l['ckb'] = { nom = 'soranî', wiktionnaire = true }
l['ckl'] = { nom = 'cibak' }
l['ckn'] = { nom = 'kaang' }
l['ckq'] = { nom = 'kadjakse' }
l['cks'] = { nom = 'tayo' }
l['ckt'] = { nom = 'tchouktche' }
l['cku'] = { nom = 'koasati' }
l['ckv'] = { nom = 'kavalan' }
l['cky'] = { nom = 'cakfem-mushere' }
l['cla'] = { nom = 'ron' }
l['clc'] = { nom = 'chilcotin' }
l['cld'] = { nom = 'néo-araméen chaldéen', tri = 'arameen neo chaldeen' }
l['cle'] = { nom = 'chinantèque de San Juan Lealao', tri = 'chinanteque San Juan Lealao' }
l['cli'] = { nom = 'chakali' }
l['clk'] = { nom = 'idou' }
l['clm'] = { nom = 'klallam' }
l['clo'] = { nom = 'chontal des basses terres', tri = 'chontal basses terres' }
l['clu'] = { nom = 'caluyanun' }
l['cly'] = { nom = 'chatino de la Sierra orientale', tri = 'chatino sierra orientale' }
l['cmc'] = { nom = 'langues chames', tri = 'chames langues' }
l['cme'] = { nom = 'cerma' }
l['cmg'] = { nom = 'mongol classique' }
l['cmi'] = { nom = 'emberá chamí' }
l['cmn'] = { nom = 'mandarin', wmlien = 'zh', wiktionnaire = true }
l['cmr'] = { nom = 'mro' }
l['cms'] = { nom = 'messapien' }
l['cmt'] = { nom = 'camtho' }
l['cnc'] = { nom = 'côông' }
l['cng'] = { nom = 'qiang du Nord' }
l['cnh'] = { nom = 'haka chin' }
l['cni'] = { nom = 'asháninka' }
l['cnk'] = { nom = 'khumi' }
l['cnl'] = { nom = 'chinantèque de Lalana', tri = 'chinanteque Lalana' }
l['cns'] = { nom = 'asmat central' }
l['cnt'] = { nom = 'chinantèque de Tepetotutla', tri = 'chinanteque Tepetotutla' }
l['cnx'] = { nom = 'moyen cornique', tri = 'cornique moyen' }
l['co'] = { nom = 'corse', wiktionnaire = true }
l['coa'] = { nom = 'malais des îles Cocos' }
l['cob'] = { nom = 'chicomuceltec' }
l['coc'] = { nom = 'cocopa' }
l['cod'] = { nom = 'cocama-cocamilla' }
l['coe'] = { nom = 'koreguaje' }
l['cof'] = { nom = 'tsafiqui' }
l['cog'] = { nom = 'chong' }
l['coj'] = { nom = 'cochimi' }
l['cok'] = { nom = 'cora de Santa Teresa' }
l['col'] = { nom = 'salish wenatchi-columbian' }
l['colac'] = { nom = 'colac' }
l['com'] = { nom = 'comanche' }
l['con'] = { nom = 'cofan' }
l['conv'] = { nom = 'conventions internationales', wmlien = 'wikispecies', tri = '*conventions' }
l['coo'] = { nom = 'comox' }
l['cop'] = { nom = 'copte' }
l['copallén'] = { nom = 'copallén' }
l['coq'] = { nom = 'coquille' }
l['cot'] = { nom = 'caquinte' }
l['cou'] = { nom = 'coniagui' }
l['cow'] = { nom = 'cowlitz' }
l['cox'] = { nom = 'nanti' }
l['coz'] = { nom = 'chocho' }
l['cpa'] = { nom = 'chinantèque de Palantla', tri = 'chinanteque Palantla' }
l['cpc'] = { nom = 'ajyíninka apurucayali' }
l['cpe'] = { nom = 'créoles et pidgins basés sur l’anglais', tri = 'creoles et pidgins anglais' }
l['cpe-spp'] = { nom = 'pidgin des plantations samoanes', tri = 'pidgin samoa plantations' }
l['cpf'] = { nom = 'créoles et pidgins basés sur le français', tri = 'creoles et pidgins francais' }
l['cpg'] = { nom = 'cappadocien' }
l['cpi'] = { nom = 'anglais pidgin chinois', tri = 'pidgin chinois anglais' }
l['cpo'] = { nom = 'kpeego' }
l['cpp'] = { nom = 'créoles et pidgins basés sur le portugais', tri = 'creoles et pidgins portugais' }
l['cpu'] = { nom = 'ashéninka de Pichis' }
l['cpx'] = { nom = 'puxian' }
l['cqd'] = { nom = 'miao chuanqiandian' }
l['cr'] = { nom = 'cri', wiktionnaire = true }
l['cra'] = { nom = 'chara' }
l['crc'] = { nom = 'lonwolwol' }
l['crd'] = { nom = 'cœur d’alène' }
l['créole guadeloupéen'] = { nom = 'créole guadeloupéen' }
l['créole dominiquais'] = { nom = 'créole dominiquais' }
l['crf'] = { nom = 'caramanta' }
l['crg'] = { nom = 'métchif' }
l['crh'] = { nom = 'tatar de Crimée' }
l['cri'] = { nom = 'forro' }
l['crj'] = { nom = 'cri de l’Est, dialecte du Sud', tri = 'cri est dialecte sud' }
l['crk'] = { nom = 'cri des plaines', tri = 'cri plaines' }
l['crl'] = { nom = 'cri de l’Est, dialecte du Nord', tri = 'cri est dialecte nord' }
l['crm'] = { nom = 'cri de Moose', tri = 'cri moose' }
l['crn'] = { nom = 'cora d’El Nayar' }
l['cro'] = { nom = 'crow' }
l['crp'] = { nom = 'créoles et pidgins' }
l['crq'] = { nom = 'chorote iyo’wujwa' }
l['crr'] = { nom = 'algonquien de Caroline' }
l['crs'] = { nom = 'créole seychellois' }
l['crt'] = { nom = 'chorote iyojwa’ja' }
l['crv'] = { nom = 'chaura' }
l['crw'] = { nom = 'chrau' }
l['crx'] = { nom = 'porteur' }
l['cry'] = { nom = 'chori' }
l['crz'] = { nom = 'cruzeño' }
l['cs'] = { nom = 'tchèque', wiktionnaire = true }
l['csa'] = { nom = 'chinantèque de Chiltepec', tri = 'chinanteque Chiltepec' }
l['csb'] = { nom = 'kachoube', wiktionnaire = true }
l['csc'] = { nom = 'langue des signes catalane', tri = 'signes catalane' }
l['cse'] = { nom = 'langue des signes tchèque', tri = 'signes tcheque' }
l['csg'] = { nom = 'langue des signes chilienne', tri = 'signes chilienne' }
l['csh'] = { nom = 'asho' }
l['csi'] = { nom = 'miwok de la côte', tri = 'miwok cote' }
l['csk'] = { nom = 'jola-kasa' }
l['csm'] = { nom = 'miwok central de la Sierra' }
l['csn'] = { nom = 'langue des signes colombienne', tri = 'signes colombienne' }
l['cso'] = { nom = 'chinantèque de Sochiapam', tri = 'chinanteque Sochiapam' }
l['css'] = { nom = 'ohlone du Sud' }
l['css-mut'] = { nom = 'mutsun' }
l['css-rum'] = { nom = 'rumsen' }
l['cst'] = { nom = 'awaswas' }
l['cst-cha'] = { nom = 'chalon' }
l['cst-cho'] = { nom = 'chochenyo' }
l['csu'] = { nom = 'langues soudaniques centrales', tri = 'soudaniques centrales langues' }
l['csv'] = { nom = 'sumtu chin' }
l['csw'] = { nom = 'cri des marais', tri = 'cri marais' }
l['csz'] = { nom = 'hanis' }
l['cta'] = { nom = 'chatino de Tataltepec', tri = 'chatino Tataltepec' }
l['ctc'] = { nom = 'chetco' }
l['ctd'] = { nom = 'tedim' }
l['cte'] = { nom = 'chinantèque de Tepinapa', tri = 'chinanteque Tepinapa' }
l['ctl'] = { nom = 'chinantèque de Tlacoatzintepec', tri = 'chinanteque Tlacoatzintepec' }
l['ctm'] = { nom = 'chitimacha' }
l['ctn'] = { nom = 'chintang' }
l['cto'] = { nom = 'emberá catío' }
l['ctp'] = { nom = 'chatino de la Sierra occidentale', tri = 'chatino sierra occidentale' }
l['cts'] = { nom = 'bikol du Nord de Catanduanes' }
l['ctu'] = { nom = 'chol' }
l['ctz'] = { nom = 'chatino de Zacatepec', tri = 'chatino Zacatepec' }
l['cu'] = { nom = 'vieux slave', tri = 'slave vieux' }
l['cua'] = { nom = 'cua' }
l['cub'] = { nom = 'cubeo' }
l['cuc'] = { nom = 'chinantèque d’Usila', tri = 'chinanteque Usila' }
l['cug'] = { nom = 'cung' }
l['cuh'] = { nom = 'chuka' }
l['cui'] = { nom = 'cuiba' }
l['cuj'] = { nom = 'mashco piro' } -- cujareño
l['cuk'] = { nom = 'kuna de San Blas' }
l['cul'] = { nom = 'culina' }
l['culle'] = { nom = 'culle' }
l['cum'] = { nom = 'cumeral' }
l['cuo'] = { nom = 'cumanagoto' }
l['cup'] = { nom = 'cupeño' }
l['cuq'] = { nom = 'cun' }
l['cus'] = { nom = 'langues couchitiques', tri = 'couchitiques langues' }
l['cut'] = { nom = 'cuicatèque de Teutila', tri = 'cuicateque Teutila' }
l['cuu'] = { nom = 'tay ya' }
l['cuv'] = { nom = 'cuvok' }
l['cux'] = { nom = 'cuicatèque de Tepeuxila', tri = 'cuicateque Tepeuxila' }
l['cv'] = { nom = 'tchouvache' }
l['cvg'] = { nom = 'chug' }
l['cvn'] = { nom = 'chinantèque de Valle Nacional', tri = 'chinanteque Valle Nacional' }
l['cwa'] = { nom = 'kabwa' }
l['cwd'] = { nom = 'cri des bois', tri = 'cri bois' }
l['cwe'] = { nom = 'kwere' }
l['cwt'] = { nom = 'kwatay' }
l['cy'] = { nom = 'gallois', wiktionnaire = true }
l['cya'] = { nom = 'chatino de Nopala', tri = 'chatino Nopala' }
l['cyb'] = { nom = 'cayubaba' }
l['czh'] = { nom = 'huizhou' }
l['czk'] = { nom = 'knaanique' }
l['czn'] = { nom = 'chatino de Zenzontepec', tri = 'chatino Zenzontepec' }
l['czo'] = { nom = 'minzhong' }
l['da'] = { nom = 'danois', wiktionnaire = true }
l['daa'] = { nom = 'dangaléat' }
l['dac'] = { nom = 'dambi' }
l['dad'] = { nom = 'marik' }
l['dag'] = { nom = 'dagbani' }
l['dah'] = { nom = 'gwahatike' }
l['dai'] = { nom = 'day' }
l['daj'] = { nom = 'dar fur daju' }
l['dak'] = { nom = 'dakota' }
l['dal'] = { nom = 'dahalo' }
l['dalécarlien'] = { nom = 'dalécarlien' }
l['dam'] = { nom = 'damakawa' }
l['damu'] = { nom = 'damu' }
l['dao'] = { nom = 'daai chin' }
l['daq'] = { nom = 'maria dandami' }
l['dar'] = { nom = 'dargwa' }
l['dardanien'] = { nom = 'dardanien' }
l['das'] = { nom = 'daho-doo' }
l['dau'] = { nom = 'dadjo du Dar Sila' }
l['dav'] = { nom = 'taita' }
l['daw'] = { nom = 'davawenyo' }
l['day'] = { nom = 'langues dayakes', tri = 'dayakes langues' }
l['dba'] = { nom = 'bangeri me' }
l['dbf'] = { nom = 'edopi' }
l['dbg'] = { nom = 'dogul dom' }
l['dbj'] = { nom = 'ida’an' }
l['dbl'] = { nom = 'dyirbal' }
l['dbm'] = { nom = 'duguri' }
l['dbn'] = { nom = 'duriankere' }
l['dbp'] = { nom = 'ɗuwai' }
l['dbq'] = { nom = 'daba' }
l['dbt'] = { nom = 'ben tey' }
l['dbu'] = { nom = 'bondum dom' }
l['dbw'] = { nom = 'bankan tey' }
l['dby'] = { nom = 'dibiyaso' }
l['dcr'] = { nom = 'negerhollands' }
l['dda'] = { nom = 'dadi dadi' }
l['ddd'] = { nom = 'dongotono' }
l['dde'] = { nom = 'doondo' }
l['ddg'] = { nom = 'fataluku' }
l['ddi'] = { nom = 'goodenough de l’Ouest' }
l['ddj'] = { nom = 'jaru' }
l['ddo'] = { nom = 'tsez' }
l['ddr'] = { nom = 'dhudhuroa' }
l['ddw'] = { nom = 'dawera-daweloor' }
l['de'] = { nom = 'allemand', portail = true, wiktionnaire = true }
l['dec'] = { nom = 'dagik' }
l['ded'] = { nom = 'dedua' }
l['dee'] = { nom = 'dewoin' }
l['def'] = { nom = 'defzuli' }
l['deg'] = { nom = 'degema' }
l['deh'] = { nom = 'dehwari' }
l['dei'] = { nom = 'demisa' }
l['del'] = { nom = 'langues delaware', tri = 'delaware langues' }
l['dem'] = { nom = 'dem' }
l['den'] = { nom = 'esclave' }
l['dep'] = { nom = 'pidgin du Delaware', tri = 'pidgin Delaware' }
l['der'] = { nom = 'deuri' }
l['des'] = { nom = 'desano' }
l['dev'] = { nom = 'domung' }
l['dez'] = { nom = 'bondengese' }
l['dga'] = { nom = 'dagaree du Sud' }
l['dgb'] = { nom = 'bunoge' }
l['dgc'] = { nom = 'agta de Casiguran', tri = 'agta Casiguran' }
l['dgd'] = { nom = 'dagari dioula' }
l['dge'] = { nom = 'degenan' }
l['dgh'] = { nom = 'dghwede' }
l['dgl'] = { nom = 'dongolawi' }
l['dgo'] = { nom = 'dogri' }
l['dgr'] = { nom = 'flanc-de-chien' }
l['dgz'] = { nom = 'daga' }
l['dhg'] = { nom = 'dhangu-djangu' }
l['dhi'] = { nom = 'dhimal' }
l['dhl'] = { nom = 'dhalandji' }
l['dhr'] = { nom = 'dhargari' }
l['dhs'] = { nom = 'dhaiso' }
l['dhu'] = { nom = 'dhurga' }
l['dhv'] = { nom = 'drehu' }
l['dia'] = { nom = 'dia' }
l['dib'] = { nom = 'dinka du Sud-Central' }
l['dic'] = { nom = 'dida de Lakota' }
l['did'] = { nom = 'didinga' }
l['dif'] = { nom = 'dieri' }
l['dig'] = { nom = 'digo' }
l['dih'] = { nom = 'kumiai' }
l['dii'] = { nom = 'dimbong' }
l['dij'] = { nom = 'dai' }
l['dik'] = { nom = 'dinka du Sud-Ouest' }
l['dil'] = { nom = 'dilling' }
l['dim'] = { nom = 'dime' }
l['din'] = { nom = 'dinka' }
l['dio'] = { nom = 'dibo' }
l['dip'] = { nom = 'dinka du Nord-Est' }
l['diq'] = { nom = 'dimli (zazaki du Sud)', wiktionnaire = true }
l['dir'] = { nom = 'dirim' }
l['dis'] = { nom = 'dimasa' }
l['dit'] = { nom = 'dirari' }
l['diu'] = { nom = 'diriku' }
l['diw'] = { nom = 'dinka du Nord-Ouest' }
l['dix'] = { nom = 'dixon reef' }
l['diy'] = { nom = 'diuwe' }
l['diz'] = { nom = 'dzing' }
l['dja'] = { nom = 'djadjawurrung' }
l['djb'] = { nom = 'djinba' }
l['djc'] = { nom = 'dadjo' }
l['djd'] = { nom = 'djamindjung' }
l['dje'] = { nom = 'zarma' }
l['dji'] = { nom = 'djinang' }
l['djk'] = { nom = 'ndjuka' }
l['djm'] = { nom = 'jamsay' }
l['djr'] = { nom = 'djambarrpuyngu' }
l['dju'] = { nom = 'kapriman' }
l['dka'] = { nom = 'dakpakha' }
l['dks'] = { nom = 'dinka du Sud-Est' }
l['dlg'] = { nom = 'dolgane' }
l['dlk'] = { nom = 'dahalik' }
l['dlm'] = { nom = 'dalmate' }
l['dma'] = { nom = 'duma' }
l['dmb'] = { nom = 'mombo' }
l['dmd'] = { nom = 'madhi madhi' }
l['dme'] = { nom = 'dugwor' }
l['dmk'] = { nom = 'domaaki' }
l['dml'] = { nom = 'dameli' }
l['dmn'] = { nom = 'langues mandées', tri = 'mandees langues' }
l['dmo'] = { nom = 'kemedzung' }
l['dmr'] = { nom = 'damar de l’Est' }
l['dms'] = { nom = 'dampelas' }
l['dmu'] = { nom = 'tebi' }
l['dmv'] = { nom = 'dumpas' }
l['dmy'] = { nom = 'demta' }
l['dna'] = { nom = 'dani de Upper Grand Valley' }
l['dng'] = { nom = 'doungane' }
l['dni'] = { nom = 'dani de Lower Grand Valley' }
l['dnj'] = { nom = 'dan' }
l['dnk'] = { nom = 'dengka' }
l['dnn'] = { nom = 'dzùùngoo' }
l['dnr'] = { nom = 'danaru' }
l['dnt'] = { nom = 'dani de Mid Grand Valley' }
l['dnu'] = { nom = 'danau' }
l['dnw'] = { nom = 'dani de l’Ouest' }
l['dny'] = { nom = 'dení' }
l['doa'] = { nom = 'dom' }
l['dob'] = { nom = 'dobu' }
l['doc'] = { nom = 'kam du Nord' }
l['doe'] = { nom = 'doe' }
l['dog'] = { nom = 'dogon' }
l['doh'] = { nom = 'dong' }
l['doi'] = { nom = 'dogri' }
l['dok'] = { nom = 'dondo' }
l['don'] = { nom = 'toura (austronésien)' }
l['dongmeng'] = { nom = 'dongmeng' }
l['dongnu de Du’an'] = { nom = 'dongnu de Du’an' }
l['doo'] = { nom = 'dongo' }
l['dor'] = { nom = 'dori’o' }
l['dos'] = { nom = 'dogosé' }
l['dow'] = { nom = 'dowayo' }
l['dox'] = { nom = 'dobase' }
l['doy'] = { nom = 'dompo' }
l['doz'] = { nom = 'dorze' }
l['dpp'] = { nom = 'papar' }
l['dra'] = { nom = 'langues dravidiennes', tri = 'dravidiennes langues' }
l['drc'] = { nom = 'minderico' }
l['drd'] = { nom = 'darmiya' }
l['dre'] = { nom = 'dolpo' }
l['drg'] = { nom = 'rungus' }
l['dri'] = { nom = 'c’lela' }
l['drl'] = { nom = 'darling' }
l['drn'] = { nom = 'damar de l’Ouest' }
l['dro'] = { nom = 'melanau daro-matu' }
l['drq'] = { nom = 'dura' }
l['drs'] = { nom = 'gedeo' }
l['drt'] = { nom = 'drents' }
l['dru'] = { nom = 'rukai' }
l['dry'] = { nom = 'darai' }
l['dsb'] = { nom = 'bas-sorabe', tri = 'sorabe bas' }
l['dse'] = { nom = 'langue des signes néerlandaise', tri = 'signes neerlandaise' }
l['dsh'] = { nom = 'daasanach' }
l['dsi'] = { nom = 'disa' }
l['dsl'] = { nom = 'langue des signes danoise', tri = 'signes danoise' }
l['dsn'] = { nom = 'dusner' }
l['dso'] = { nom = 'desiya' }
l['dsq'] = { nom = 'tadaksahak' }
l['dta'] = { nom = 'daur' }
l['dtb'] = { nom = 'kadazan de Labuk-Kinabatangan' }
l['dtd'] = { nom = 'ditidaht' }
l['dti'] = { nom = 'ana tinga' }
l['dtk'] = { nom = 'tene kan' }
l['dtm'] = { nom = 'tomo kan' }
l['dtn'] = { nom = 'daatsʼíin' }
l['dto'] = { nom = 'tommo so' }
l['dtp'] = { nom = 'dusun central' }
l['dtr'] = { nom = 'lotud' }
l['dts'] = { nom = 'dogon toro so' }
l['dtt'] = { nom = 'toro tegu' }
l['dtu'] = { nom = 'tebul' }
l['dty'] = { nom = 'doteli' }
l['dua'] = { nom = 'douala' }
l['dub'] = { nom = 'dubli' }
l['duc'] = { nom = 'duna' }
l['dud'] = { nom = 'hun-saare' }
l['due'] = { nom = 'dumaget de l’Umiray' }
l['duf'] = { nom = 'dumbéa' }
l['dug'] = { nom = 'chiduruma' }
l['dui'] = { nom = 'dumum' }
l['duj'] = { nom = 'dhuwal' }
l['duk'] = { nom = 'uyajitaya' }
l['dum'] = { nom = 'moyen néerlandais', tri = 'neerlandais moyen' }
l['dun'] = { nom = 'dusun deyah' }
l['duo'] = { nom = 'agta de Dupaningan', tri = 'agta Dupaningan' }
l['duoxu'] = { nom = 'duoxu' }
l['duq'] = { nom = 'dusun malang' }
l['dur'] = { nom = 'dii' }
l['dus'] = { nom = 'dumi' }
l['dusun du Brunéi'] = { nom = 'dusun du Brunéi', tri = 'dusun brunei' }
l['dusun papar'] = { nom = 'dusun papar' }
l['duu'] = { nom = 'drung' }
l['duv'] = { nom = 'duvle' }
l['duw'] = { nom = 'dusun witu' }
l['dux'] = { nom = 'duungooma' }
l['duy'] = { nom = 'agta de Dicamay', tri = 'agta Dicamay' }
l['dv'] = { nom = 'divehi', wiktionnaire = true }
l['dva'] = { nom = 'duau' }
l['dwr'] = { nom = 'dawro' }
l['dws'] = { nom = 'speedwords de Dutton' }
l['dya'] = { nom = 'dyan' }
l['dyd'] = { nom = 'dyugun' }
l['dyi'] = { nom = 'djimini' }
l['dym'] = { nom = 'yanda dom' }
l['dyn'] = { nom = 'dyangadi' }
l['dyo'] = { nom = 'jola-fonyi' }
l['dyu'] = { nom = 'dioula' }
l['dyy'] = { nom = 'tjapukai' }
l['dz'] = { nom = 'dzongkha', wiktionnaire = true }
l['dza'] = { nom = 'tunzu' }
l['dze'] = { nom = 'djiwarli' }
l['dzg'] = { nom = 'dazaga' }
l['dzl'] = { nom = 'dzalakha' }
l['ebg'] = { nom = 'ebughu' }
l['ebk'] = { nom = 'bontok de l’Est' }
l['ebo'] = { nom = 'teke-ebo' }
l['ebr'] = { nom = 'ébrié' }
l['ebu'] = { nom = 'kiembu' }
l['ecr'] = { nom = 'étéocrétois' }
l['ee'] = { nom = 'éwé' }
l['eee'] = { nom = 'e' }
l['efa'] = { nom = 'efai' }
l['efe'] = { nom = 'efe' }
l['efi'] = { nom = 'éfik', tri = 'efik' }
l['ega'] = { nom = 'éga', tri = 'ega' }
l['egl'] = { nom = 'émilien', wmlien = 'eml' }
l['ego'] = { nom = 'eggon' }
l['egx'] = { nom = 'langues égyptiennes', tri = 'egyptiennes langues' }
l['egy'] = { nom = 'égyptien ancien' }
l['eip'] = { nom = 'eipo' }
l['eit'] = { nom = 'eitiep' }
l['eja'] = { nom = 'ejamat' }
l['eka'] = { nom = 'ékadjouk' }
l['eke'] = { nom = 'eket' }
l['ekg'] = { nom = 'ekari' }
l['eki'] = { nom = 'eki' }
l['ekl'] = { nom = 'kol (Bangladesh)' }
l['ekm'] = { nom = 'elip' }
l['eko'] = { nom = 'ekoti' }
l['ekp'] = { nom = 'ekpeye' }
l['ekr'] = { nom = 'yace' }
l['eky'] = { nom = 'kayah li de l’Est' }
l['el'] = { nom = 'grec', wiktionnaire = true }
l['ele'] = { nom = 'elepi' }
l['eli'] = { nom = 'nding' }
l['elk'] = { nom = 'elkei' }
l['elm'] = { nom = 'eleme' }
l['elo'] = { nom = 'elmolo' }
l['elu'] = { nom = 'elu' }
l['elx'] = { nom = 'élamite' }
l['ema'] = { nom = 'emai-iuleha-ora' }
l['emb'] = { nom = 'embaloh' }
l['eme'] = { nom = 'émérillon' }
l['emg'] = { nom = 'meohang de l’Est' }
l['emi'] = { nom = 'mussau' }
l['emk'] = { nom = 'maninka oriental' }
l['eml'] = { nom = 'émilien-romagnol', tri = 'emilien romagnol' }
l['emo'] = { nom = 'emok' }
l['emp'] = { nom = 'emberá darién' }
l['ems'] = { nom = 'alutiiq' }
l['emu'] = { nom = 'muria de l’Est' }
l['emw'] = { nom = 'emplawas' }
l['emx'] = { nom = 'erromintxela' }
l['en'] = { nom = 'अंग्रेज़ी', wiktionnaire = true }
l['ena'] = { nom = 'apali' }
l['enb'] = { nom = 'markweta' }
l['end'] = { nom = 'ende' }
l['enf'] = { nom = 'énètse des forêts', tri = 'enetse forets' }
l['enh'] = { nom = 'énètse de la toundra', tri = 'enetse toundra' }
l['enl'] = { nom = 'enlhet' }
l['enm'] = { nom = 'moyen anglais', tri = 'anglais moyen' }
l['enn'] = { nom = 'engenni' }
l['eno'] = { nom = 'enganno' }
l['enq'] = { nom = 'enga' }
l['enr'] = { nom = 'emumu' }
l['enu'] = { nom = 'enu' }
l['enw'] = { nom = 'enwan' }
l['enx'] = { nom = 'enxet' }
l['eo'] = { nom = 'espéranto', portail = true, wiktionnaire = true }
l['eot'] = { nom = 'eotilé' }
l['epi'] = { nom = 'epie' }
l['èque'] = { nom = 'èque' }
l['era'] = { nom = 'eravallan' }
l['erg'] = { nom = 'sie' }
l['eri'] = { nom = 'ogea' }
l['erk'] = { nom = 'éfaté du Sud' }
l['ero'] = { nom = 'horpa' }
l['ers'] = { nom = 'ersu' }
l['ert'] = { nom = 'eritai' }
l['es'] = { nom = 'espagnol', portail = true, wiktionnaire = true }
l['ese'] = { nom = 'ese ejja' }
l['esh'] = { nom = 'eshtehardi' }
l['esi'] = { nom = 'inupiaq d’Alaska du Nord' }
l['esk'] = { nom = 'inupiaq d’Alaska du Nord-Ouest' }
l['esl'] = { nom = 'langue des signes égyptienne', tri = 'signes egyptienne' }
l['esm'] = { nom = 'essouma' }
l['esmeraldeño'] = { nom = 'esmeraldeño' }
l['eso'] = { nom = 'langue des signes estonienne', tri = 'signes estonienne' }
l['esq'] = { nom = 'esselen' }
l['ess'] = { nom = 'yupik sibérien central' }
l['esu'] = { nom = 'yupik central' }
l['esx'] = { nom = 'langues eskimo-aléoutes', tri = 'eskimo aleoutes langues' }
l['et'] = { nom = 'estonien', wiktionnaire = true }
l['etb'] = { nom = 'etebi' }
l['etc'] = { nom = 'etchemin' }
l['etn'] = { nom = 'eton (Vanuatu)' }
l['eto'] = { nom = 'eton (bantou)' }
l['etr'] = { nom = 'edolo' }
l['ets'] = { nom = 'yekhee' }
l['ett'] = { nom = 'étrusque' }
l['etu'] = { nom = 'ejagham' }
l['etx'] = { nom = 'eten' }
l['etz'] = { nom = 'semimi' }
l['eu'] = { nom = 'basque', wiktionnaire = true }
l['eudeve'] = { nom = 'eudeve' }
l['euq'] = { nom = 'langues basques', tri = 'basques langues' }
l['eur'] = { nom = 'europanto' }
l['eve'] = { nom = 'évène' }
l['evn'] = { nom = 'evenki' }
l['ewo'] = { nom = 'éwondo' }
l['ext'] = { nom = 'estrémègne' }
l['eya'] = { nom = 'eyak' }
l['eyo'] = { nom = 'keyo' }
l['fa'] = { nom = 'persan', wiktionnaire = true }
l['faa'] = { nom = 'fasu' }
l['fab'] = { nom = 'fá d’Ambô' }
l['fad'] = { nom = 'wagi' }
l['fag'] = { nom = 'finongan' }
l['fai'] = { nom = 'faiwol' }
l['faj'] = { nom = 'faita' }
l['fak'] = { nom = 'fang (Cameroun)' }
l['fam'] = { nom = 'fam' }
l['fan'] = { nom = 'fang' }
l['fap'] = { nom = 'palor' }
l['far'] = { nom = 'fataleka' }
l['fat'] = { nom = 'fanti' }
l['fau'] = { nom = 'fayu' }
l['fax'] = { nom = 'valicien' }
l['fc'] = { nom = 'franc-comtois' }
l['fcs'] = { nom = 'langue des signes québécoise', tri = 'signes quebecoise' }
l['fer'] = { nom = 'feroge' }
l['ff'] = { nom = 'peul' }
l['ffg'] = { nom = 'bohurá' }
l['ffi'] = { nom = 'foia foia' }
l['ffm'] = { nom = 'peul du Maasina', tri = 'peul maasina' }
l['fi'] = { nom = 'finnois', wiktionnaire = true }
l['fia'] = { nom = 'nubien' }
l['fie'] = { nom = 'fyer' }
l['fil'] = { nom = 'filipino' }
l['fingalien'] = { nom = 'fingalien' }
l['fip'] = { nom = 'fipa' }
l['fir'] = { nom = 'firan' }
l['fit'] = { nom = 'finnois tornédalien' }
l['fiu'] = { nom = 'langues finno-ougriennes', tri = 'finno ougriennes langues' }
l['fj'] = { nom = 'fidjien', wiktionnaire = true }
l['fkk'] = { nom = 'kirya-konzel' }
l['fkv'] = { nom = 'kvène' }
l['fla'] = { nom = 'kalispel' }
l['flh'] = { nom = 'foau' }
l['fln'] = { nom = 'flinders island' }
l['flr'] = { nom = 'fuliiru' }
l['fly'] = { nom = 'tsotsitaal' }
l['fmp'] = { nom = 'fe’fe’' }
l['fmu'] = { nom = 'muria occidental lointain' }
l['fo'] = { nom = 'féroïen', wiktionnaire = true }
l['foi'] = { nom = 'foi' }
l['fon'] = { nom = 'fon' }
l['for'] = { nom = 'fore' }
l['fos'] = { nom = 'siraya' }
l['fox'] = { nom = 'langues formosanes', tri = 'formosanes langues' }
l['fpe'] = { nom = 'pichi' }
l['fqs'] = { nom = 'fas' }
l['fr'] = { nom = 'français', portail = true, wiktionnaire = true }
l['francilien'] = { nom = 'francilien' }
l['francique central'] = { nom = 'francique central' }
l['francique méridional'] = { nom = 'francique méridional' }
l['francique mosellan'] = { nom = 'francique mosellan' }
l['francique rhénan'] = { nom = 'francique rhénan' }
l['frc'] = { nom = 'français cadien' }
l['frd'] = { nom = 'fordata' }
l['frk'] = { nom = 'vieux-francique', tri = 'francique vieux' }
l['frm'] = { nom = 'moyen français', tri = 'francais moyen' }
l['fro'] = { nom = 'ancien français', tri = 'francais ancien', portail = true }
l['frp'] = { nom = 'francoprovençal' }
l['frq'] = { nom = 'forak' }
l['frr'] = { nom = 'frison septentrional' }
l['frs'] = { nom = 'bas saxon de Frise orientale', tri = 'saxon bas de frise orientale' }
l['frt'] = { nom = 'fortsenal' }
l['fry'] = { nom = 'frison occidental' }
l['fse'] = { nom = 'langue des signes finnoise', tri = 'signes finnoise' }
l['fsl'] = { nom = 'langue des signes française', tri = 'signes francaise' }
l['fss'] = { nom = 'langue des signes finno-suédoise', tri = 'signes finno suedoise' }
l['fub'] = { nom = 'peul de l’Adamaoua', tri = 'peul adamaoua' }
l['fuc'] = { nom = 'pulaar' }
l['fud'] = { nom = 'futunien' }
l['fue'] = { nom = 'peul du Borgu', tri = 'peul borgu' }
l['fuf'] = { nom = 'pular' }
l['fuh'] = { nom = 'peul du Niger occidental', tri = 'peul niger occidental' }
l['fun'] = { nom = 'fulniô' }
l['fur'] = { nom = 'frioulan' }
l['fut'] = { nom = 'futuna-aniwa' }
l['fuu'] = { nom = 'bagiro' }
l['fuy'] = { nom = 'fuyug' }
l['fvr'] = { nom = 'four' }
l['fwa'] = { nom = 'fwâi' }
l['fwe'] = { nom = 'fwe' }
l['fy'] = { nom = 'frison', wiktionnaire = true }
l['ga'] = { nom = 'gaélique irlandais', wiktionnaire = true }
l['gaa'] = { nom = 'ga' }
l['gab'] = { nom = 'gabri' }
l['gac'] = { nom = 'grand andamanais' }
l['gad'] = { nom = 'gaddang' }
l['gae'] = { nom = 'guarequena' }
l['gaf'] = { nom = 'gende' }
l['gag'] = { nom = 'gagaouze' }
l['gah'] = { nom = 'alekano' }
l['gai'] = { nom = 'borei' }
l['gaj'] = { nom = 'gadsup' }
l['gal'] = { nom = 'galoli' }
l['galaïco-portugais'] = { nom = 'galaïco-portugais' }
l['gallo'] = { nom = 'gallo' }
l['gallo-italique de Sicile'] = { nom = 'gallo-italique de Sicile' }
l['gan'] = { nom = 'gan' }
l['gao'] = { nom = 'gants' }
l['gao de Dongkou'] = { nom = 'gao de Dongkou' }
l['gap'] = { nom = 'gal' }
l['gaq'] = { nom = 'gta’' }
l['gar'] = { nom = 'galeya' }
l['gas'] = { nom = 'garasia des Adiwasi' }
l['gat'] = { nom = 'kenati' }
l['gau'] = { nom = 'gadaba mudhili' }
l['gaulois'] = { nom = 'gaulois' }
l['gaw'] = { nom = 'nobonob' }
l['gax'] = { nom = 'borana' }
l['gay'] = { nom = 'gayo' }
l['gaz'] = { nom = 'oromo central de l’Ouest' }
l['gba'] = { nom = 'gbaya' }
l['gbb'] = { nom = 'kaytetye' }
l['gbe'] = { nom = 'niksek' }
l['gbf'] = { nom = 'gaikundi' }
l['gbg'] = { nom = 'gbanziri' }
l['gbi'] = { nom = 'galela' }
l['gbj'] = { nom = 'gutob' }
l['gbn'] = { nom = 'mo’da' }
l['gbp'] = { nom = 'gbaya de Bossangoa', tri = 'gbaya Bossangoa' }
l['gbq'] = { nom = 'gbaya bozom' }
l['gbr'] = { nom = 'gbagyi' }
l['gbu'] = { nom = 'gaagudju' }
l['gbv'] = { nom = 'gbanu' }
l['gby'] = { nom = 'gbari' }
l['gbz'] = { nom = 'dari iranien' }
l['gcc'] = { nom = 'mali' }
l['gcd'] = { nom = 'ganggalida' }
l['gce'] = { nom = 'galice' }
l['gcf-mq'] = { nom = 'créole martiniquais' }
l['gcl'] = { nom = 'créole grenadais' }
l['gcr'] = { nom = 'créole guyanais' }
l['gct'] = { nom = 'alemán coloniero' }
l['gd'] = { nom = 'gaélique écossais', wiktionnaire = true }
l['gdc'] = { nom = 'gugu badhun' }
l['gdd'] = { nom = 'gedaged' }
l['gde'] = { nom = 'gude' }
l['gdf'] = { nom = 'guduf-gava' }
l['gdg'] = { nom = 'ga’dang' }
l['gdl'] = { nom = 'dirasha' }
l['gdm'] = { nom = 'laal' }
l['gdo'] = { nom = 'godoberi' }
l['gdq'] = { nom = 'méhri' }
l['gdr'] = { nom = 'wipi' }
l['gds'] = { nom = 'langue des signes de Ghandruk', tri = 'signes ghandruk' }
l['gea'] = { nom = 'geruma' }
l['geb'] = { nom = 'kire' }
l['geg'] = { nom = 'gengle' }
l['geh'] = { nom = 'allemand huttérite' }
l['gej'] = { nom = 'mina (Togo)' }
l['gek'] = { nom = 'ywom' }
l['gel'] = { nom = 'ut-ma’in' }
l['gelao blanc de Diyingshao'] = { nom = 'gelao blanc de Diyingshao' }
l['gelao blanc de Judu'] = { nom = 'gelao blanc de Judu' }
l['gelao blanc de Moji'] = { nom = 'gelao blanc de Moji' }
l['gelao blanc de Niupo'] = { nom = 'gelao blanc de Niupo' }
l['gelao blanc de Pudi'] = { nom = 'gelao blanc de Pudi' }
l['gelao blanc de Wantao'] = { nom = 'gelao blanc de Wantao' }
l['gelao blanc de Yueliangwan'] = { nom = 'gelao blanc de Yueliangwan' }
l['gelao rouge de Fanpo'] = { nom = 'gelao rouge de Fanpo' }
l['gelao rouge de Longjia'] = { nom = 'gelao rouge de Longjia' }
l['gelao rouge de Na Khê'] = { nom = 'gelao rouge de Na Khê' }
l['gelao vert de Liangshui'] = { nom = 'gelao vert de Liangshui' }
l['gelao vert de Qinglong'] = { nom = 'gelao vert de Qinglong' }
l['gelao vert de Sanchong'] = { nom = 'gelao vert de Sanchong' }
l['gelao vert de Zhenfeng'] = { nom = 'gelao vert de Zhenfeng' }
l['gem'] = { nom = 'langues germaniques', tri = 'germaniques langues' }
l['gépide'] = { nom = 'gépide' }
l['ges'] = { nom = 'geser-gorom' }
l['gète'] = { nom = 'gète' }
l['gev'] = { nom = 'geviya' }
l['gew'] = { nom = 'gera' }
l['gex'] = { nom = 'garre' }
l['gey'] = { nom = 'enya' }
l['gez'] = { nom = 'guèze' }
l['gfk'] = { nom = 'patpatar' }
l['gft'] = { nom = 'gafat' }
l['gga'] = { nom = 'gao' }
l['ggb'] = { nom = 'gbii' }
l['ggd'] = { nom = 'gugadj' }
l['gge'] = { nom = 'gurr-goni' }
l['ggl'] = { nom = 'ganglau' }
l['ggo'] = { nom = 'gondî du Sud' }
l['ggt'] = { nom = 'gitua' }
l['ggu'] = { nom = 'gagou' }
l['gha'] = { nom = 'ghadamès' }
l['ghl'] = { nom = 'ghulfan' }
l['gho'] = { nom = 'ghomari' }
l['ghs'] = { nom = 'guhu-samane' }
l['gia'] = { nom = 'kija' }
l['gid'] = { nom = 'gidar' }
l['gie'] = { nom = 'gabogbo' }
l['gil'] = { nom = 'gilbertin' }
l['gim'] = { nom = 'gimi' }
l['gin'] = { nom = 'hinukh' }
l['gio'] = { nom = 'gelao' }
l['gip'] = { nom = 'gimi (Nouvelle-Bretagne occidentale)' }
l['giq'] = { nom = 'gelao vert' }
l['gir'] = { nom = 'gelao rouge' }
l['girirra'] = { nom = 'girirra' }
l['git'] = { nom = 'gitxsan' }
l['giu'] = { nom = 'mulao' }
l['giw'] = { nom = 'gelao blanc' }
l['gix'] = { nom = 'gilima' }
l['giz'] = { nom = 'giziga du Sud' }
l['gji'] = { nom = 'geji' }
l['gjn'] = { nom = 'gonja' }
l['gju'] = { nom = 'gujari' }
l['gkm'] = { nom = 'grec byzantin' }
l['gkn'] = { nom = 'gokana' }
l['gkp'] = { nom = 'kpellé de Guinée', tri = 'kpelle Guinee' }
l['gku'] = { nom = 'ǂungkue' }
l['gl'] = { nom = 'galicien', wiktionnaire = true }
l['glc'] = { nom = 'bon goula' }
l['gld'] = { nom = 'nanaï' }
l['glk'] = { nom = 'gilaki' }
l['gll'] = { nom = 'garlali' }
l['glo'] = { nom = 'galambu' }
l['glu'] = { nom = 'gula (Tchad)' }
l['glw'] = { nom = 'glavda' }
l['gme'] = { nom = 'langues germaniques orientales', tri = 'germaniques orientales langues' }
l['gmh'] = { nom = 'moyen haut-allemand', tri = 'allemand haut moyen' }
l['gml'] = { nom = 'moyen bas allemand', tri = 'allemand bas moyen' }
l['gmm'] = { nom = 'gbaya-mbodomo' }
l['gmo'] = { nom = 'gamo-gofa-dawro' }
l['gmq'] = { nom = 'langues germaniques septentrionales', tri = 'germaniques septentrionales langues' }
l['gmu'] = { nom = 'gumalu' }
l['gmv'] = { nom = 'gamo' }
l['gmw'] = { nom = 'langues germaniques occidentales', tri = 'germaniques occidentales langues' }
l['gmx'] = { nom = 'magoma' }
l['gmy'] = { nom = 'mycénien' }
l['gn'] = { nom = 'guarani', wiktionnaire = true }
l['gna'] = { nom = 'kaansa' }
l['gnb'] = { nom = 'gangte' }
l['gnc'] = { nom = 'guanche' }
l['gnd'] = { nom = 'zulgo-gemzek' }
l['gne'] = { nom = 'ganang' }
l['gng'] = { nom = 'ngangam' }
l['gni'] = { nom = 'gooniyandi' }
l['gnk'] = { nom = 'gǁana' }
l['gnn'] = { nom = 'gumatj' }
l['gno'] = { nom = 'gondî du Nord' }
l['gnq'] = { nom = 'gana' }
l['gnu'] = { nom = 'gnau' }
l['gnw'] = { nom = 'guaraní de Bolivie occidental' }
l['goa'] = { nom = 'gouro' }
l['gob'] = { nom = 'playero' }
l['god'] = { nom = 'godié' }
l['goe'] = { nom = 'gongduk' }
l['gof'] = { nom = 'gofa' }
l['gog'] = { nom = 'gogo' }
l['goh'] = { nom = 'vieux haut allemand', tri = 'allemand haut vieux' }
l['goi'] = { nom = 'gobasi' }
l['goj'] = { nom = 'gowlan' }
l['gokhy'] = { nom = 'gokhy' }
l['gol'] = { nom = 'gola' }
l['gom'] = { nom = 'konkani de Goa', wiktionnaire = true }
l['gon'] = { nom = 'gond' }
l['goo'] = { nom = 'gone dau' }
l['gop'] = { nom = 'yeretuar' }
l['gor'] = { nom = 'gorontalo' }
l['gos'] = { nom = 'groningois' }
l['got'] = { nom = 'gotique' }
l['gotique de Crimée'] = { nom = 'gotique de Crimée' }
l['gottscheerish'] = { nom = 'gottscheerish' }
l['gou'] = { nom = 'gavar' }
l['goy'] = { nom = 'goundo' }
l['gpa'] = { nom = 'gupa-abawa' }
l['gpe'] = { nom = 'pidgin anglais ghanéen' }
l['gqa'] = { nom = 'ga’anda' }
l['gqi'] = { nom = 'guiqiong' }
l['gqn'] = { nom = 'kinikinao' }
l['gqr'] = { nom = 'gor' }
l['gqu'] = { nom = 'gao de Wanzi' }
l['gra'] = { nom = 'rajput garasia' }
l['grb'] = { nom = 'grébo' }
l['grc'] = { nom = 'grec ancien', portail = true }
l['grd'] = { nom = 'guruntum' }
l['grec cargésien'] = { nom = 'grec cargésien' }
l['grg'] = { nom = 'madi' }
l['grh'] = { nom = 'gbiri-niragu' }
l['gri'] = { nom = 'ghari' }
l['griko'] = { nom = 'griko' }
l['grk'] = { nom = 'langues grecques', tri = 'grecques langues' }
l['gro'] = { nom = 'groma' }
l['grr'] = { nom = 'taznatit' }
l['grs'] = { nom = 'gresi' }
l['grt'] = { nom = 'garo' }
l['gru'] = { nom = 'kistane' }
l['grz'] = { nom = 'guramalum' }
l['gserpa'] = { nom = 'gserpa' }
l['gsg'] = { nom = 'langue des signes allemande', tri = 'signes allemande' }
l['gsl'] = { nom = 'gusilay' }
l['gsm'] = { nom = 'langue des signes guatémaltèque', tri = 'signes guatemalteque' }
l['gso'] = { nom = 'gbaya du Sud-Ouest', tri = 'gbaya sud ouest' }
l['gsw'] = { nom = 'alémanique', wmlien = 'als' }
l['gsw-fr'] = { nom = 'alémanique alsacien' }
l['gta'] = { nom = 'guató' }
l['gti'] = { nom = 'gbati-ri' }
l['gu'] = { nom = 'gujarati', wiktionnaire = true }
l['gub'] = { nom = 'guajajára' }
l['guc'] = { nom = 'guajiro' }
l['gud'] = { nom = 'dida de Yocoboué' }
l['gudjal'] = { nom = 'gudjal' }
l['gue'] = { nom = 'gurinji' }
l['güenoa'] = { nom = 'güenoa' }
l['guf'] = { nom = 'gupapuyngu' }
l['gug'] = { nom = 'guarani paraguayen' } -- aussi nhd
l['guh'] = { nom = 'guahibo' }
l['gui'] = { nom = 'chiriguano' }
l['guk'] = { nom = 'gumuz' }
l['gul'] = { nom = 'gullah' }
l['gum'] = { nom = 'guambiano' }
l['gumuz du Sud'] = { nom = 'gumuz du Sud' }
l['gun'] = { nom = 'mbyá' }
l['guo'] = { nom = 'guayabero' }
l['gup'] = { nom = 'gunwinggu' }
l['guq'] = { nom = 'guayakí' }
l['gur'] = { nom = 'gurenne' }
l['gus'] = { nom = 'langue des signes guinéenne', tri = 'signes guineenne' }
l['gut'] = { nom = 'maleku' }
l['gutnisk'] = { nom = 'gutnisk' }
l['guu'] = { nom = 'yanomamö' }
l['guw'] = { nom = 'gungbe', wiktionnaire = true }
l['gux'] = { nom = 'gourmanchéma' }
l['guz'] = { nom = 'gusii' }
l['gv'] = { nom = 'mannois', wiktionnaire = true }
l['gva'] = { nom = 'guaná' }
l['gvc'] = { nom = 'wanano' }
l['gve'] = { nom = 'duwet' }
l['gvf'] = { nom = 'golin' }
l['gvj'] = { nom = 'guaja' }
l['gvl'] = { nom = 'gulay' }
l['gvn'] = { nom = 'kuku-yalanji' }
l['gvo'] = { nom = 'gavião do Jiparaná' }
l['gvp'] = { nom = 'parkatejê' }
l['gvy'] = { nom = 'guyani' }
l['gwara'] = { nom = 'gwara' }
l['gwc'] = { nom = 'kohistani de Kalam' }
l['gwd'] = { nom = 'gawwada' }
l['gwe'] = { nom = 'gweno' }
l['gwi'] = { nom = 'gwich’in' }
l['gwj'] = { nom = 'gǀui', tri = 'gui' }
l['gwn'] = { nom = 'gwandara' }
l['gwr'] = { nom = 'gwere' }
l['gwt'] = { nom = 'gawar-bati' }
l['gwu'] = { nom = 'guwamu' }
l['gwx'] = { nom = 'gua' }
l['gya'] = { nom = 'gbaya du Nord-Ouest', tri = 'gbaya nord ouest' }
l['gyb'] = { nom = 'garus' }
l['gyd'] = { nom = 'kayardild' }
l['gyg'] = { nom = 'gbayi' }
l['gyl'] = { nom = 'gayil' }
l['gym'] = { nom = 'guaymí' }
l['gyo'] = { nom = 'gyalsumdo' }
l['gyr'] = { nom = 'guarayo' }
l['gyy'] = { nom = 'gunya' }
l['gza'] = { nom = 'ganza' }
l['gzi'] = { nom = 'gazi' }
l['ha'] = { nom = 'haoussa', wiktionnaire = true }
l['ha em'] = { nom = 'ha em' }
l['haa'] = { nom = 'han' }
l['hab'] = { nom = 'langue des signes de Hanoï', tri = 'signes hanoi' }
l['hac'] = { nom = 'gurani' }
l['had'] = { nom = 'hatam' }
l['hag'] = { nom = 'hanga' }
l['hai'] = { nom = 'haïda' }
l['hak'] = { nom = 'hakka' }
l['hal'] = { nom = 'halang' }
l['ham'] = { nom = 'hewa' }
l['han'] = { nom = 'hangaza' }
l['haq'] = { nom = 'ha' }
l['har'] = { nom = 'harari' }
l['has'] = { nom = 'haisla' }
l['hav'] = { nom = 'havu' }
l['haw'] = { nom = 'hawaïen' }
l['hax'] = { nom = 'haïda du Sud' }
l['hay'] = { nom = 'haya' }
l['haz'] = { nom = 'hazara' }
l['hbn'] = { nom = 'heiban' }
l['hbo'] = { nom = 'hébreu ancien' }
l['hch'] = { nom = 'huichol' }
l['hdn'] = { nom = 'haïda du Nord' }
l['hdy'] = { nom = 'hadiyya' }
l['he'] = { nom = 'hébreu', wiktionnaire = true }
l['hea'] = { nom = 'hmu du Nord' }
l['hed'] = { nom = 'herdé' }
l['heh'] = { nom = 'hehe' }
l['hei'] = { nom = 'heiltsuk' }
l['hem'] = { nom = 'hemba' }
l['hgm'] = { nom = 'haiǁom' }
l['hhi'] = { nom = 'hoia hoia de Ukusi-Koparamio' }
l['hhr'] = { nom = 'keerak' }
l['hhy'] = { nom = 'hoia hoia de Matakaia' }
l['hi'] = { nom = 'hindi', wiktionnaire = true }
l['hia'] = { nom = 'lamang' }
l['hib'] = { nom = 'hibito' }
l['hid'] = { nom = 'hidatsa' }
l['hif'] = { nom = 'hindi des Fidji', wiktionnaire = true }
l['hig'] = { nom = 'kamwe' }
l['hik'] = { nom = 'seit-kaitetu' }
l['hil'] = { nom = 'hiligaynon' }
l['him'] = { nom = 'himachali' }
l['hio'] = { nom = 'tsoa' }
l['hit'] = { nom = 'hittite' }
l['hiw'] = { nom = 'hiw' }
l['hix'] = { nom = 'hixkaryana' }
l['hka'] = { nom = 'kahé' }
l['hke'] = { nom = 'hunde' }
l['hkk'] = { nom = 'hunjara-kaina ke' }
l['hla'] = { nom = 'halia' }
l['hlb'] = { nom = 'halbi' }
l['hlu'] = { nom = 'louvite hiéroglyphique' }
l['hma'] = { nom = 'miao mashan du Sud', tri = 'miao mashan sud' }
l['hmb'] = { nom = 'songhaï humburi senni' }
l['hmd'] = { nom = 'miao de Diandongbei', tri = 'miao diandongbei' }
l['hme'] = { nom = 'hmong de Huishui de l’Est' }
l['hmi'] = { nom = 'miao du Nord de Huishui', tri = 'miao huishi nord' }
l['hmj'] = { nom = 'gejia' }
l['hml'] = { nom = 'miao de Luobohe', tri = 'miao luobohe' }
l['hmm'] = { nom = 'miao mashan central' }
l['hmn'] = { nom = 'hmong' }
l['hmr'] = { nom = 'hmar' }
l['hms'] = { nom = 'miao du Qiandong du Sud', tri = 'miao qiandong sud' }
l['hmt'] = { nom = 'hamtai' }
l['hmu'] = { nom = 'hamap' }
l['hmv'] = { nom = 'hmong dô' }
l['hmx'] = { nom = 'langues hmong-mien', tri = 'hmong mien langues' }
l['hna'] = { nom = 'mina' }
l['hnd'] = { nom = 'hindko du Sud' }
l['hnh'] = { nom = 'handa-khwe' }
l['hni'] = { nom = 'hani' }
l['hnj'] = { nom = 'hmong vert' }
l['hnn'] = { nom = 'hanunóo' }
l['hno'] = { nom = 'hindko du Nord' }
l['hnu'] = { nom = 'pong' }
l['ho'] = { nom = 'hiri motou' }
l['hoa'] = { nom = 'hoava' }
l['hoanya'] = { nom = 'hoanya' }
l['hob'] = { nom = 'mari (Madang)' }
l['hoc'] = { nom = 'ho' }
l['hod'] = { nom = 'holma' }
l['hoe'] = { nom = 'horom' }
l['hoh'] = { nom = 'hobyot' }
l['hoi'] = { nom = 'holikachuk' }
l['hok'] = { nom = 'langues hokanes', tri = 'hokanes langues' }
l['hol'] = { nom = 'holu' }
l['hom'] = { nom = 'homa' }
l['hoo'] = { nom = 'holoholo' }
l['hop'] = { nom = 'hopi' }
l['hor'] = { nom = 'horo' }
l['hot'] = { nom = 'hote' }
l['houma'] = { nom = 'houma' }
l['hov'] = { nom = 'hovongan' }
l['how'] = { nom = 'honi' }
l['hoy'] = { nom = 'holiya' }
l['hoz'] = { nom = 'hozo' }
l['hr'] = { nom = 'croate', wiktionnaire = true }
l['hra'] = { nom = 'hrangkhol' }
l['hre'] = { nom = 'hrê' }
l['hrk'] = { nom = 'haruku' }
l['hro'] = { nom = 'haroi' }
l['hrt'] = { nom = 'hertevin' }
l['hru'] = { nom = 'hruso' }
l['hrx'] = { nom = 'hunsrik' }
l['hsb'] = { nom = 'haut-sorabe', tri = 'sorabe haut', wiktionnaire = true }
l['hsn'] = { nom = 'xiang' }
l['hss'] = { nom = 'harsusi' }
l['ht'] = { nom = 'créole haïtien' }
l['hto'] = { nom = 'witoto mɨnɨca' }
l['hts'] = { nom = 'hadza' }
l['htu'] = { nom = 'hitu' }
l['hu'] = { nom = 'hongrois', wiktionnaire = true }
l['hub'] = { nom = 'huambisa' }
l['huc'] = { nom = 'ǂhoan', tri = 'hoan' }
l['hue'] = { nom = 'huave de San Francisco del Mar' }
l['hug'] = { nom = 'huachipaeri' }
l['huh'] = { nom = 'huilliche' }
l['hui'] = { nom = 'huli' }
l['hum'] = { nom = 'hungana' }
l['huo'] = { nom = 'hu' }
l['hup'] = { nom = 'hupa' }
l['huq'] = { nom = 'tsat' }
l['hur'] = { nom = 'halkomelem' }
l['hus'] = { nom = 'huastèque' }
l['hut'] = { nom = 'humla' }
l['huu'] = { nom = 'witoto murui' }
l['huv'] = { nom = 'huave de San Mateo del Mar' }
l['huw'] = { nom = 'hukumina' }
l['hux'] = { nom = 'witoto nɨpode' }
l['huy'] = { nom = 'hulaulá' }
l['huz'] = { nom = 'hunzib' }
l['hva'] = { nom = 'huastèque de San Luís Potosí' }
l['hvk'] = { nom = 'haveke' }
l['hvn'] = { nom = 'hawu' }
l['hwc'] = { nom = 'créole hawaïen' }
l['hy'] = { nom = 'arménien', wiktionnaire = true }
l['hyx'] = { nom = 'langues arméniennes', tri = 'armeniennes langues' }
l['hz'] = { nom = 'héréro' }
l['ia'] = { nom = 'interlingua', wiktionnaire = true }
l['iai'] = { nom = 'iaai' }
l['ian'] = { nom = 'iatmul' }
l['iar'] = { nom = 'purari' }
l['iba'] = { nom = 'iban' }
l['ibb'] = { nom = 'ibibio' }
l['ibd'] = { nom = 'iwaidja' }
l['ibe'] = { nom = 'akpès' }
l['ibg'] = { nom = 'ibanag' }
l['ibh'] = { nom = 'bih' }
l['ibl'] = { nom = 'ibaloi' }
l['ibm'] = { nom = 'agoi' }
l['ibn'] = { nom = 'ibino' }
l['ibr'] = { nom = 'ibuoro' }
l['iby'] = { nom = 'ibani' }
l['ich'] = { nom = 'etkywan' }
l['icl'] = { nom = 'langue des signes islandaise', tri = 'signes islandaise' }
l['id'] = { nom = 'indonésien', portail = true, wiktionnaire = true }
l['ida'] = { nom = 'luidakho-luisukha-lutirichi' }
l['idb'] = { nom = 'créole indo-portugais' }
l['ide'] = { nom = 'idere' }
l['idi'] = { nom = 'idi' }
l['idu'] = { nom = 'idoma' }
l['ie'] = { nom = 'interlingue', wiktionnaire = true }
l['ifa'] = { nom = 'ifugao d’Amganad' }
l['iff'] = { nom = 'ifo' }
l['ifk'] = { nom = 'ifugao de Tuwali' }
l['ify'] = { nom = 'keley-i kallahan' }
l['ig'] = { nom = 'igbo', wiktionnaire = true }
l['igb'] = { nom = 'ébira', tri = 'ebira' }
l['ige'] = { nom = 'igede' }
l['igl'] = { nom = 'igala' }
l['ign'] = { nom = 'ignaciano' }
l['igo'] = { nom = 'isebe' }
l['igs'] = { nom = 'interglossa' }
l['igs-gls'] = { nom = 'glosa' }
l['ihp'] = { nom = 'iha' }
l['ii'] = { nom = 'yi' }
l['iii'] = { nom = 'yi nuosu' }
l['iir'] = { nom = 'langues indo-iraniennes', tri = 'indo iraniennes langues' }
l['ijc'] = { nom = 'izon' }
l['ije'] = { nom = 'biseni' }
l['ijn'] = { nom = 'kalabari' }
l['ijo'] = { nom = 'langues ijos', tri = 'ijos langues' }
l['ijs'] = { nom = 'ijo du Sud-Est' }
l['ik'] = { nom = 'inupiaq', wiktionnaire = true }
l['ike'] = { nom = 'inuttitut' }
l['iki'] = { nom = 'iko' }
l['iko'] = { nom = 'olulumo-ikom' }
l['ikt'] = { nom = 'inuinnaqtun' }
l['ikw'] = { nom = 'ikwere' }
l['ikx'] = { nom = 'ik' }
l['ikz'] = { nom = 'ikizu' }
l['ila'] = { nom = 'ile ape' }
l['ilb'] = { nom = 'ila' }
l['ili'] = { nom = 'ili turki' }
l['ill'] = { nom = 'iranun' }
l['ilo'] = { nom = 'ilocano' }
l['ilu'] = { nom = 'ili’uun' }
l['ilv'] = { nom = 'ilue' }
l['ilw'] = { nom = 'talur' }
l['ima'] = { nom = 'malasar de Mala' }
l['ime'] = { nom = 'imeraguen' }
l['iml'] = { nom = 'miluk' }
l['imn'] = { nom = 'imonda' }
l['imo'] = { nom = 'imbongu' }
l['imr'] = { nom = 'imroing' }
l['ims'] = { nom = 'marse' }
l['imy'] = { nom = 'milyen' }
l['inb'] = { nom = 'inga' }
l['inc'] = { nom = 'langues indo-aryennes', tri = 'indo aryennes langues' }
l['indanga'] = { nom = 'indanga' }
l['ine'] = { nom = 'langues indo-européennes', tri = 'indo europeennes langues' }
l['ing'] = { nom = 'deg hit’an' }
l['inh'] = { nom = 'ingouche' }
l['inj'] = { nom = 'inga de la jungle' }
l['inn'] = { nom = 'isinai' }
l['ino'] = { nom = 'inoke-yate' }
l['inp'] = { nom = 'iñapari' }
l['ins'] = { nom = 'langue des signes indienne', tri = 'signes indienne' }
l['int'] = { nom = 'intha' }
l['inz'] = { nom = 'ineseño' }
l['io'] = { nom = 'ido', wiktionnaire = true }
l['ior'] = { nom = 'inor' }
l['iow'] = { nom = 'iowa-oto' }
l['ipi'] = { nom = 'ipili' }
l['ipo'] = { nom = 'ipiko' }
l['iqu'] = { nom = 'iquito' }
l['ira'] = { nom = 'langues iraniennes', tri = 'iraniennes langues' }
l['ire'] = { nom = 'iresim' }
l['irh'] = { nom = 'irarutu' }
l['iri'] = { nom = 'irigwe' }
l['irk'] = { nom = 'iraqw' }
l['irn'] = { nom = 'irántxe' }
l['iro'] = { nom = 'langues iroquoiennes', tri = 'iroquoiennes langues' }
l['irr'] = { nom = 'ir' }
l['iru'] = { nom = 'irula' }
l['irx'] = { nom = 'kamberau' }
l['is'] = { nom = 'islandais', wiktionnaire = true }
l['isa'] = { nom = 'isabi' }
l['isc'] = { nom = 'isconahua' }
l['isd'] = { nom = 'isnag' }
l['ise'] = { nom = 'langue des signes italienne', tri = 'signes italienne' }
l['isg'] = { nom = 'langue des signes irlandaise', tri = 'signes irlandaise' }
l['ish'] = { nom = 'esan' }
l['isi'] = { nom = 'nkem-nkum' }
l['isk'] = { nom = 'ishkashimi' }
l['ism'] = { nom = 'masimasi' }
l['isn'] = { nom = 'isanzu' }
l['iso'] = { nom = 'isoko' }
l['isr'] = { nom = 'langue des signes israélienne', tri = 'signes israélienne' }
l['ist'] = { nom = 'istriote' }
l['isu'] = { nom = 'isu (Menchum)' }
l['it'] = { nom = 'italien', portail = true, wiktionnaire = true }
l['itb'] = { nom = 'itneg de Binongan', tri = 'itneg binongan' }
l['itc'] = { nom = 'langues italiques', tri = 'italiques langues' }
l['ite'] = { nom = 'itenez' }
l['itl'] = { nom = 'itelmène' }
l['itm'] = { nom = 'itu mbon uzo' }
l['ito'] = { nom = 'itonama' }
l['its'] = { nom = 'isekiri' }
l['itt'] = { nom = 'itneg des Maeng', tri = 'itneg maeng' }
l['itv'] = { nom = 'itawit' }
l['itw'] = { nom = 'ito' }
l['itx'] = { nom = 'itik' }
l['ity'] = { nom = 'itneg du Moyadan', tri = 'itneg moyadan' }
l['itz'] = { nom = 'itzá' }
l['iu'] = { nom = 'inuktitut', wiktionnaire = true }
l['ium'] = { nom = 'iu mien' }
l['ivb'] = { nom = 'ibatan' }
l['ivv'] = { nom = 'ivatan' }
l['iwm'] = { nom = 'iwam' }
l['iwo'] = { nom = 'iwur' }
l['iws'] = { nom = 'sepik iwam' }
l['ixc'] = { nom = 'ixcatèque' }
l['ixl'] = { nom = 'ixil' }
l['iyo'] = { nom = 'mesaka' }
l['izh'] = { nom = 'ingrien' }
l['izr'] = { nom = 'izere' }
l['ja'] = { nom = 'japonais', portail = true, wiktionnaire = true }
l['ja-kun'] = { nom = 'kun’yomi' }
l['ja-on'] = { nom = 'on’yomi' }
l['japhug'] = { nom = 'japhug' }
l['jaa'] = { nom = 'jamamadí' }
l['jab'] = { nom = 'hyam' }
l['jac'] = { nom = 'jacaltèque' }
l['jae'] = { nom = 'yabem' }
l['jah'] = { nom = 'jah hut' }
l['jak'] = { nom = 'jakun' }
l['jal'] = { nom = 'fatamanue' }
l['jam'] = { nom = 'créole jamaïcain' }
l['jan'] = { nom = 'jandai' }
l['jao'] = { nom = 'yanyuwa' }
l['jaq'] = { nom = 'yaqay' }
l['jas'] = { nom = 'javanais de Nouvelle-Calédonie' }
l['jau'] = { nom = 'yaur' }
l['jaz'] = { nom = 'jawe' }
l['jbk'] = { nom = 'barikewa' }
l['jbn'] = { nom = 'nafusi' }
l['jbo'] = { nom = 'lojban', wiktionnaire = true }
l['jbt'] = { nom = 'djeoromitxi' }
l['jbw'] = { nom = 'mouwase' }
l['jct'] = { nom = 'krymchak' }
l['jdt'] = { nom = 'juhuri' }
l['jeb'] = { nom = 'jebero' }
l['jedek'] = { nom = 'jedek' }
l['jeg'] = { nom = 'jeng' }
l['jeh'] = { nom = 'jeh' }
l['jei'] = { nom = 'yei' }
l['jek'] = { nom = 'jeri kuo' }
l['jel'] = { nom = 'yelmek' }
l['jen'] = { nom = 'dza' }
l['jet'] = { nom = 'manem' }
l['jeu'] = { nom = 'djongor de Bourmataguil' }
l['jge'] = { nom = 'judéo-géorgien' }
l['jgk'] = { nom = 'gwak' }
l['jgo'] = { nom = 'ngomba' }
l['jhi'] = { nom = 'jehai' }
l['jia'] = { nom = 'jina' }
l['jib'] = { nom = 'jibu' }
l['jic'] = { nom = 'jicaque de la Flor' }
l['jicaque d’El Palmar'] = { nom = 'jicaque d’El Palmar' }
l['jid'] = { nom = 'bu' }
l['jig'] = { nom = 'djingili' }
l['jih'] = { nom = 'shangzhai' }
l['jil'] = { nom = 'jilim' }
l['jim'] = { nom = 'jimi (Cameroun)' }
l['jio'] = { nom = 'jiamao' }
l['jiq'] = { nom = 'lavrung' }
l['jit'] = { nom = 'jita' }
l['jiu'] = { nom = 'jinuo de Youle' }
l['jiv'] = { nom = 'shuar' }
l['jiv-pal'] = { nom = 'palta' }
l['jiy'] = { nom = 'jinuo de Buyuan' }
l['jjr'] = { nom = 'bankal' }
l['jka'] = { nom = 'kaera' }
l['jko'] = { nom = 'kubo' }
l['jkr'] = { nom = 'koro (Inde)' }
l['jku'] = { nom = 'labir' }
l['jle'] = { nom = 'ngile' }
l['jmc'] = { nom = 'machame' }
l['jms'] = { nom = 'mashi (Nigeria)' }
l['jnj'] = { nom = 'yemsa' }
l['job'] = { nom = 'joba' }
l['jor'] = { nom = 'jora' }
l['jos'] = { nom = 'langue des signes jordanienne', tri = 'signes jordanienne' }
l['jow'] = { nom = 'jowulu' }
l['jpr'] = { nom = 'judéo-persan' }
l['jpx'] = { nom = 'langues japonaises', tri = 'japonaises langues' }
l['jra'] = { nom = 'jaraï' }
l['jrb'] = { nom = 'judéo-arabe' }
l['jua'] = { nom = 'júma' }
l['juc'] = { nom = 'jurchen' }
l['juh'] = { nom = 'hõne' }
l['jui'] = { nom = 'ngadjuri' }
l['jum'] = { nom = 'jumjum' }
l['jun'] = { nom = 'juang' }
l['jup'] = { nom = 'hupda' }
l['jur'] = { nom = 'juruna' }
l['jus'] = { nom = 'langue des signes de Jumla', tri = 'signes jumla' }
l['jut'] = { nom = 'jute' }
l['juy'] = { nom = 'juray' }
l['jv'] = { nom = 'javanais', wiktionnaire = true }
l['jvn'] = { nom = 'javanais des Caraïbes' }
l['jya'] = { nom = 'rgyalrong' }
l['ka'] = { nom = 'géorgien', wiktionnaire = true }
l['kaa'] = { nom = 'karakalpak' }
l['kab'] = { nom = 'kabyle' }
l['kac'] = { nom = 'kachin' }
l['kae'] = { nom = 'ketangalan' }
l['kaera'] = { nom = 'kaera' }
l['kaf'] = { nom = 'katso' }
l['kah'] = { nom = 'fer' }
l['kai'] = { nom = 'karekare' }
l['kaj'] = { nom = 'jju' }
l['kak'] = { nom = 'ahin-kayapa kalanguya' }
l['kakán'] = { nom = 'kakán' }
l['kalis'] = { nom = 'kalis' }
l['kam'] = { nom = 'kamba' }
l['kao'] = { nom = 'khassonké' }
l['kap'] = { nom = 'bezhta' }
l['kaq'] = { nom = 'capanahua' }
l['kar'] = { nom = 'langues karènes', tri = 'karenes langues' }
l['kathlamet'] = { nom = 'kathlamet' }
l['kaw'] = { nom = 'kawi' }
l['kax'] = { nom = 'kao' }
l['kay'] = { nom = 'kamayura' }
l['kbb'] = { nom = 'kashuyana' }
l['kbc'] = { nom = 'kadiwéu' }
l['kbd'] = { nom = 'kabarde', wiktionnaire = true }
l['kbh'] = { nom = 'camsá' }
l['kbj'] = { nom = 'kari' }
l['kbk'] = { nom = 'koiari grass' }
l['kbl'] = { nom = 'kanembou' }
l['kbn'] = { nom = 'kare (République centrafricaine)' }
l['kbo'] = { nom = 'keliko' }
l['kbp'] = { nom = 'kabiyè' }
l['kbq'] = { nom = 'kamano' }
l['kbs'] = { nom = 'kande' }
l['kbt'] = { nom = 'abadi' }
l['kbv'] = { nom = 'dera' }
l['kbw'] = { nom = 'kaiep' }
l['kby'] = { nom = 'kanuri de Manga' }
l['kbz'] = { nom = 'duhwa' }
l['kca'] = { nom = 'khanty' }
l['kcb'] = { nom = 'kawacha' }
l['kcg'] = { nom = 'tyap', wiktionnaire = true }
l['kck'] = { nom = 'kalanga' }
l['kcl'] = { nom = 'kala' }
l['kcm'] = { nom = 'gula (République centrafricaine)', tri = 'gula centrafrique' }
l['kcn'] = { nom = 'nubi' }
l['kco'] = { nom = 'kinalakna' }
l['kcp'] = { nom = 'kanga' }
l['kcs'] = { nom = 'koenoem' }
l['kcu'] = { nom = 'kami (Tanzanie)' }
l['kcv'] = { nom = 'kete' }
l['kcx'] = { nom = 'kachama-ganjule' }
l['kcy'] = { nom = 'korandjé' }
l['kcz'] = { nom = 'konongo' }
l['kda'] = { nom = 'gathang' }
l['kdd'] = { nom = 'yankunytjatjara' }
l['kde'] = { nom = 'makonde' }
l['kdh'] = { nom = 'tem' }
l['kdi'] = { nom = 'kumam' }
l['kdj'] = { nom = 'karimojong' }
l['kdm'] = { nom = 'kagoma' }
l['kdo'] = { nom = 'langues kordofaniennes', tri = 'kordofaniennes langues' }
l['kdp'] = { nom = 'kaningdon-nindem' }
l['kdq'] = { nom = 'koch' }
l['kdr'] = { nom = 'karaïme' }
l['kdt'] = { nom = 'kuy' }
l['kdu'] = { nom = 'kadaru' }
l['kdw'] = { nom = 'koneraw' }
l['kea'] = { nom = 'créole du Cap-Vert', tri = 'creole cap vert' }
l['keb'] = { nom = 'kélé (Gabon)', tri = 'kele gabon' }
l['kec'] = { nom = 'keiga' }
l['ked'] = { nom = 'kerewe' }
l['kee'] = { nom = 'keres de l’Est' }
l['kef'] = { nom = 'kpési' }
l['keg'] = { nom = 'tese' }
l['kei'] = { nom = 'kei' }
l['kek'] = { nom = 'q’eqchi’' }
l['kel'] = { nom = 'kela (République démocratique du Congo)', tri = 'kela congo' }
l['kelabit long napir'] = { nom = 'kelabit long napir' }
l['kem'] = { nom = 'kemak' }
l['ken'] = { nom = 'kenyang' }
l['kenyah long anap'] = { nom = 'kenyah long anap' }
l['kenyah long dunin'] = { nom = 'kenyah long dunin' }
l['kenyah long san'] = { nom = 'kenyah long san' }
l['keo'] = { nom = 'kakwa' }
l['ker'] = { nom = 'kera' }
l['kes'] = { nom = 'kugbo' }
l['ket'] = { nom = 'ket' }
l['keu'] = { nom = 'akébou' }
l['kew'] = { nom = 'kewa de l’Ouest' }
l['key'] = { nom = 'kupia' }
l['kfa'] = { nom = 'kodagu' }
l['kfb'] = { nom = 'kolami du Nord-Ouest' }
l['kfc'] = { nom = 'konda-dora' }
l['kfd'] = { nom = 'koraga korra' }
l['kff'] = { nom = 'koya' }
l['kfh'] = { nom = 'kurichiya' }
l['kfj'] = { nom = 'kemie' }
l['kfk'] = { nom = 'kinnauri' }
l['kfl'] = { nom = 'kung' }
l['kfm'] = { nom = 'khunsari' }
l['kfo'] = { nom = 'koro (Côte d’Ivoire)' }
l['kfq'] = { nom = 'korku' }
l['kfr'] = { nom = 'kutchi' }
l['kfy'] = { nom = 'kumaoni' }
l['kfz'] = { nom = 'koromfé' }
l['kg'] = { nom = 'kikongo' }
l['kgb'] = { nom = 'kawe' }
l['kgd'] = { nom = 'kataang' }
l['kge'] = { nom = 'komering' }
l['kgf'] = { nom = 'kube' }
l['kgg'] = { nom = 'kusunda' }
l['kgj'] = { nom = 'kham gamale' }
l['kgk'] = { nom = 'kaiwa' }
l['kgl'] = { nom = 'kunggari' }
l['kgo'] = { nom = 'krongo' }
l['kgp'] = { nom = 'kaingang' }
l['kgq'] = { nom = 'kamoro' }
l['kgr'] = { nom = 'abun' }
l['kgs'] = { nom = 'kumbainggar' }
l['kgt'] = { nom = 'somyev' }
l['kgv'] = { nom = 'karas' }
l['kgw'] = { nom = 'karon dori' }
l['kgy'] = { nom = 'kyirong' }
l['kha'] = { nom = 'khasi' }
l['khamnigan'] = { nom = 'khamnigan' }
l['khb'] = { nom = 'tai lü' }
l['khc'] = { nom = 'tukang besi du Nord' }
l['khe'] = { nom = 'korowai' }
l['khg'] = { nom = 'kham' }
l['khh'] = { nom = 'keuw' }
l['khi'] = { nom = 'langues khoïsanes', tri = 'khoisanes langues' }
l['khiajari'] = { nom = 'khiajari' }
l['khj'] = { nom = 'kuturmi' }
l['kho'] = { nom = 'khotanais' }
l['khoznini'] = { nom = 'khoznini' }
l['khp'] = { nom = 'kapori' }
l['khq'] = { nom = 'koyra chiini' }
l['khr'] = { nom = 'kharia' }
l['khs'] = { nom = 'kasua' }
l['kht'] = { nom = 'khamti' }
l['khv'] = { nom = 'khvarshi' }
l['khw'] = { nom = 'khowar' }
l['khy'] = { nom = 'kele (Congo)', tri = 'kele congo' }
l['khz'] = { nom = 'keapara' }
l['ki'] = { nom = 'kikuyu' }
l['kia'] = { nom = 'kim' }
l['kib'] = { nom = 'koalib' }
l['kic'] = { nom = 'kickapoo' }
l['kid'] = { nom = 'koshin' }
l['kie'] = { nom = 'kibet' }
l['kif'] = { nom = 'kham parbate de l’Est' }
l['kig'] = { nom = 'kimaama' }
l['kih'] = { nom = 'kilmeri' }
l['kii'] = { nom = 'kitsai' }
l['kij'] = { nom = 'kilivila' }
l['kil'] = { nom = 'kariya' }
l['kilen'] = { nom = 'kilen' }
l['kim'] = { nom = 'tofalar' }
l['kio'] = { nom = 'kiowa' }
l['kip'] = { nom = 'kham sheshi' }
l['kiptchak mamelouk'] = { nom = 'kiptchak mamelouk' }
l['kis'] = { nom = 'kis' }
l['kitanemuk'] = { nom = 'kitanemuk' }
l['kiu'] = { nom = 'kirmancki' }
l['kiv'] = { nom = 'kimbu' }
l['kiw'] = { nom = 'kiwai du Nord-Est' }
l['kiy'] = { nom = 'kirikiri' }
l['kiz'] = { nom = 'kisi' }
l['kj'] = { nom = 'kuanyama' }
l['kja'] = { nom = 'mlap' }
l['kjb'] = { nom = 'kanjobal' }
l['kjc'] = { nom = 'konjo de la côte' }
l['kjd'] = { nom = 'kiwai du Sud' }
l['kje'] = { nom = 'kisar' }
l['kjg'] = { nom = 'khmu' }
l['kjh'] = { nom = 'khakasse' }
l['kjh-fyk'] = { nom = 'kirghiz de Fu-Yu' }
l['kjj'] = { nom = 'khinalug' }
l['kjl'] = { nom = 'kham parbate de l’Ouest' }
l['kjm'] = { nom = 'kháng' }
l['kjn'] = { nom = 'kunjen' }
l['kjp'] = { nom = 'pwo de l’Est' }
l['kjq'] = { nom = 'keres de l’Ouest' }
l['kjr'] = { nom = 'kurudu' }
l['kjs'] = { nom = 'kewa de l’Est' }
l['kju'] = { nom = 'kashaya' }
l['kjz'] = { nom = 'bumthangkha' }
l['kk'] = { nom = 'kazakh', wiktionnaire = true }
l['kka'] = { nom = 'kakanda' }
l['kkb'] = { nom = 'kwerisa' }
l['kkc'] = { nom = 'odoodee' }
l['kkd'] = { nom = 'kinuku' }
l['kke'] = { nom = 'kakabé' }
l['kkf'] = { nom = 'monpa de Kalaktang' }
l['kki'] = { nom = 'kagulu' }
l['kkk'] = { nom = 'kokota' }
l['kkl'] = { nom = 'kosarek yale' }
l['kko'] = { nom = 'karko' }
l['kkr'] = { nom = 'kir-balar' }
l['kks'] = { nom = 'giiwo' }
l['kkt'] = { nom = 'koi' }
l['kky'] = { nom = 'guugu yimidhirr' }
l['kkz'] = { nom = 'kaska' }
l['kl'] = { nom = 'kalaallisut', wiktionnaire = true }
l['kla'] = { nom = 'klamath' }
l['klb'] = { nom = 'kiliwa' }
l['kld'] = { nom = 'kamilaroi' }
l['kle'] = { nom = 'kulung (Népal)', tri = 'kulung nepal' }
l['klg'] = { nom = 'kalagan de Tagakaulu' }
l['klj'] = { nom = 'khalaj' }
l['klk'] = { nom = 'kono (Nigeria)', tri = 'kono nigeria' }
l['klm'] = { nom = 'migum' }
l['kln'] = { nom = 'kalenjin' }
l['klp'] = { nom = 'kamasa' }
l['klq'] = { nom = 'rumu' }
l['klr'] = { nom = 'khaling' }
l['kls'] = { nom = 'kalasha' }
l['klt'] = { nom = 'nukna' }
l['klv'] = { nom = 'maskelynes' }
l['km'] = { nom = 'khmer', wiktionnaire = true }
l['kma'] = { nom = 'konni' }
l['kmb'] = { nom = 'kimbundu' }
l['kmc'] = { nom = 'kam' }
l['kmf'] = { nom = 'kare (Papouasie-Nouvelle-Guinée)', tri = 'kare papouasie nouvelle guinee' }
l['kmg'] = { nom = 'kâte' }
l['kmh'] = { nom = 'kalam' }
l['kmi'] = { nom = 'kami (Nigeria)', tri = 'kami nigeria' }
l['kmk'] = { nom = 'kalinga de Limos' }
l['kml'] = { nom = 'kalinga de Tanudan' }
l['kmm'] = { nom = 'kom (Inde)' }
l['kmn'] = { nom = 'awtuw' }
l['kmo'] = { nom = 'kwoma' }
l['kmq'] = { nom = 'gwama' }
l['kmr'] = { nom = 'kurmandji' }
l['kms'] = { nom = 'kamasau' }
l['kmt'] = { nom = 'kemtuik' }
l['kmv'] = { nom = 'karipúna' }
l['kmw'] = { nom = 'komo (langue bantoue)', tri='komo bantou' }
l['kmx'] = { nom = 'waboda' }
l['kmz'] = { nom = 'turc du Khorassan' }
l['kn'] = { nom = 'kannara', wiktionnaire = true }
l['kna'] = { nom = 'kanakuru' }
l['knb'] = { nom = 'kalinga de Lubuagan' }
l['knc'] = { nom = 'kanouri central' }
l['knd'] = { nom = 'konda' }
l['kne'] = { nom = 'kankanaey' }
l['kni'] = { nom = 'kanufi' }
l['knj'] = { nom = 'acatèque' }
l['knk'] = { nom = 'kuranko' }
l['kno'] = { nom = 'kono (Sierra Leone)', tri = 'kono sierra leone' }
l['knp'] = { nom = 'kwanja' }
l['kns'] = { nom = 'kensiw' }
l['knt'] = { nom = 'katukina' }
l['knu'] = { nom = 'kono (Guinée)', tri = 'kono guinee' }
l['knv'] = { nom = 'waia' }
l['knw'] = { nom = 'kung-ekoka' }
l['knx'] = { nom = 'kendayan' }
l['kny'] = { nom = 'kanyok' }
l['ko'] = { nom = 'coréen', wiktionnaire = true }
l['koa'] = { nom = 'konomala' }
l['kod'] = { nom = 'kodi' }
l['koe'] = { nom = 'kacipo-balesi' }
l['kof'] = { nom = 'kubi' }
l['kog'] = { nom = 'kogui' }
l['koh'] = { nom = 'koyo' }
l['koi'] = { nom = 'komi-permyak' }
l['kok'] = { nom = 'konkânî' }
l['kol'] = { nom = 'kol (Papouasie-Nouvelle-Guinée)' }
l['konomihu'] = { nom = 'konomihu' }
l['koo'] = { nom = 'konjo' }
l['kop'] = { nom = 'waube' }
l['koq'] = { nom = 'kota (Gabon)' }
l['kos'] = { nom = 'kosraéen' }
l['kot'] = { nom = 'lagwan' }
l['kotoxo'] = { nom = 'kotoxo' }
l['kou'] = { nom = 'koke' }
l['kow'] = { nom = 'kugama' }
l['koy'] = { nom = 'koyukon' }
l['koz'] = { nom = 'korak' }
l['kpa'] = { nom = 'kupto' }
l['kpc'] = { nom = 'curripaco' }
l['kpe'] = { nom = 'kpellé' }
l['kpf'] = { nom = 'komba' }
l['kpg'] = { nom = 'kapingamarangi' }
l['kpj'] = { nom = 'karajá' }
l['kpk'] = { nom = 'kpan' }
l['kpm'] = { nom = 'koho' }
l['kpn'] = { nom = 'kepkiriwát' }
l['kpo'] = { nom = 'ikposso' }
l['kpq'] = { nom = 'korupun-sela' }
l['kps'] = { nom = 'tehit' }
l['kpt'] = { nom = 'karata' }
l['kpw'] = { nom = 'kobon' }
l['kpx'] = { nom = 'koiari des montagnes' }
l['kpy'] = { nom = 'koryak' }
l['kpz'] = { nom = 'sapiny' }
l['kqc'] = { nom = 'doromu-koki' }
l['kqd'] = { nom = 'néo-araméen de Koy Sandjaq', tri = 'arameen neo de koy sandjaq' }
l['kqe'] = { nom = 'kalagan' }
l['kql'] = { nom = 'kyenele' }
l['kqp'] = { nom = 'kimré' }
l['kqq'] = { nom = 'krenak' }
l['kqr'] = { nom = 'kimaragang' }
l['kqs'] = { nom = 'kisi septentrional' }
l['kqt'] = { nom = 'kadazan klias' }
l['kqu'] = { nom = 'seroa' }
l['kqv'] = { nom = 'murut kolod' }
l['kqx'] = { nom = 'mser' }
l['kqy'] = { nom = 'koorete' }
l['kr'] = { nom = 'kanouri' }
l['krb'] = { nom = 'karkin' }
l['krc'] = { nom = 'karatchaï-balkar' }
l['kre'] = { nom = 'panará' }
l['krf'] = { nom = 'koro (Vanuatu)' }
l['kri'] = { nom = 'krio' }
l['krj'] = { nom = 'kinaray-a' }
l['krk'] = { nom = 'kerek' }
l['krl'] = { nom = 'carélien' }
l['kro'] = { nom = 'langues kroues', tri = 'kroues langues' }
l['krp'] = { nom = 'korop' }
l['krs'] = { nom = 'kresh' }
l['krt'] = { nom = 'kanuri de Tumari' }
l['kru'] = { nom = 'kurukh' }
l['krx'] = { nom = 'karon' }
l['kry'] = { nom = 'kryz' }
l['ks'] = { nom = 'kashmiri', wiktionnaire = true }
l['ksb'] = { nom = 'shambala' }
l['ksd'] = { nom = 'kuanua' }
l['kse'] = { nom = 'kuni' }
l['ksf'] = { nom = 'bafia' }
l['ksh'] = { nom = 'francique ripuaire' }
l['ksi'] = { nom = 'i’saka' }
l['ksk'] = { nom = 'kansa' }
l['ksn'] = { nom = 'kasiguranin' }
l['ksp'] = { nom = 'kabba' }
l['ksq'] = { nom = 'kwaami' }
l['ksr'] = { nom = 'borong' }
l['kss'] = { nom = 'kisi méridional' }
l['ksv'] = { nom = 'kusu' }
l['ksw'] = { nom = 'sgaw' }
l['ksx'] = { nom = 'kedang' }
l['ktb'] = { nom = 'kambaata' }
l['ktd'] = { nom = 'kokata' }
l['kte'] = { nom = 'nubri' }
l['ktg'] = { nom = 'kalkatungu' }
l['kti'] = { nom = 'muyu du Nord' }
l['ktl'] = { nom = 'koroshi' }
l['ktn'] = { nom = 'karitiana' }
l['kto'] = { nom = 'kuot' }
l['ktp'] = { nom = 'kaduo' }
l['kts'] = { nom = 'muyu du Sud' }
l['ktt'] = { nom = 'ketum' }
l['ktu'] = { nom = 'kituba' }
l['ktw'] = { nom = 'kato' }
l['ktx'] = { nom = 'kaxararí' }
l['ktz'] = { nom = 'juǀ’hoan', tri = 'ju hoan' }
l['ku'] = { nom = 'kurde', wiktionnaire = true }
l['kub'] = { nom = 'kutep' }
l['kuc'] = { nom = 'kwinsu' }
l['kud'] = { nom = '’auhelawa', tri = 'auhelawa' }
l['kue'] = { nom = 'kuman' }
l['kuf'] = { nom = 'katu' }
l['kug'] = { nom = 'kupa' }
l['kuh'] = { nom = 'kushi' }
l['kui'] = { nom = 'kuikuro' }
l['kuj'] = { nom = 'kuria' }
l['kuk'] = { nom = 'kepo’' }
l['kul'] = { nom = 'kulere' }
l['kum'] = { nom = 'koumyk' }
l['kumaná'] = { nom = 'kumaná' }
l['kun'] = { nom = 'kunama' }
l['kuo'] = { nom = 'kumukio' }
l['kus'] = { nom = 'kusaal' }
l['kut'] = { nom = 'kutenai' }
l['kuu'] = { nom = 'kolchan' }
l['kuy'] = { nom = 'kuuku-ya’u' }
l['kuz'] = { nom = 'kunza' }
l['kv'] = { nom = 'komi' }
l['kva'] = { nom = 'bagwalal' }
l['kvc'] = { nom = 'kove' }
l['kvd'] = { nom = 'kui (Indonésie)' }
l['kve'] = { nom = 'murut kalabakan' }
l['kvf'] = { nom = 'kabalai' }
l['kvg'] = { nom = 'kuni-boazi' }
l['kvi'] = { nom = 'kwang' }
l['kvm'] = { nom = 'kendem' }
l['kvn'] = { nom = 'kuna' }
l['kvo'] = { nom = 'dobel' }
l['kvq'] = { nom = 'geba' }
l['kvr'] = { nom = 'kerinci' }
l['kvt'] = { nom = 'lahta' }
l['kvw'] = { nom = 'wersing' }
l['kvz'] = { nom = 'tsaukambo' }
l['kw'] = { nom = 'cornique', wiktionnaire = true }
l['kwa'] = { nom = 'dâw' }
l['kwd'] = { nom = 'kwaio' }
l['kwe'] = { nom = 'kwerba' }
l['kwf'] = { nom = 'kwara’ae' }
l['kwg'] = { nom = 'démé' }
l['kwh'] = { nom = 'kowiai' }
l['kwi'] = { nom = 'awa pit' }
l['kwj'] = { nom = 'kwanga' }
l['kwk'] = { nom = 'kwak’wala' }
l['kwn'] = { nom = 'kwangali' }
l['kwo'] = { nom = 'kwomtari' }
l['kwp'] = { nom = 'kodia' }
l['kwr'] = { nom = 'kwer' }
l['kws'] = { nom = 'kwese' }
l['kwt'] = { nom = 'kwesten' }
l['kwu'] = { nom = 'kwakum' }
l['kwv'] = { nom = 'sara kaba náà' }
l['kxa'] = { nom = 'kairiru' }
l['kxc'] = { nom = 'konso' }
l['kxd'] = { nom = 'malais de Brunei' }
l['kxh'] = { nom = 'karo (Éthiopie)' }
l['kxj'] = { nom = 'koulfa' }
l['kxm'] = { nom = 'khmer du Nord' }
l['kxn'] = { nom = 'melanau kanowit' }
l['kxo'] = { nom = 'kanoê' }
l['kxs'] = { nom = 'kangjia' }
l['kxt'] = { nom = 'koiwat' }
l['kxu'] = { nom = 'kui (Inde)' }
l['kxv'] = { nom = 'kuvi' }
l['kxw'] = { nom = 'konai' }
l['kxz'] = { nom = 'kerewo' }
l['ky'] = { nom = 'kirghiz', wiktionnaire = true }
l['kya'] = { nom = 'kwaya' }
l['kyc'] = { nom = 'kyaka' }
l['kyf'] = { nom = 'sokuya' }
l['kyh'] = { nom = 'karuk' }
l['kyi'] = { nom = 'kiput' }
l['kyj'] = { nom = 'karao' }
l['kyl'] = { nom = 'kalapuya central' }
l['kyo'] = { nom = 'klon' }
l['kyq'] = { nom = 'kenga' }
l['kyr'] = { nom = 'kuruáya' }
l['kys'] = { nom = 'baram kayan' }
l['kyt'] = { nom = 'kayagar' }
l['kyu'] = { nom = 'kayah li de l’Ouest' }
l['kyx'] = { nom = 'rapoisi' }
l['kyz'] = { nom = 'kayabi' }
l['kzf'] = { nom = 'kaili de Da’a', tri = 'kaili daa' }
l['kzg'] = { nom = 'kikaï' }
l['kzh'] = { nom = 'dongolawi-kenzi' }
l['kzi'] = { nom = 'kelabit bario' }
l['kzj'] = { nom = 'kadazan penampang' }
l['kzl'] = { nom = 'kayeli' }
l['kzm'] = { nom = 'kais' }
l['kzr'] = { nom = 'karang' }
l['kzt'] = { nom = 'dusun tambunan' }
l['kzu'] = { nom = 'kayupulau' }
l['kzv'] = { nom = 'komyandaret' }
l['kzw'] = { nom = 'karirí-xocó' }
l['kzz'] = { nom = 'kalabra' }
l['la'] = { nom = 'latin', portail = true, wiktionnaire = true }
l['laa'] = { nom = 'subanen du Sud', tri = 'subanen sud' }
l['lab'] = { nom = 'linéaire A' }
l['lac'] = { nom = 'lacandon' }
l['lad'] = { nom = 'judéo-espagnol' }
l['lae'] = { nom = 'pattani' }
l['laf'] = { nom = 'lafofa' }
l['lag'] = { nom = 'langi' }
l['lah'] = { nom = 'lahnda' }
l['lai'] = { nom = 'lambya' }
l['laj'] = { nom = 'lango' }
l['lak'] = { nom = 'laka (Nigeria)' }
l['lala (Afrique du Sud)'] = { nom = 'lala (Afrique du Sud)' }
l['lam'] = { nom = 'lamba' }
l['lan'] = { nom = 'laru' }
l['lap'] = { nom = 'laka' }
l['laq'] = { nom = 'qabiao' }
l['lar'] = { nom = 'larteh' }
l['las'] = { nom = 'lama (Togo)' }
l['lau'] = { nom = 'laba' }
l['lauhut'] = { nom = 'lauhut' }
l['law'] = { nom = 'lauje' }
l['lawi'] = { nom = 'lawi' }
l['lax'] = { nom = 'tiwa' }
l['lay'] = { nom = 'lama (Birmanie)' }
l['laz'] = { nom = 'aribwatsa' }
l['lazé'] = { nom = 'lazé' }
l['lb'] = { nom = 'luxembourgeois', wiktionnaire = true }
l['lbc'] = { nom = 'lakkja' }
l['lbe'] = { nom = 'lak' }
l['lbj'] = { nom = 'ladakhi' }
l['lbk'] = { nom = 'bontok central' }
l['lbn'] = { nom = 'lamet' }
l['lbo'] = { nom = 'laven' }
l['lbq'] = { nom = 'wampar' }
l['lbs'] = { nom = 'langue des signes libyennne', tri = 'signes libyenne' }
l['lbt'] = { nom = 'lachi' }
l['lbu'] = { nom = 'labu' }
l['lbw'] = { nom = 'tolaki' }
l['lbx'] = { nom = 'lawangan' }
l['lby'] = { nom = 'lamu-lamu' }
l['lbz'] = { nom = 'lardil' }
l['lcc'] = { nom = 'legenyem' }
l['lcd'] = { nom = 'lola' }
l['lcl'] = { nom = 'lisela' }
l['lcm'] = { nom = 'tungag' }
l['lcp'] = { nom = 'lawa de l’Ouest' }
l['lcq'] = { nom = 'luhu' }
l['lda'] = { nom = 'kla-dan' }
l['ldb'] = { nom = 'dũya' }
l['ldd'] = { nom = 'luri' }
l['ldi'] = { nom = 'laari' }
l['ldn'] = { nom = 'láadan' }
l['lea'] = { nom = 'lega de Shabunda' }
l['leb'] = { nom = 'lala-bisa' }
l['lec'] = { nom = 'leko' }
l['led'] = { nom = 'lendu' }
l['lee'] = { nom = 'lyélé' }
l['lef'] = { nom = 'lelemi' }
l['leg'] = { nom = 'lengua' }
l['leh'] = { nom = 'lenje' }
l['lei'] = { nom = 'lemio' }
l['lek'] = { nom = 'leipon' }
l['lel'] = { nom = 'lele (République démocratique du Congo)', tri = 'lele congo' }
l['lem'] = { nom = 'nomaande' }
l['len'] = { nom = 'lenca du Salvador' }
l['leo'] = { nom = 'leti (Cameroun)' }
l['lep'] = { nom = 'lepcha' }
l['leq'] = { nom = 'lembena' }
l['ler'] = { nom = 'lenkau' }
l['les'] = { nom = 'lese' }
l['let'] = { nom = 'amio-gelimi' }
l['leu'] = { nom = 'kara (Papouasie-Nouvelle-Guinée)' }
l['lev'] = { nom = 'pantar de l’Ouest' }
l['lew'] = { nom = 'kaili de Ledo', tri = 'kaili ledo' }
l['lex'] = { nom = 'luang' }
l['ley'] = { nom = 'lemolang' }
l['lez'] = { nom = 'lezghien' }
l['lfn'] = { nom = 'lingua franca nova' }
l['lg'] = { nom = 'ganda' }
l['lga'] = { nom = 'lungga' }
l['lgb'] = { nom = 'laghu' }
l['lgg'] = { nom = 'lougbara' }
l['lgh'] = { nom = 'laghuu' }
l['lgi'] = { nom = 'lengilu’' }
l['lgk'] = { nom = 'neverver' }
l['lgl'] = { nom = 'wala' }
l['lgm'] = { nom = 'lega-mwenga' }
l['lgn'] = { nom = 'opuuo' }
l['lgq'] = { nom = 'logba' }
l['lgr'] = { nom = 'lengo' }
l['lgt'] = { nom = 'pahi' }
l['lgu'] = { nom = 'longgu' }
l['lgz'] = { nom = 'ligenza' }
l['lha'] = { nom = 'laha (Vietnam)' }
l['lhh'] = { nom = 'laha (Indonésie)' }
l['lhi'] = { nom = 'lahu shi' }
l['lhm'] = { nom = 'lhomi' }
l['lhn'] = { nom = 'lahanan' }
l['lhp'] = { nom = 'lhokpu' }
l['lhs'] = { nom = 'mlahso' }
l['lht'] = { nom = 'lo-toga' }
l['lhu'] = { nom = 'lahu' }
l['li'] = { nom = 'limbourgeois', wiktionnaire = true }
l['lia'] = { nom = 'limba central et de l’Ouest' }
l['lib'] = { nom = 'likum' }
l['liburnien'] = { nom = 'liburnien' }
l['lic'] = { nom = 'hlaï' }
l['lid'] = { nom = 'nyindrou' }
l['lie'] = { nom = 'likila' }
l['lif'] = { nom = 'limbou' }
l['lig'] = { nom = 'ligbi' }
l['light warlpiri'] = { nom = 'light warlpiri' }
l['lih'] = { nom = 'lihir' }
l['lii'] = { nom = 'limkhim' }
l['lij-MC'] = { nom = 'monégasque' }
l['lij-mc'] = { nom = 'monégasque' }
l['lij'] = { nom = 'ligure' }
l['lik'] = { nom = 'lika' }
l['lil'] = { nom = 'lillooet' }
l['lio'] = { nom = 'liki' }
l['lip'] = { nom = 'sekpele' }
l['liq'] = { nom = 'libido' }
l['lir'] = { nom = 'anglais libérien' }
l['lis'] = { nom = 'lisu' }
l['lisum'] = { nom = 'lisum' }
l['liu'] = { nom = 'logorik' }
l['liv'] = { nom = 'livonien' }
l['liw'] = { nom = 'col' }
l['lix'] = { nom = 'liabuku' }
l['liy'] = { nom = 'banda-bambari' }
l['liz'] = { nom = 'libinza' }
l['lizu'] = { nom = 'lizu' }
l['lje'] = { nom = 'rampi' }
l['lji'] = { nom = 'laiyolo' }
l['ljl'] = { nom = 'li’o' }
l['ljp'] = { nom = 'lampung' }
l['lka'] = { nom = 'lakalei' }
l['lkb'] = { nom = 'kabras' }
l['lkc'] = { nom = 'kucong' }
l['lkd'] = { nom = 'lakondê' }
l['lke'] = { nom = 'kenyi' }
l['lki'] = { nom = 'laki' }
l['lkm'] = { nom = 'kalaamaya' }
l['lkn'] = { nom = 'lakon' }
l['lkt'] = { nom = 'lakota' }
l['lku'] = { nom = 'kungkari' }
l['lky'] = { nom = 'lokoya' }
l['lla'] = { nom = 'lala-roba' }
l['llb'] = { nom = 'lolo' }
l['llc'] = { nom = 'lele (Guinée)' }
l['lld'] = { nom = 'ladin' }
l['lle'] = { nom = 'lele (Papouasie-Nouvelle-Guinée)' }
l['llj'] = { nom = 'ladji ladji' }
l['llk'] = { nom = 'lelak' }
l['lln'] = { nom = 'lele (Tchad)' }
l['llp'] = { nom = 'éfaté du Nord' }
l['llq'] = { nom = 'lolak' }
l['lls'] = { nom = 'langue des signes lituanienne', tri = 'signes lituanienne' }
l['llu'] = { nom = 'lau' }
l['lma'] = { nom = 'limba de l’Est' }
l['lmb'] = { nom = 'merei' }
l['lmc'] = { nom = 'limilngan' }
l['lmd'] = { nom = 'lumun' }
l['lme'] = { nom = 'lamé' }
l['lmg'] = { nom = 'lamogai' }
l['lmk'] = { nom = 'lamkang' }
l['lml'] = { nom = 'raga' }
l['lmn'] = { nom = 'lambadi' }
l['lmo'] = { nom = 'lombard', wiktionnaire = true }
l['lmp'] = { nom = 'limbum' }
l['lmu'] = { nom = 'lamen' }
l['lmw'] = { nom = 'miwok du lac', tri = 'miwok lac' }
l['lmy'] = { nom = 'lamboya' }
l['ln'] = { nom = 'lingala', wiktionnaire = true }
l['lna'] = { nom = 'langbashe' }
l['lnd'] = { nom = 'lundayeh' }
l['lng'] = { nom = 'lombard (germanique)' }
l['lnl'] = { nom = 'banda Sud central' }
l['lnn'] = { nom = 'lorediakarkar' }
l['lns'] = { nom = 'lamnso’' }
l['lo'] = { nom = 'laotien', wiktionnaire = true }
l['loa'] = { nom = 'loloda' }
l['loc'] = { nom = 'inonhan' }
l['loe'] = { nom = 'saluan' }
l['log'] = { nom = 'logo' }
l['loh'] = { nom = 'narim' }
l['loi'] = { nom = 'loma (Côte d’Ivoire)' }
l['loj'] = { nom = 'lou' }
l['lok'] = { nom = 'loko' }
l['lol'] = { nom = 'lomongo' }
l['lom'] = { nom = 'loma' }
l['lon'] = { nom = 'lomwe du Malawi' }
l['lop'] = { nom = 'lopa' }
l['lor'] = { nom = 'téén' }
l['lorrain'] = { nom = 'lorrain' }
l['los'] = { nom = 'loniu' }
l['lot'] = { nom = 'otuho' }
l['lou'] = { nom = 'créole louisianais' }
l['low'] = { nom = 'tampias lobu' }
l['loz'] = { nom = 'lozi' }
l['lpa'] = { nom = 'lelepa' }
l['lpe'] = { nom = 'lepki' }
l['lpo'] = { nom = 'lipo' }
l['lpx'] = { nom = 'lopit' }
l['lra'] = { nom = 'rara bakati’' }
l['lrc'] = { nom = 'lori du Nord' }
l['lre'] = { nom = 'laurentien' }
l['lrl'] = { nom = 'larestani' }
l['lro'] = { nom = 'laro' }
l['lrr'] = { nom = 'yamphu du Sud' }
l['lrv'] = { nom = 'larevat' }
l['lrz'] = { nom = 'lemerig' }
l['lsa'] = { nom = 'lasguerdi' }
l['lsd'] = { nom = 'lishana deni' }
l['lse'] = { nom = 'lusengo' }
l['lsh'] = { nom = 'lish' }
l['lsi'] = { nom = 'lashi' }
l['lsl'] = { nom = 'langue des signes lettonne', tri = 'signes lettonne' }
l['lsm'] = { nom = 'saamia' }
l['lsr'] = { nom = 'aruop' }
l['lt'] = { nom = 'lituanien', wiktionnaire = true }
l['ltc'] = { nom = 'chinois médiéval' }
l['ltg'] = { nom = 'latgalien' }
l['lti'] = { nom = 'leti (Indonésie)' }
l['ltn'] = { nom = 'latundê' }
l['lts'] = { nom = 'lutachoni' }
l['lu'] = { nom = 'kiluba' }
l['lua'] = { nom = 'luba-lulua' }
l['luc'] = { nom = 'aringa' }
l['lucanien'] = { nom = 'lucanien' }
l['lud'] = { nom = 'ludien' }
l['lue'] = { nom = 'luvale' }
l['lui'] = { nom = 'luiseño' }
l['lui-jua'] = { nom = 'juaneño' }
l['lul'] = { nom = 'olu’bo' }
l['lun'] = { nom = 'lunda' }
l['luo'] = { nom = 'luo (Kenya, Tanzanie)' }
l['lup'] = { nom = 'lumbu' }
l['lur'] = { nom = 'laura' }
l['lus'] = { nom = 'mizo' }
l['lut'] = { nom = 'lushootseed' }
l['luu'] = { nom = 'lumba-yakkha' }
l['luv'] = { nom = 'luwati' }
l['luw'] = { nom = 'luo (Cameroun)' }
l['luy'] = { nom = 'luhya' }
l['luz'] = { nom = 'lori du Sud' }
l['lv'] = { nom = 'letton', wiktionnaire = true }
l['lva'] = { nom = 'makuva' }
l['lvk'] = { nom = 'lavukaleve' }
l['lwg'] = { nom = 'wanga' }
l['lwl'] = { nom = 'lawa de l’Est' }
l['lwm'] = { nom = 'laomien' }
l['lwo'] = { nom = 'luwo' }
l['lww'] = { nom = 'lewo' }
l['lyg'] = { nom = 'lyngngam' }
l['lzh'] = { nom = 'chinois classique', wmlien = 'zh-classical' }
l['lzl'] = { nom = 'litzlitz' }
l['lzn'] = { nom = 'leinong' }
l['lzz'] = { nom = 'laze' }
l['ma pnaan'] = { nom = 'ma pnaan' }
l['maa'] = { nom = 'mazatèque d’Eloxochitlán', tri = 'mazateque eloxochitlan' }
l['mad'] = { nom = 'madourais' }
l['mae'] = { nom = 'bo-rukul' }
l['maf'] = { nom = 'mafa' }
l['mag'] = { nom = 'magahi' }
l['mai'] = { nom = 'maithili' }
l['maj'] = { nom = 'mazatèque de Jalapa de Díaz', tri = 'mazateque jalapa diaz' }
l['mak'] = { nom = 'makassar' }
l['mam'] = { nom = 'mam' }
l['man'] = { nom = 'mandingue' }
l['map'] = { nom = 'langues austronésiennes', tri = 'austronesiennes langues' }
l['map-bms'] = { nom = 'banyumasan' }
l['maq'] = { nom = 'mazatèque de Chiquihuitlán', tri = 'mazateque chiquihuitlan' }
l['mas'] = { nom = 'massaï' }
l['mat'] = { nom = 'matlatzinca de San Francisco' }
l['mau'] = { nom = 'mazatèque de Huautla', tri = 'mazateque huautla' }
l['mav'] = { nom = 'mawé-sateré' }
l['maw'] = { nom = 'mampruli' }
l['max'] = { nom = 'malais de Ternate' }
l['mayennais'] = { nom = 'mayennais' }
l['maz'] = { nom = 'mazahua central' }
l['mba'] = { nom = 'higaonon' }
l['mbb'] = { nom = 'manobo de l’Ouest de Bukidnon', tri = 'manobo bukidnon ouest' }
l['mbc'] = { nom = 'macushi' }
l['mbd'] = { nom = 'manobo de Dibabawon', tri = 'manobo dibabawon' }
l['mbe'] = { nom = 'molala' }
l['mbh'] = { nom = 'mangseng' }
l['mbi'] = { nom = 'manobo d’Ilianen', tri = 'manobo ilianen' }
l['mbj'] = { nom = 'nadëb' }
l['mbk'] = { nom = 'malol' }
l['mbl'] = { nom = 'maxakalí' }
l['mbn'] = { nom = 'macaguán' }
l['mbp'] = { nom = 'damana' }
l['mbq'] = { nom = 'maisin' }
l['mbr'] = { nom = 'nukak' }
l['mbs'] = { nom = 'manobo de Sarangani', tri = 'manobo sarangani' }
l['mbt'] = { nom = 'manobo de Matigsalug', tri = 'manobo matigsalug' }
l['mbu'] = { nom = 'mbula-bwazza' }
l['mbw'] = { nom = 'maring' }
l['mby'] = { nom = 'memoni' }
l['mca'] = { nom = 'maká' }
l['mcb'] = { nom = 'machiguenga' }
l['mcd'] = { nom = 'marinahua' }
l['mcf'] = { nom = 'matsés' }
l['mcg'] = { nom = 'mapoyo' }
l['mch'] = { nom = 'de’cuana' }
l['mci'] = { nom = 'mesem' }
l['mcj'] = { nom = 'mvanip' }
l['mck'] = { nom = 'mbunda' }
l['mcl'] = { nom = 'macaguaje' }
l['mcm'] = { nom = 'kristang' }
l['mcn'] = { nom = 'masa' }
l['mco'] = { nom = 'mixe de Coatlán' }
l['mcp'] = { nom = 'makaa' }
l['mcr'] = { nom = 'menya' }
l['mcs'] = { nom = 'mambai' }
l['mct'] = { nom = 'manguissa' }
l['mcu'] = { nom = 'ba mambila' }
l['mcv'] = { nom = 'minanibai' }
l['mcw'] = { nom = 'mawa' }
l['mcx'] = { nom = 'mpiemo' }
l['mcy'] = { nom = 'watut du Sud' }
l['mcz'] = { nom = 'mawan' }
l['mda'] = { nom = 'mada (Nigéria)' }
l['mdb'] = { nom = 'morigi' }
l['mdc'] = { nom = 'male' }
l['mdd'] = { nom = 'mbum' }
l['mde'] = { nom = 'maba (Tchad)' }
l['mdf'] = { nom = 'mokcha' }
l['mdg'] = { nom = 'massalat' }
l['mdh'] = { nom = 'maguindanao' }
l['mdi'] = { nom = 'mamvu' }
l['mdk'] = { nom = 'mangbutu' }
l['mdm'] = { nom = 'mayogo' }
l['mdp'] = { nom = 'mbala' }
l['mdr'] = { nom = 'mandar' }
l['mds'] = { nom = 'maria (Papouasie-Nouvelle-Guinée)' }
l['mdw'] = { nom = 'mbochi' }
l['mdx'] = { nom = 'dizi' }
l['mdy'] = { nom = 'maale' }
l['mea'] = { nom = 'menka' }
l['meb'] = { nom = 'ikobi' }
l['mec'] = { nom = 'mara' }
l['med'] = { nom = 'melpa' }
l['mee'] = { nom = 'mengen' }
l['mef'] = { nom = 'megam' }
l['meh'] = { nom = 'mixtèque de Tlaxiaco du Sud-Ouest', tri = 'mixteque tlaxiaco sud ouest' }
l['mei'] = { nom = 'midob' }
l['mej'] = { nom = 'meyah' }
l['mek'] = { nom = 'mekeo' }
l['mel'] = { nom = 'melanau central' }
l['mem'] = { nom = 'mangala' }
l['men'] = { nom = 'mendé' }
l['menien'] = { nom = 'menien' }
l['meo'] = { nom = 'malais kedah' }
l['me’phaa de Huehuetepec'] = { nom = 'me’phaa de Huehuetepec', tri = 'mephaa Huehuetepec' }
l['me’phaa de Huitzapula'] = { nom = 'me’phaa de Huitzapula', tri = 'mephaa Huitzapula' }
l['me’phaa de Nanzintla'] = { nom = 'me’phaa de Nanzintla', tri = 'mephaa Nanzintla' }
l['me’phaa de Teocuitlapa'] = { nom = 'me’phaa de Teocuitlapa', tri = 'mephaa Teocuitlapa' }
l['me’phaa de Zapotitlan Tablas'] = { nom = 'me’phaa de Zapotitlan Tablas', tri = 'mephaa Zapotitlan Tablas' }
l['meq'] = { nom = 'mere' }
l['mer'] = { nom = 'meru' }
l['mes'] = { nom = 'masmaje' }
l['met'] = { nom = 'mato' }
l['meu'] = { nom = 'motou' }
l['mev'] = { nom = 'mano' }
l['mew'] = { nom = 'maaka' }
l['mey'] = { nom = 'hassanya' }
l['mez'] = { nom = 'menominee' }
l['mfa'] = { nom = 'malais de Pattani' }
l['mfe'] = { nom = 'créole mauricien' }
l['mff'] = { nom = 'naki' }
l['mfg'] = { nom = 'mogofin' }
l['mfh'] = { nom = 'matal' }
l['mfi'] = { nom = 'wandala' }
l['mfj'] = { nom = 'mefele' }
l['mfn'] = { nom = 'mbembe Cross River' }
l['mfp'] = { nom = 'malais de Makassar' }
l['mfr'] = { nom = 'marithiel' }
l['mfv'] = { nom = 'manjak', tri = 'manjaque' }
l['mfx'] = { nom = 'melo' }
l['mfy'] = { nom = 'mayo' }
l['mfz'] = { nom = 'mabaan' }
l['mg'] = { nom = 'malgache', wiktionnaire = true }
l['mga'] = { nom = 'moyen irlandais', tri = 'irlandais moyen' }
l['mgc'] = { nom = 'morokodo' }
l['mgd'] = { nom = 'moru' }
l['mgf'] = { nom = 'maklew' }
l['mgh'] = { nom = 'makhuwa-meetto' }
l['mgi'] = { nom = 'lijili' }
l['mgj'] = { nom = 'abureni' }
l['mgk'] = { nom = 'mawes' }
l['mgm'] = { nom = 'mambae' }
l['mgo'] = { nom = 'meta’' }
l['mgp'] = { nom = 'magar oriental' }
l['mgq'] = { nom = 'malila' }
l['mgr'] = { nom = 'mambwe-lungu' }
l['mgs'] = { nom = 'manda (Tanzanie)' }
l['mgv'] = { nom = 'matengo' }
l['mgw'] = { nom = 'matumbi' }
l['mgz'] = { nom = 'mbugwe' }
l['mh'] = { nom = 'marshallais', wiktionnaire = true }
l['mha'] = { nom = 'manda (Inde)' }
l['mhb'] = { nom = 'mahongwe' }
l['mhc'] = { nom = 'mocho' }
l['mhe'] = { nom = 'mah meri' }
l['mhi'] = { nom = 'ma’di' }
l['mhj'] = { nom = 'moghol' }
l['mhl'] = { nom = 'mauwake' }
l['mhm'] = { nom = 'makhuwa-moniga' }
l['mhn'] = { nom = 'mochène' }
l['mho'] = { nom = 'mashi (Zambie)' }
l['mhq'] = { nom = 'mandan' }
l['mhr'] = { nom = 'mari de l’Est' }
l['mhs'] = { nom = 'buru' }
l['mht'] = { nom = 'mandahuaca' }
l['mhu'] = { nom = 'digaro' }
l['mhx'] = { nom = 'maru' }
l['mhy'] = { nom = 'ma’anyan' }
l['mhz'] = { nom = 'moor' }
l['mi'] = { nom = 'maori', wiktionnaire = true }
l['mia'] = { nom = 'miami' }
l['miao de Xiaozhang'] = { nom = 'miao de Xiaozhang', tri = 'miao xiaozhang' }
l['mib'] = { nom = 'mixtèque d’Atatláhuca', tri = 'mixteque atatlahuca' }
l['mic'] = { nom = 'micmac' }
l['mid'] = { nom = 'néo-mandéen', tri = 'mandeen neo' }
l['mie'] = { nom = 'mixtèque d’Ocotepec', tri = 'mixteque ocotepec' }
l['mif'] = { nom = 'mofu-gudur' }
l['mig'] = { nom = 'mixtèque de San Miguel El Grande', tri = 'mixteque san miguel el grande' }
l['mih'] = { nom = 'mixtèque de Chayuco', tri = 'mixteque chayuco' }
l['mii'] = { nom = 'mixtèque de Chigmecatitlán', tri = 'mixteque chigmecatitlan' }
l['mij'] = { nom = 'abar' }
l['mik'] = { nom = 'mikasuki' }
l['mik-hit'] = { nom = 'hitchiti' }
l['mil'] = { nom = 'mixtèque de Peñoles', tri = 'mixteque penoles' }
l['milang'] = { nom = 'milang' }
l['mim'] = { nom = 'mixtèque d’Alacatlatzala', tri = 'mixteque alacatlatzala' }
l['min'] = { nom = 'minangkabau', wiktionnaire = true }
l['mio'] = { nom = 'mixtèque de Pinotepa Nacional', tri = 'mixteque pinotepa nacional' }
l['mip'] = { nom = 'mixtèque d’Apasco-Apoala', tri = 'mixteque apasco apoala' }
l['miq'] = { nom = 'miskito' }
l['mir'] = { nom = 'mixe de l’Isthme', tri = 'mixe de isthme' }
l['miri'] = { nom = 'miri' }
l['mis'] = { nom = 'langues non codées', tri = '*non codees langues' }
l['mit'] = { nom = 'mixtèque du sud de Puebla', tri = 'mixteque puebla sud' }
l['mithaka'] = { nom = 'mithaka' }
l['miw'] = { nom = 'akoye' }
l['mix'] = { nom = 'mixtèque de Mixtepec', tri = 'mixteque mixtepec' }
l['miy'] = { nom = 'mixtèque d’Ayutla', tri = 'mixteque ayutla' }
l['miz'] = { nom = 'mixtèque de Coatzospan', tri = 'mixteque coatzospan' }
l['mjc'] = { nom = 'mixtèque de San Juan Colorado', tri = 'mixteque san juan colorado' }
l['mjd'] = { nom = 'konkow' }
l['mje'] = { nom = 'muskum' }
l['mjg'] = { nom = 'monguor' }
l['mjh'] = { nom = 'mwera (Nyasa)' }
l['mji'] = { nom = 'kim mun' }
l['mjj'] = { nom = 'mawak' }
l['mjm'] = { nom = 'medebur' }
l['mjr'] = { nom = 'malavedan' }
l['mjt'] = { nom = 'sauria pahahria' }
l['mjv'] = { nom = 'mannan' }
l['mjw'] = { nom = 'karbi' }
l['mjx'] = { nom = 'mahali' }
l['mjy'] = { nom = 'mohican' }
l['mk'] = { nom = 'macédonien', wiktionnaire = true }
l['mkc'] = { nom = 'siliput' }
l['mkf'] = { nom = 'miya' }
l['mkg'] = { nom = 'mak (Chine)' }
l['mkh'] = { nom = 'langues môn-khmères', tri = 'mon khmeres langues' }
l['mkj'] = { nom = 'mokil' }
l['mkm'] = { nom = 'moklen' }
l['mkn'] = { nom = 'malais de Kupang' }
l['mkp'] = { nom = 'moikodi' }
l['mkq'] = { nom = 'miwok de la baie', tri = 'miwok baie' }
l['mks'] = { nom = 'mixtèque de Silacayoapan', tri = 'mixteque silacayoapan' }
l['mku'] = { nom = 'konyanka' }
l['mkv'] = { nom = 'mavea' }
l['mkw'] = { nom = 'munukutuba' }
l['mkx'] = { nom = 'quinamiguin' }
l['mky'] = { nom = 'makian de l’Est' }
l['mkz'] = { nom = 'makasae' }
l['ml'] = { nom = 'malayalam', wiktionnaire = true }
l['mla'] = { nom = 'tamambo' }
l['mlc'] = { nom = 'cao lan' }
l['mle'] = { nom = 'manambu' }
l['mlf'] = { nom = 'mal' }
l['mlh'] = { nom = 'mape' }
l['mlj'] = { nom = 'milju' }
l['mlk'] = { nom = 'ilwana' }
l['mll'] = { nom = 'malua bay' }
l['mlm'] = { nom = 'mulam' }
l['mlp'] = { nom = 'bargam' }
l['mlq'] = { nom = 'malinké occidental' }
l['mlr'] = { nom = 'vamé' }
l['mls'] = { nom = 'masalit' }
l['mlu'] = { nom = 'toqabaqita' }
l['mlv'] = { nom = 'mwotlap' }
l['mlw'] = { nom = 'moloko' }
l['mlx'] = { nom = 'naha’ai' }
l['mma'] = { nom = 'mama' }
l['mmb'] = { nom = 'momina' }
l['mmc'] = { nom = 'mazahua du Michoacán' }
l['mmd'] = { nom = 'maonan' }
l['mme'] = { nom = 'mae' }
l['mmf'] = { nom = 'mundat' }
l['mmg'] = { nom = 'ambrym du Nord' }
l['mmh'] = { nom = 'mehináku' }
l['mmi'] = { nom = 'musar' }
l['mmm'] = { nom = 'maii' }
l['mmn'] = { nom = 'mamanwa' }
l['mmp'] = { nom = 'siawi' }
l['mmr'] = { nom = 'miao du Xiangxi occidental', tri = 'miao xiangxi occidental' }
l['mmt'] = { nom = 'malalamai' }
l['mmu'] = { nom = 'mmaala' }
l['mmw'] = { nom = 'emae' }
l['mmx'] = { nom = 'madak' }
l['mmy'] = { nom = 'migaama' }
l['mn'] = { nom = 'mongol', wiktionnaire = true }
l['mna'] = { nom = 'mbula' }
l['mnb'] = { nom = 'muna' }
l['mnc'] = { nom = 'mandchou' }
l['mnd'] = { nom = 'mondé' }
l['mne'] = { nom = 'naba' }
l['mnf'] = { nom = 'mundani' }
l['mng'] = { nom = 'mnong de l’Est' }
l['mnh'] = { nom = 'mono (République démocratique du Congo)', tri = 'mono congo' }
l['mni'] = { nom = 'manipourî', wiktionnaire = true }
l['mnj'] = { nom = 'munji' }
l['mnk'] = { nom = 'mandinka' }
l['mnl'] = { nom = 'tiale' }
l['mno'] = { nom = 'langues manobos', tri = 'manobos langues' }
l['mnp'] = { nom = 'minbei' }
l['mnr'] = { nom = 'mono (États-Unis d’Amérique)', tri = 'mono etats unis damerique' }
l['mns'] = { nom = 'mansi' }
l['mnu'] = { nom = 'mer' }
l['mnv'] = { nom = 'rennellais' }
l['mnw'] = { nom = 'môn', wiktionnaire = true }
l['mnx'] = { nom = 'manikion' }
l['mnz'] = { nom = 'moni' }
l['mo'] = { nom = 'moldave' }
l['moa'] = { nom = 'mwan' }
l['moc'] = { nom = 'mocoví' }
l['mod'] = { nom = 'mobilien' }
l['moe'] = { nom = 'innu' }
l['moésien'] = { nom = 'moésien' }
l['mof'] = { nom = 'mohegan-montauk-narragansett' }
l['mog'] = { nom = 'mongondow' }
l['moh'] = { nom = 'mohawk' }
l['moi'] = { nom = 'mboi' }
l['mok'] = { nom = 'morori' }
l['mom'] = { nom = 'mangue' }
l['monégasque'] = { nom = 'monégasque' }
l['moo'] = { nom = 'monom' }
l['mop'] = { nom = 'mopan' }
l['mor'] = { nom = 'moro' }
l['mos'] = { nom = 'moré' }
l['mot'] = { nom = 'barí' }
l['mou'] = { nom = 'mogum' }
l['mov'] = { nom = 'mohave' }
l['mow'] = { nom = 'moï (Congo)' }
l['mox'] = { nom = 'molima' }
l['moy'] = { nom = 'shakacho' }
l['moyen danois'] = { nom = 'moyen danois', tri = 'danois moyen' }
l['moyen écossais'] = { nom = 'moyen écossais', tri = 'ecossais moyen' }
l['moyen khmer'] = { nom = 'moyen khmer', tri = 'khmer moyen' }
l['moyen polonais'] = { nom = 'moyen polonais', tri = 'polonais moyen' }
l['moyfaw'] = { nom = 'moyfaw' }
l['moz'] = { nom = 'gergiko' }
l['mpa'] = { nom = 'mpoto' }
l['mpb'] = { nom = 'mullukmulluk' }
l['mpc'] = { nom = 'mangarayi' }
l['mpd'] = { nom = 'machineri' }
l['mpe'] = { nom = 'majang' }
l['mpg'] = { nom = 'marba' }
l['mph'] = { nom = 'maung' }
l['mpi'] = { nom = 'mpade' }
l['mpj'] = { nom = 'martu wangka' }
l['mpk'] = { nom = 'mbara (Tchad)' }
l['mpl'] = { nom = 'watut central' }
l['mpm'] = { nom = 'mixtèque de Yosondúa', tri = 'mixteque yosondua' }
l['mpo'] = { nom = 'miu' }
l['mpp'] = { nom = 'migabac' }
l['mpq'] = { nom = 'matís' }
l['mpr'] = { nom = 'vangunu' }
l['mps'] = { nom = 'dadibi' }
l['mpt'] = { nom = 'mian' }
l['mpu'] = { nom = 'makuráp' }
l['mpv'] = { nom = 'mungkip' }
l['mpz'] = { nom = 'mpi' }
l['mqb'] = { nom = 'mbuko' }
l['mqe'] = { nom = 'matepi' }
l['mqf'] = { nom = 'momuna' }
l['mqj'] = { nom = 'mamasa' }
l['mqm'] = { nom = 'marquisien du Sud' }
l['mqn'] = { nom = 'moronene' }
l['mqo'] = { nom = 'modole' }
l['mqp'] = { nom = 'manipa' }
l['mqq'] = { nom = 'minokok' }
l['mqr'] = { nom = 'mander' }
l['mqs'] = { nom = 'makian de l’Ouest' }
l['mqu'] = { nom = 'mandari' }
l['mqv'] = { nom = 'mosimo' }
l['mqw'] = { nom = 'murupi' }
l['mqx'] = { nom = 'mamuju' }
l['mqy'] = { nom = 'manggarai' }
l['mqz'] = { nom = 'pano-malasanga' }
l['mr'] = { nom = 'marathe', wiktionnaire = true }
l['mra'] = { nom = 'mlabri' }
l['mrb'] = { nom = 'sungwadia' }
l['mrc'] = { nom = 'maricopa' }
l['mrd'] = { nom = 'magar de l’Ouest' }
l['mre'] = { nom = 'langue des signes de Martha’s Vineyard', tri = 'signes Marthas Vineyard' }
l['mrf'] = { nom = 'elseng' }
l['mrg'] = { nom = 'mising' }
l['mrh'] = { nom = 'mara chin' }
l['mrj'] = { nom = 'mari de l’Ouest' }
l['mrk'] = { nom = 'hmwaveke' }
l['mrl'] = { nom = 'mortlock' }
l['mrm'] = { nom = 'mwerlap' }
l['mrn'] = { nom = 'cheke holo' }
l['mro'] = { nom = 'mru' }
l['mrp'] = { nom = 'morouas' }
l['mrq'] = { nom = 'marquisien du Nord' }
l['mrr'] = { nom = 'maria (Inde)' }
l['mrs'] = { nom = 'maragus' }
l['mrt'] = { nom = 'margi' }
l['mru'] = { nom = 'mono (Cameroun)' }
l['mrv'] = { nom = 'mangarévien' }
l['mrw'] = { nom = 'maranao' }
l['mrx'] = { nom = 'maremgi' }
l['mry'] = { nom = 'mandaya' }
l['mrz'] = { nom = 'marind' }
l['ms'] = { nom = 'malais', wiktionnaire = true }
l['msb'] = { nom = 'masbatenyo' }
l['msc'] = { nom = 'sankaran' }
l['msd'] = { nom = 'langue des signes maya de Yucatec' }
l['mse'] = { nom = 'moussey' }
l['msf'] = { nom = 'mekwei' }
l['msg'] = { nom = 'moraid' }
l['msj'] = { nom = 'ma (Congo-Kinshasa)', tri = 'ma congo' }
l['msk'] = { nom = 'mansaka' }
l['msl'] = { nom = 'molof' }
l['msm'] = { nom = 'manobo agusan' }
l['msn'] = { nom = 'vurës' }
l['mso'] = { nom = 'mombum' }
l['msq'] = { nom = 'caac' }
l['msu'] = { nom = 'musom' }
l['mt'] = { nom = 'maltais', wiktionnaire = true }
l['mta'] = { nom = 'manobo de Cotabato', tri = 'manobo cotabato' }
l['mtb'] = { nom = 'agni morofoué' }
l['mtc'] = { nom = 'munit' }
l['mtd'] = { nom = 'mualang' }
l['mte'] = { nom = 'mono (Salomon)' }
l['mtf'] = { nom = 'murik (Papouasie-Nouvelle-Guinée)' }
l['mtg'] = { nom = 'una' }
l['mth'] = { nom = 'munggui' }
l['mti'] = { nom = 'maiwa (Papouasie-Nouvelle-Guinée)' }
l['mtj'] = { nom = 'moskona' }
l['mtl'] = { nom = 'montol' }
l['mtn'] = { nom = 'matagalpa' }
l['mto'] = { nom = 'mixe de Totontepec' }
l['mtp'] = { nom = 'wichi' }
l['mtq'] = { nom = 'muong' }
l['mtt'] = { nom = 'mota' }
l['mtu'] = { nom = 'mixtèque de Tututepec', tri = 'mixteque tututepec' }
l['mtv'] = { nom = 'asaro’o' }
l['mty'] = { nom = 'nabi' }
l['mua'] = { nom = 'moundang' }
l['mub'] = { nom = 'moubi' }
l['muc'] = { nom = 'mbu’' }
l['mud'] = { nom = 'aléoute de Medny' }
l['mug'] = { nom = 'mousgoum' }
l['muh'] = { nom = 'mündü' }
l['mui'] = { nom = 'musi' }
l['muj'] = { nom = 'mabire' }
l['mul'] = { nom = 'langues multiples', tri = '*multiples langues' }
l['mum'] = { nom = 'maiwala' }
l['mun'] = { nom = 'langues moundas', tri = 'moundas langues' }
l['mup'] = { nom = 'malvi' }
l['mur'] = { nom = 'murle' }
l['murut nabaay'] = { nom = 'murut nabaay' }
l['mus'] = { nom = 'creek' }
l['mus-sem'] = { nom = 'séminole' }
l['mut'] = { nom = 'muria occidental' }
l['muu'] = { nom = 'yaaku' }
l['muv'] = { nom = 'muduva' }
l['mux'] = { nom = 'bo-ung' }
l['muy'] = { nom = 'muyang' }
l['muz'] = { nom = 'mursi' }
l['mva'] = { nom = 'manam' }
l['mvb'] = { nom = 'mattole' }
l['mvf'] = { nom = 'mongol de Chine' }
l['mvi'] = { nom = 'miyako' }
l['mvm'] = { nom = 'muya' }
l['mvo'] = { nom = 'marovo' }
l['mvp'] = { nom = 'duri' }
l['mvr'] = { nom = 'marau' }
l['mvt'] = { nom = 'mpotovoro' }
l['mvv'] = { nom = 'murut tagol' }
l['mvz'] = { nom = 'mesqan' }
l['mwd'] = { nom = 'mudbura' }
l['mwe'] = { nom = 'mwera (Chimwera)' }
l['mwf'] = { nom = 'murrinh-patha' }
l['mwg'] = { nom = 'aiklep' }
l['mwi'] = { nom = 'ninde' }
l['mwk'] = { nom = 'maninka de Kita' }
l['mwl'] = { nom = 'mirandais' }
l['mwm'] = { nom = 'sar' }
l['mwo'] = { nom = 'maewo central' }
l['mwp'] = { nom = 'kala lagaw ya' }
l['mwr'] = { nom = 'marvari' }
l['mwt'] = { nom = 'moken' }
l['mww'] = { nom = 'hmong blanc' }
l['mxb'] = { nom = 'mixtèque de Tezoatlán', tri = 'mixteque tezoatlan' }
l['mxd'] = { nom = 'modang' }
l['mxe'] = { nom = 'ifira-mele' }
l['mxi'] = { nom = 'mozarabe' }
l['mxj'] = { nom = 'miju' }
l['mxk'] = { nom = 'monumbo' }
l['mxn'] = { nom = 'moï (Indonésie)' }
l['mxp'] = { nom = 'mixe de Tlahuitoltepec' }
l['mxr'] = { nom = 'murik' }
l['mxt'] = { nom = 'mixtèque de Jamiltepec', tri = 'mixteque jamiltepec' }
l['mxx'] = { nom = 'mahou' }
l['mxy'] = { nom = 'mixtèque de Nochixtlán du Sud-Est', tri = 'mixteque nochixtlan sud est' }
l['mxz'] = { nom = 'masela central' }
l['my'] = { nom = 'birman', wiktionnaire = true }
l['myb'] = { nom = 'mbay' }
l['mye'] = { nom = 'myènè' }
l['myf'] = { nom = 'mao du Nord' }
l['myg'] = { nom = 'manta' }
l['myh'] = { nom = 'makah' }
l['myk'] = { nom = 'mamara' }
l['myl'] = { nom = 'moma' }
l['mym'] = { nom = 'me’en' }
l['myn'] = { nom = 'langues mayas', tri = 'mayas langues' }
l['myp'] = { nom = 'pirahã' }
l['myq'] = { nom = 'maninka de forêt' }
l['myr'] = { nom = 'muniche' }
l['mysien'] = { nom = 'mysien' }
l['myu'] = { nom = 'mundurukú' }
l['myv'] = { nom = 'erza' }
l['myw'] = { nom = 'muyuw' }
l['myx'] = { nom = 'masaba' }
l['myy'] = { nom = 'macuna' }
l['mza'] = { nom = 'mixtèque de Santa María Zacatepec', tri = 'mixteque santa maria zacatepec' }
l['mzb'] = { nom = 'mozabite' }
l['mzd'] = { nom = 'malimba' }
l['mzh'] = { nom = 'wichí lhamtés güisnay' }
l['mzi'] = { nom = 'mazatèque d’Ixcatlán', tri = 'mazateque ixcatlan' }
l['mzj'] = { nom = 'manya' }
l['mzk'] = { nom = 'mambila de l’Ouest' }
l['mzm'] = { nom = 'mumuye' }
l['mzn'] = { nom = 'mazandarani' }
l['mzp'] = { nom = 'movima' }
l['mzq'] = { nom = 'mori atas' }
l['mzr'] = { nom = 'marúbo' }
l['mzs'] = { nom = 'créole de Macao', tri = 'creole macao' }
l['mzv'] = { nom = 'manza' }
l['mzw'] = { nom = 'deg' }
l['na'] = { nom = 'nauruan', wiktionnaire = true }
l['naa'] = { nom = 'namla' }
l['nab'] = { nom = 'nambikwara du Sud' }
l['nac'] = { nom = 'narak' }
l['nad'] = { nom = 'nijadali' }
l['nadou'] = { nom = 'nadou' }
l['nae'] = { nom = 'naka’ela' }
l['naf'] = { nom = 'nabak' }
l['nag'] = { nom = 'nagamais' }
l['nah'] = { nom = 'nahuatl', wiktionnaire = true }
l['nai'] = { nom = 'langues nord-amérindiennes', tri = 'nord amerindiennes langues' }
l['nak'] = { nom = 'nakanai' }
l['nal'] = { nom = 'nalik' }
l['nam'] = { nom = 'ngan’gityemerri' }
l['nan'] = { nom = 'minnan', wmlien = 'zh-min-nan', wiktionnaire = true }
l['nanga ira’'] = { nom = 'nanga ira’' }
l['nao'] = { nom = 'naaba' }
l['nap'] = { nom = 'napolitain' }
l['naq'] = { nom = 'nama (khoe)' }
l['nar'] = { nom = 'iguta' }
l['nas'] = { nom = 'naasioi' }
l['nat'] = { nom = 'hungworo' }
l['navarro-aragonais'] = { nom = 'navarro-aragonais' }
l['na’vi'] = { nom = 'na’vi' }
l['naw'] = { nom = 'nawuri' }
l['nay'] = { nom = 'ngarrindjeri' }
l['naz'] = { nom = 'nahuatl du Coatepec', tri = 'nahuatl Coatepec' }
l['nb'] = { nom = 'norvégien (bokmål)', wmlien = 'no', wiktionnaire = true }
l['nba'] = { nom = 'ngangela' }
l['nbb'] = { nom = 'ndoe' }
l['nbc'] = { nom = 'chang naga' }
l['nbe'] = { nom = 'konyak' }
l['nbh'] = { nom = 'ngamo' }
l['nbi'] = { nom = 'mao' }
l['nbk'] = { nom = 'nake' }
l['nbn'] = { nom = 'kuri' }
l['nbp'] = { nom = 'nnam' }
l['nbr'] = { nom = 'numana-nunku-gbantu-numbu' }
l['nbt'] = { nom = 'nah' }
l['nbu'] = { nom = 'rongmei' }
l['nbv'] = { nom = 'ngamambo' }
l['nbw'] = { nom = 'ngbandi du Sud' }
l['nca'] = { nom = 'iyo' }
l['ncb'] = { nom = 'nicobarais central' }
l['ncd'] = { nom = 'nachering' }
l['nce'] = { nom = 'yale' }
l['ncg'] = { nom = 'nisga’a' }
l['nch'] = { nom = 'nahuatl de la Huasteca central', tri = 'nahuatl Huasteca central' }
l['nci'] = { nom = 'nahuatl classique' }
l['ncj'] = { nom = 'nahuatl du Puebla du Nord', tri = 'nahuatl Puebla nord' }
l['nck'] = { nom = 'nakara' }
l['ncl'] = { nom = 'nahuatl du Michoacán', tri = 'nahuatl Michoacan' }
l['ncr'] = { nom = 'ncane' }
l['nct'] = { nom = 'naga des Chothe', tri = 'naga chothe' }
l['ncx'] = { nom = 'nahuatl du Puebla central', tri = 'nahuatl Puebla central' }
l['ncz'] = { nom = 'natchez' }
l['nd'] = { nom = 'ndébélé du Nord' }
l['nda'] = { nom = 'ndasa' }
l['ndc'] = { nom = 'ndau' }
l['ndd'] = { nom = 'nde-nsele-nta' }
l['ndg'] = { nom = 'ndengereko' }
l['ndh'] = { nom = 'ndali' }
l['ndi'] = { nom = 'samba leko' }
l['ndj'] = { nom = 'ndamba' }
l['ndm'] = { nom = 'ndam' }
l['ndp'] = { nom = 'ndo' }
l['ndr'] = { nom = 'ndoola' }
l['nds'] = { nom = 'bas allemand', tri = 'allemand bas', wiktionnaire = true }
l['nds-nl'] = { nom = 'bas-saxon néerlandais', tri = 'saxon bas neerlandais' }
l['ndt'] = { nom = 'ndunga' }
l['ndu'] = { nom = 'dugun' }
l['ndv'] = { nom = 'ndut' }
l['ndy'] = { nom = 'luto' }
l['ndz'] = { nom = 'ndogo' }
l['ne'] = { nom = 'népalais', wiktionnaire = true }
l['nea'] = { nom = 'ngadha de l’Est' }
l['neb'] = { nom = 'toura (Côte d’Ivoire)', tri = 'toura cote divoire' }
l['nec'] = { nom = 'nedebang' }
l['ned'] = { nom = 'nde-gbite' }
l['nee'] = { nom = 'nêlêmwa-nixumwak' }
l['nef'] = { nom = 'néfamais' }
l['neg'] = { nom = 'neguidal' }
l['neh'] = { nom = 'nyenkha' }
l['nei'] = { nom = 'néo-hittite', tri = 'hittite neo' }
l['nej'] = { nom = 'neko' }
l['nek'] = { nom = 'neku' }
l['nem'] = { nom = 'nemi' }
l['nen'] = { nom = 'nengone' }
l['neo'] = { nom = 'ná-meo' }
l['ner'] = { nom = 'yahadian' }
l['nes'] = { nom = 'kinnauri de Bhoti' }
l['net'] = { nom = 'nete' }
l['neu'] = { nom = 'neo' }
l['nev'] = { nom = 'nyaheun' }
l['new'] = { nom = 'newari' }
l['newari du Dolakha'] = { nom = 'newari du Dolakha', tri = 'newari dolakha' }
l['nex'] = { nom = 'neme' }
l['ney'] = { nom = 'néyo' }
l['nez'] = { nom = 'nez-percé' }
l['nfa'] = { nom = 'dhao' }
l['nfd'] = { nom = 'ahwaï' }
l['nfl'] = { nom = 'äiwoo' }
l['nfr'] = { nom = 'nafaanra' }
l['ng'] = { nom = 'ndonga' }
l['nga'] = { nom = 'ngbaka minagende' }
l['ngadjuri'] = { nom = 'ngadjuri' }
l['ngb'] = { nom = 'ngbandi du Nord' }
l['ngc'] = { nom = 'ngombe (République démocratique du Congo)', tri = 'ngombe congo' }
l['ngd'] = { nom = 'ngando (République centrafricaine)', tri = 'ngando centrafrique' }
l['nge'] = { nom = 'mankon' }
l['ngf'] = { nom = 'langues trans-néo-guinéennes', tri = 'guineennes trans neo langues' }
l['ngg'] = { nom = 'ngbaka manza' }
l['ngh'] = { nom = 'nǀu', tri = 'nu' }
l['ngi'] = { nom = 'ngizim' }
l['ngj'] = { nom = 'ngie' }
l['ngk'] = { nom = 'dalabon' }
l['ngl'] = { nom = 'elomwe' }
l['ngn'] = { nom = 'ngwo' }
l['ngo'] = { nom = 'ngoni' }
l['ngp'] = { nom = 'nguu' }
l['ngr'] = { nom = 'engdewu' }
l['ngs'] = { nom = 'gvoko' }
l['ngt'] = { nom = 'ngeq' }
l['ngu'] = { nom = 'nahuatl de Guerrero', tri = 'nahuatl Guerrero' }
l['ngv'] = { nom = 'nagumi' }
l['nha'] = { nom = 'nhanda' }
l['nhb'] = { nom = 'beng' }
l['nhc'] = { nom = 'nahuatl du Tabasco', tri = 'nahuatl Tabasco' }
l['nhd'] = { nom = 'guarani paraguayen' } -- aussi gug
l['nhe'] = { nom = 'nahuatl de la Huasteca oriental', tri = 'nahuatl Huasteca oriental' }
l['nhg'] = { nom = 'nahuatl de Tetelcingo', tri = 'nahuatl Tetelcingo' }
l['nhi'] = { nom = 'nahuatl de Zacatlán', tri = 'nahuatl Zacatlan' }
l['nhk'] = { nom = 'nahuatl de l’isthme de Cosoleacaque', tri = 'nahuatl Cosoleacaque isthme' }
l['nhm'] = { nom = 'nahuatl du Morelos', tri = 'nahuatl Morelos' }
l['nhn'] = { nom = 'nahuatl central' }
l['nho'] = { nom = 'takuu' }
l['nhp'] = { nom = 'nahuatl de l’isthme de Pajapan', tri = 'nahuatl Pajapan isthme' }
l['nhq'] = { nom = 'nahuatl de Huaxcaleca', tri = 'nahuatl Huaxcaleca' }
l['nhr'] = { nom = 'naro' }
l['nht'] = { nom = 'nahuatl de l’Ometepec', tri = 'nahuatl Ometepec' }
l['nhu'] = { nom = 'noone' }
l['nhv'] = { nom = 'nahuatl du Temascaltepec', tri = 'nahuatl Temascaltepec' }
l['nhw'] = { nom = 'nahuatl de la Huasteca occidental', tri = 'nahuatl Huasteca occidental' }
l['nhx'] = { nom = 'nahuatl de l’isthme de Mecayapan', tri = 'nahuatl Mecayapan isthme' }
l['nhy'] = { nom = 'nahuatl de l’Oaxaca du Nord', tri = 'nahuatl Oaxaca nord' }
l['nhz'] = { nom = 'nahuatl de Santa María la Alta', tri = 'nahuatl Santa Maria la Alta' }
l['nia'] = { nom = 'nias', wiktionnaire = true }
l['nib'] = { nom = 'nakame' }
l['nic'] = { nom = 'langues nigéro-kordofaniennes', tri = 'nigero kordofaniennes langues' }
l['nid'] = { nom = 'ngandi' }
l['nie'] = { nom = 'niellim' }
l['nif'] = { nom = 'nek' }
l['nig'] = { nom = 'ngalakan' }
l['nih'] = { nom = 'nyiha (Tanzanie)' }
l['nii'] = { nom = 'nii' }
l['nij'] = { nom = 'ngaju dayak' }
l['nik'] = { nom = 'grand nicobar' }
l['nil'] = { nom = 'nila' }
l['nim'] = { nom = 'nilamba' }
l['nin'] = { nom = 'ninzo' }
l['nio'] = { nom = 'nganassan' }
l['nipissing'] = { nom = 'nipissing' }
l['niq'] = { nom = 'nandi' }
l['nir'] = { nom = 'nimboran' }
l['nis'] = { nom = 'nimi' }
l['nit'] = { nom = 'kolami du Sud-Est' }
l['niu'] = { nom = 'niuéen' }
l['niv'] = { nom = 'nivkh' }
l['niw'] = { nom = 'nimo' }
l['niy'] = { nom = 'ngiti' }
l['niz'] = { nom = 'ningil' }
l['nja'] = { nom = 'nzanyi' }
l['njh'] = { nom = 'lotha' }
l['nji'] = { nom = 'gudanji' }
l['njj'] = { nom = 'njen' }
l['njl'] = { nom = 'njalgulgule' }
l['njm'] = { nom = 'angami' }
l['njn'] = { nom = 'liangmai' }
l['njo'] = { nom = 'ao' }
l['njr'] = { nom = 'njerep' }
l['njs'] = { nom = 'nisa' }
l['njt'] = { nom = 'pidgin ndyuka-trio' }
l['nkd'] = { nom = 'koireng' }
l['nkg'] = { nom = 'nekgini' }
l['nkh'] = { nom = 'khezha' }
l['nki'] = { nom = 'thangal'}
l['nkj'] = { nom = 'nakai' }
l['nkk'] = { nom = 'nokuku' }
l['nkm'] = { nom = 'namat' }
l['nko'] = { nom = 'nkonya' }
l['nkp'] = { nom = 'niuatoputapu' }
l['nkr'] = { nom = 'nukuoro' }
l['nkx'] = { nom = 'nkoroo' }
l['nkz'] = { nom = 'nkari' }
l['nl'] = { nom = 'néerlandais', portail = true, wiktionnaire = true }
l['nla'] = { nom = 'ngombale' }
l['nlc'] = { nom = 'nalca' }
l['nld'] = { nom = 'flamand oriental' }
l['nle'] = { nom = 'nyala de l’Est' }
l['nlg'] = { nom = 'gela' }
l['nll'] = { nom = 'nihali' }
l['nln'] = { nom = 'nahuatl du Durango', tri = 'nahuatl Durango' }
l['nlu'] = { nom = 'nchumbulu' }
l['nlv'] = { nom = 'nahuatl de l’Orizaba', tri = 'nahuatl Orizaba' }
l['nly'] = { nom = 'nyamal' }
l['nlz'] = { nom = 'nalögo' }
l['nma'] = { nom = 'maram naga' }
l['nmb'] = { nom = 'big nambas' }
l['nme'] = { nom = 'mzieme naga' }
l['nmf'] = { nom = 'tangkhul naga' }
l['nmk'] = { nom = 'namakura' }
l['nml'] = { nom = 'ndemli' }
l['nmm'] = { nom = 'manangba' }
l['nmn'] = { nom = 'ǃxóõ', tri = 'xoo' }
l['nmq'] = { nom = 'nambya' }
l['nms'] = { nom = 'letemboi' }
l['nmu'] = { nom = 'maidu du Nord-Est' }
l['nmv'] = { nom = 'ngamini' }
l['nmx'] = { nom = 'nama (papou)' }
l['nmy'] = { nom = 'namuyi' }
l['nmz'] = { nom = 'nawdm' }
l['nn'] = { nom = 'norvégien (nynorsk)', wmlien = 'no', wiktionnaire = true }
l['nna'] = { nom = 'nyangumarta' }
l['nnb'] = { nom = 'kinande' }
l['nnc'] = { nom = 'nancere' }
l['nne'] = { nom = 'ngandyera' }
l['nnf'] = { nom = 'ngaing' }
l['nng'] = { nom = 'maring naga' }
l['nnh'] = { nom = 'ngiemboon' }
l['nnj'] = { nom = 'nyangatom' }
l['nnm'] = { nom = 'namia' }
l['nnn'] = { nom = 'ngueté' }
l['nnp'] = { nom = 'naga wancho' }
l['nnq'] = { nom = 'ngindo' }
l['nnr'] = { nom = 'narungga' }
l['nns'] = { nom = 'ningye' }
l['nnt'] = { nom = 'nanticoke' }
l['nnv'] = { nom = 'nugunu (Australie)' }
l['nnw'] = { nom = 'nuni du Sud' }
l['no'] = { nom = 'norvégien', wiktionnaire = true }
l['noa'] = { nom = 'wounaan' }
l['noc'] = { nom = 'nuk' }
l['nod'] = { nom = 'thaï du Nord' }
l['noe'] = { nom = 'nimadi' }
l['nog'] = { nom = 'nogaï' }
l['noi'] = { nom = 'noiri' }
l['noj'] = { nom = 'nonuya' }
l['nok'] = { nom = 'nooksack' }
l['nol'] = { nom = 'nomlaki' }
l['nom'] = { nom = 'nokamán' }
l['non'] = { nom = 'vieux norrois', tri = 'norrois vieux' }
l['noo'] = { nom = 'nootka' }
l['nop'] = { nom = 'numanggang' }
l['nordique commun'] = { nom = 'nordique commun' }
l['normand'] = { nom = 'normand', wmlien = 'nrm' }
l['nos'] = { nom = 'yi oriental' }
l['not'] = { nom = 'nomatsiguenga' }
l['nou'] = { nom = 'ewage-notu' }
l['nov'] = { nom = 'novial' }
l['now'] = { nom = 'nyambo' }
l['noz'] = { nom = 'nayi' }
l['npa'] = { nom = 'nar phu' }
l['nph'] = { nom = 'phom' }
l['npl'] = { nom = 'nahuatl du Puebla du Sud-Est', tri = 'nahuatl Puebla sud-est' }
l['npn'] = { nom = 'mondropolon' }
l['npy'] = { nom = 'napu' }
l['nqm'] = { nom = 'ndom' }
l['nqo'] = { nom = 'n’ko' }
l['nr'] = { nom = 'ndébélé du Sud' }
l['nra'] = { nom = 'ngom' }
l['nrb'] = { nom = 'nara' }
l['nrc'] = { nom = 'norique' }
l['nre'] = { nom = 'naga des Rengma du Sud', tri = 'naga rengma sud' }
l['nrg'] = { nom = 'narango' }
l['nri'] = { nom = 'chokri' }
l['nrk'] = { nom = 'ngarla' }
l['nrl'] = { nom = 'ngarluma' }
l['nrm'] = { nom = 'narum' }
l['nrn'] = { nom = 'norne' }
l['nrp'] = { nom = 'picène du Nord' }
l['nrr'] = { nom = 'nora' }
l['nrt'] = { nom = 'kalapuya du Nord', tri = 'kalapuya nord' }
l['nru'] = { nom = 'mosuo' }
l['nrx'] = { nom = 'ngurmbur' }
l['nrz'] = { nom = 'lala' }
l['nsa'] = { nom = 'naga de Sangtam', tri = 'naga sangtam' }
l['nsc'] = { nom = 'nshi' }
l['nsf'] = { nom = 'nisu du Nord-Ouest' }
l['nsg'] = { nom = 'ongamo' }
l['nsh'] = { nom = 'ngoshie' }
l['nsk'] = { nom = 'naskapi' }
l['nsm'] = { nom = 'sema' }
l['nsn'] = { nom = 'nehan' }
l['nso'] = { nom = 'sotho du Nord' }
l['nsq'] = { nom = 'miwok de la Sierra du Nord', tri = 'miwok sierra nord' }
l['nst'] = { nom = 'tangsa' }
l['nsu'] = { nom = 'nahuatl de la Sierra Negra', tri = 'nahuatl Sierra Negra' }
l['nsw'] = { nom = 'navut' }
l['nsy'] = { nom = 'nasal' }
l['nsz'] = { nom = 'nisenan' }
l['nte'] = { nom = 'nathembo' }
l['nti'] = { nom = 'natioro' }
l['ntj'] = { nom = 'ngaanyatjarra' }
l['ntk'] = { nom = 'ikoma-nata-isenye' }
l['ntm'] = { nom = 'naténi' }
l['ntp'] = { nom = 'tepehuan du Nord' }
l['ntu'] = { nom = 'natügu' }
l['ntw'] = { nom = 'nottoway' }
l['ntz'] = { nom = 'natanzi' }
l['nua'] = { nom = 'yuanga' }
l['nub'] = { nom = 'langues nubiennes', tri = 'nubiennes langues' }
l['nuc'] = { nom = 'nukuini' }
l['nud'] = { nom = 'ngala' }
l['nue'] = { nom = 'ngundu' }
l['nuf'] = { nom = 'nusu' }
l['nug'] = { nom = 'nungali' }
l['nuh'] = { nom = 'ndunda' }
l['nui'] = { nom = 'ngumbi' }
l['nuj'] = { nom = 'nyole' }
l['nuk'] = { nom = 'nuu-chah-nulth' }
l['nul'] = { nom = 'nusa laut' }
l['num'] = { nom = 'niuafo’ou' }
l['nun'] = { nom = 'anong' }
l['nunu de Bama'] = { nom = 'nunu de Bama' }
l['nuo'] = { nom = 'nguôn' }
l['nup'] = { nom = 'nupe-nupe-tako' }
l['nuq'] = { nom = 'nukumanu' }
l['nur'] = { nom = 'nukuria' }
l['nus'] = { nom = 'naath' }
l['nut'] = { nom = 'nung (Viêt Nam)' }
l['nutabe'] = { nom = 'nutabe' }
l['nuu'] = { nom = 'ngbundu' }
l['nuv'] = { nom = 'nuni du Nord' }
l['nuw'] = { nom = 'nguluwan' }
l['nux'] = { nom = 'mehek' }
l['nuy'] = { nom = 'nunggubuyu' }
l['nuz'] = { nom = 'nahuatl de Tlamacazapa', tri = 'nahuatl Tlamacazapa' }
l['nv'] = { nom = 'navajo' }
l['nvh'] = { nom = 'nasarian' }
l['nvo'] = { nom = 'nyokon' }
l['nwa'] = { nom = 'nawathinehena' }
l['nwc'] = { nom = 'newari classique' }
l['nwg'] = { nom = 'ngayawang' }
l['nwi'] = { nom = 'tanna du Sud-Ouest' }
l['nwm'] = { nom = 'nyamusa-molo' }
l['nwr'] = { nom = 'nawaru' }
l['nwy'] = { nom = 'nottoway-meherrin' }
l['nxa'] = { nom = 'naueti' }
l['nxd'] = { nom = 'ngando (République démocratique du Congo)', tri = 'ngando congo' }
l['nxe'] = { nom = 'nage' }
l['nxg'] = { nom = 'ngadha' }
l['nxq'] = { nom = 'naxi' }
l['nxr'] = { nom = 'ninggerum' }
l['nxu'] = { nom = 'narau' }
l['nxx'] = { nom = 'nafri' }
l['ny'] = { nom = 'nyanja' }
l['nya'] = { nom = 'chichewa' }
l['nyb'] = { nom = 'nyangbo' }
l['nye'] = { nom = 'nyengo' }
l['nyh'] = { nom = 'nyigina' }
l['nyi'] = { nom = 'ama (Soudan)' }
l['nyk'] = { nom = 'nyaneka' }
l['nyl'] = { nom = 'nyeu' }
l['nym'] = { nom = 'nyamwezi' }
l['nyn'] = { nom = 'nyankore' }
l['nyo'] = { nom = 'nyoro' }
l['nyp'] = { nom = 'nyangi' }
l['nyr'] = { nom = 'nyiha (Malawi)' }
l['nys'] = { nom = 'noongar' }
l['nyt'] = { nom = 'nyawaygi' }
l['nyu'] = { nom = 'nyungwe' }
l['nyx'] = { nom = 'nganyaywana' }
l['nyy'] = { nom = 'nyakyusa-ngonde' }
l['nzb'] = { nom = 'nzèbi' }
l['nzi'] = { nom = 'nzéma' }
l['nzz'] = { nom = 'nanga' }
l['oaa'] = { nom = 'orok' }
l['oac'] = { nom = 'orotch' }
l['oar'] = { nom = 'araméen ancien' }
l['oav'] = { nom = 'avar ancien' }
l['obi'] = { nom = 'obispeño' }
l['obk'] = { nom = 'bontok du Sud' }
l['obl'] = { nom = 'oblo' }
l['obm'] = { nom = 'moabite' }
l['obo'] = { nom = 'obo' }
l['obr'] = { nom = 'vieux birman', tri = 'birman vieux' }
l['obt'] = { nom = 'vieux breton', tri = 'breton vieux' }
l['obu'] = { nom = 'obulom' }
l['oc'] = { nom = 'occitan', wiktionnaire = true }
l['oca'] = { nom = 'ocaina' }
l['och'] = { nom = 'chinois archaïque' }
l['oco'] = { nom = 'vieux cornique', tri = 'cornique vieux' }
l['ocu'] = { nom = 'matlatzinca d’Atzingo' }
l['oda'] = { nom = 'odut' }
l['odt'] = { nom = 'vieux néerlandais', tri = 'neerlandais vieux' }
l['odu'] = { nom = 'odual' }
l['ofo'] = { nom = 'ofo' }
l['ofs'] = { nom = 'vieux frison', tri = 'frison vieux' }
l['ofu'] = { nom = 'efutop' }
l['ogb'] = { nom = 'ogbia' }
l['ogc'] = { nom = 'ogba' }
l['oge'] = { nom = 'ancien géorgien', tri = 'georgien ancien' }
l['ogg'] = { nom = 'ogbogolo' }
l['ogo'] = { nom = 'khana' }
l['ogu'] = { nom = 'ogbronuagum' }
l['ohu'] = { nom = 'ancien hongrois', tri = 'hongrois ancien' }
l['oia'] = { nom = 'oirata' }
l['oin'] = { nom = 'one d’Inebu', tri = 'one inebu' }
l['oj'] = { nom = 'ojibwa' }
l['ojb'] = { nom = 'ojibwa du Nord-Ouest' }
l['ojc'] = { nom = 'ojibwa central' }
l['ojg'] = { nom = 'ojibwa de l’Est' }
l['ojp'] = { nom = 'ancien japonais', tri = 'japonais ancien' }
l['ojs'] = { nom = 'oji-cri' }
l['ojv'] = { nom = 'luangiua' }
l['ojw'] = { nom = 'saulteaux' }
l['oka'] = { nom = 'colville-okanagan' }
l['okb'] = { nom = 'okobo' }
l['okd'] = { nom = 'okodia' }
l['oke'] = { nom = 'okpe (langue édoïde du Sud-Ouest)', tri = 'okpe edoide sud ouest' }
l['oki'] = { nom = 'okiek' }
l['okm'] = { nom = 'moyen coréen', tri = 'coreen moyen' }
l['okn'] = { nom = 'oki-no-erabu' }
l['oko'] = { nom = 'ancien coréen', tri = 'coreen ancien' }
l['okr'] = { nom = 'kirike' }
l['oku'] = { nom = 'oku' }
l['okx'] = { nom = 'okpe (langue édoïde du Nord-Ouest)', tri = 'okpe edoide nord ouest' }
l['ola'] = { nom = 'walungge' }
l['old'] = { nom = 'mochi' }
l['ole'] = { nom = 'olekha' }
l['olk'] = { nom = 'olkol' }
l['olm'] = { nom = 'oloma' }
l['olo'] = { nom = 'olonetsien' }
l['olr'] = { nom = 'olrat' }
l['olt'] = { nom = 'vieux lituanien', tri = 'lituanien vieux' }
l['olu'] = { nom = 'kuvale' }
l['om'] = { nom = 'oromo', wiktionnaire = true }
l['oma'] = { nom = 'omaha-ponca' }
l['omb'] = { nom = 'ambae de l’Est' }
l['omc'] = { nom = 'mochica' }
l['ome'] = { nom = 'omejes' }
l['omg'] = { nom = 'omagua' }
l['omi'] = { nom = 'omi' }
l['oml'] = { nom = 'ombo' }
l['omn'] = { nom = 'minoéen' }
l['omo'] = { nom = 'utarmbung' }
l['omp'] = { nom = 'ancien manipouri', tri = 'manipouri ancien' }
l['omq'] = { nom = 'langues otomangues', tri = 'otomangues langues' }
l['omr'] = { nom = 'vieux marathi', tri = 'marathi vieux' }
l['omt'] = { nom = 'omotik' }
l['omu'] = { nom = 'omurana' }
l['omv'] = { nom = 'langues omotiques', tri = 'omotiques langues' }
l['omx'] = { nom = 'vieux môn', tri = 'mon vieux' }
l['ona'] = { nom = 'selknam' }
l['onb'] = { nom = 'lingao' }
l['one'] = { nom = 'oneida' }
l['ong'] = { nom = 'olo' }
l['oni'] = { nom = 'onin' }
l['onk'] = { nom = 'one de Kabore', tri = 'one kabore' }
l['onn'] = { nom = 'onobasulu' }
l['ono'] = { nom = 'onondaga' }
l['onom'] = { nom = 'onomatopée', tri = '*onomatopee' }
l['onp'] = { nom = 'sartang' }
l['ons'] = { nom = 'ono' }
l['ont'] = { nom = 'ontena' }
l['onu'] = { nom = 'unua' }
l['onw'] = { nom = 'ancien nubien', tri = 'nubien ancien' }
l['ood'] = { nom = 'tohono o’odham' }
l['oog'] = { nom = 'ong' }
l['oon'] = { nom = 'onge' }
l['oos'] = { nom = 'ossète ancien' }
l['opa'] = { nom = 'okpamheri' }
l['opm'] = { nom = 'oksapmin' }
l['opo'] = { nom = 'opao' }
l['opt'] = { nom = 'opata' }
l['opy'] = { nom = 'ofayé' }
l['or'] = { nom = 'oriya', wiktionnaire = true }
l['ora'] = { nom = 'oroha' }
l['orc'] = { nom = 'orma' }
l['ore'] = { nom = 'orejón' }
l['org'] = { nom = 'oring' }
l['orh'] = { nom = 'oroqen' }
l['orléanais'] = { nom = 'orléanais' }
l['oro'] = { nom = 'orokolo' }
l['orr'] = { nom = 'oruma' }
l['ors'] = { nom = 'orang seletar' }
l['ort'] = { nom = 'oriya kotia' }
l['oru'] = { nom = 'ormuri' }
l['orv'] = { nom = 'vieux russe', tri = 'russe vieux' }
l['orx'] = { nom = 'oro' }
l['orz'] = { nom = 'ormu' }
l['os'] = { nom = 'ossète' }
l['osa'] = { nom = 'osage' }
l['osc'] = { nom = 'osque' }
l['osi'] = { nom = 'osing' }
l['osp'] = { nom = 'vieil espagnol', tri = 'espagnol vieil' }
l['ost'] = { nom = 'osatu' }
l['osx'] = { nom = 'vieux saxon', tri = 'saxon vieux' }
l['ota'] = { nom = 'turc ottoman' }
l['otb'] = { nom = 'tibétain ancien' }
l['otd'] = { nom = 'dohoi' }
l['ote'] = { nom = 'otomi de la vallée de Mezquital', tri = 'otomi mezquital vallee' }
l['otk'] = { nom = 'vieux turc', tri = 'turc vieux' }
l['otl'] = { nom = 'otomi de Tilapa', tri = 'otomi tilapa' }
l['otm'] = { nom = 'otomi de la Sierra', tri = 'otomi sierra' }
l['otn'] = { nom = 'otomi de Tenango', tri = 'otomi tenango' }
l['oto'] = { nom = 'langues otomies', tri = 'otomies langues' }
l['otq'] = { nom = 'otomi de Querétaro', tri = 'otomi queretaro' }
l['otr'] = { nom = 'otoro' }
l['ots'] = { nom = 'otomi de l’état de Mexico', tri = 'otomi mexico etat' }
l['ott'] = { nom = 'otomi de Temoaya', tri = 'otomi temoaya' }
l['otw'] = { nom = 'ottawa' }
l['otx'] = { nom = 'otomi de Texcatepec', tri = 'otomi texcatepec' }
l['otz'] = { nom = 'otomi d’Ixtenco', tri = 'otomi ixtenco' }
l['oua'] = { nom = 'tagargrent' }
l['oue'] = { nom = 'oune' }
l['oui'] = { nom = 'vieil-ouïghour', tri = 'ouighour vieil' }
l['oum'] = { nom = 'ouma' }
l['oun'] = { nom = '’o’ung', tri = 'o ung' }
l['ovd'] = { nom = 'elfdalien' }
l['owi'] = { nom = 'owiniga' }
l['owl'] = { nom = 'vieux gallois', tri = 'gallois vieux' }
l['oyb'] = { nom = 'oy' }
l['oyd'] = { nom = 'oyda' }
l['oym'] = { nom = 'wayampi' }
l['ozm'] = { nom = 'koonzime' }
l['pa'] = { nom = 'pendjabi', wiktionnaire = true }
l['paa'] = { nom = 'langues papoues', tri = 'papoues langues' }
l['pab'] = { nom = 'parecís' }
l['pac'] = { nom = 'pacoh' }
l['pad'] = { nom = 'paumarí' }
l['pae'] = { nom = 'pagibete' }
l['paf'] = { nom = 'paranawát' }
l['pag'] = { nom = 'pangasinan' }
l['pah'] = { nom = 'parintintin' }
l['pai'] = { nom = 'pe' }
l['paikoneka'] = { nom = 'paikoneka' }
l['pak'] = { nom = 'parakanã' }
l['pal'] = { nom = 'pehlevi' }
l['pam'] = { nom = 'kapampangan' }
l['pandunia'] = { nom = 'pandunia' }
l['pannonien'] = { nom = 'pannonien' }
l['pao'] = { nom = 'paiute du Nord' }
l['pap'] = { nom = 'papiamento' }
l['par'] = { nom = 'timbisha' }
l['pas'] = { nom = 'papasena' }
l['pat'] = { nom = 'papitalai' }
l['patagón de Bagua'] = { nom = 'patagón de Bagua' }
l['patagón de Perico'] = { nom = 'patagón de Perico' }
l['patwin du Sud'] = { nom = 'patwin du Sud' }
l['pau'] = { nom = 'palau' }
l['pav'] = { nom = 'wari’' }
l['paw'] = { nom = 'pawnee' }
l['pax'] = { nom = 'pankararé' }
l['pay'] = { nom = 'pech' }
l['paz'] = { nom = 'pankararú' }
l['pbb'] = { nom = 'paez' }
l['pbf'] = { nom = 'popoloca de Coyotepec' }
l['pbh'] = { nom = 'e’ñepa' }
l['pbi'] = { nom = 'parkwa' }
l['pbl'] = { nom = 'mak (Nigeria)' }
l['pbn'] = { nom = 'kpasam' }
l['pbr'] = { nom = 'pangwa' }
l['pbs'] = { nom = 'pame central' }
l['pbt'] = { nom = 'pachto du Sud' }
l['pbu'] = { nom = 'pachto du Nord' }
l['pbv'] = { nom = 'pnar' }
l['pby'] = { nom = 'pyu (Papouasie Nouvelle-Guinée)' }
l['pca'] = { nom = 'popoloca de Santa Inés Ahuatempan' }
l['pcb'] = { nom = 'pear' }
l['pcc'] = { nom = 'bouyei' }
l['pcd'] = { nom = 'picard' }
l['pce'] = { nom = 'palaung ruching' }
l['pcf'] = { nom = 'paliyan' }
l['pcg'] = { nom = 'paniya' }
l['pch'] = { nom = 'pardhan' }
l['pci'] = { nom = 'duruwa' }
l['pcj'] = { nom = 'gorum' }
l['pck'] = { nom = 'paite' }
l['pcl'] = { nom = 'pardhi' }
l['pcm'] = { nom = 'pidgin nigérian' }
l['pcn'] = { nom = 'piti' }
l['pcp'] = { nom = 'pacahuara' }
l['pcw'] = { nom = 'pyapun' }
l['pda'] = { nom = 'anam' }
l['pdc'] = { nom = 'pennsilfaanisch' }
l['pdn'] = { nom = 'fedan' }
l['pdo'] = { nom = 'padoe' }
l['pdt'] = { nom = 'plautdietsch' }
l['pea'] = { nom = 'peranakan' }
l['peb'] = { nom = 'pomo de l’Est' }
l['pef'] = { nom = 'pomo du Nord-Est' }
l['peh'] = { nom = 'bonan' }
l['pei'] = { nom = 'chichimeca-jonaz' }
l['pej'] = { nom = 'pomo du Nord' }
l['pel'] = { nom = 'pekal' }
l['penan benalui'] = { nom = 'penan benalui' }
l['penange'] = { nom = 'penange' }
l['peo'] = { nom = 'vieux-perse', tri = 'perse vieux' }
l['pep'] = { nom = 'kunja' }
l['peq'] = { nom = 'pomo du Sud' }
l['percheron'] = { nom = 'percheron' }
l['pes'] = { nom = 'persan iranien' }
l['pez'] = { nom = 'penan de l’Est' }
l['pfa'] = { nom = 'pááfang' }
l['pfe'] = { nom = 'peere' }
l['pfl'] = { nom = 'palatin' }
l['pgk'] = { nom = 'rerep' }
l['pgl'] = { nom = 'irlandais primitif' }
l['pgn'] = { nom = 'pélignien' }
l['pgs'] = { nom = 'pangseng' }
l['pgu'] = { nom = 'pagu' }
l['pha'] = { nom = 'baheng' }
l['phi'] = { nom = 'langues philippines', tri = 'philippines langues' }
l['phk'] = { nom = 'phake' }
l['phl'] = { nom = 'phalura' }
l['phn'] = { nom = 'phénicien' }
l['pho'] = { nom = 'phunoi' }
l['phr'] = { nom = 'potwari' }
l['pi'] = { nom = 'pali', wiktionnaire = true }
l['pia'] = { nom = 'pima bajo' }
l['pib'] = { nom = 'yine' }
l['pic'] = { nom = 'apindji' }
l['picuris'] = { nom = 'picuris' }
l['pid'] = { nom = 'piaroa' }
l['pie'] = { nom = 'tompiro' }
l['pif'] = { nom = 'pingelap' }
l['pig'] = { nom = 'pisabo' }
l['pih'] = { nom = 'pitcairnais' }
l['pii'] = { nom = 'pini' }
l['pij'] = { nom = 'pijao' }
l['pil'] = { nom = 'yom' }
l['pim'] = { nom = 'powhatan' }
l['pin'] = { nom = 'piame' }
l['pio'] = { nom = 'piapoco' }
l['pip'] = { nom = 'pero' }
l['pir'] = { nom = 'piratapuya' }
l['pis'] = { nom = 'pidgin des îles Salomon', tri = 'pidgin salomon' }
l['pit'] = { nom = 'pitta-pitta' }
l['piu'] = { nom = 'pintupi' }
l['piv'] = { nom = 'vaeakau-taumako' }
l['piw'] = { nom = 'pimbwe' }
l['pix'] = { nom = 'piu' }
l['piz'] = { nom = 'pije' }
l['pjt'] = { nom = 'pitjantjatjara' }
l['pkc'] = { nom = 'baekje' }
l['pkn'] = { nom = 'pakanha' }
l['pko'] = { nom = 'pökot' }
l['pkp'] = { nom = 'pakupaku' }
l['pkr'] = { nom = 'kurumba d’Attapady' }
l['pkt'] = { nom = 'malieng' }
l['pku'] = { nom = 'paku' }
l['pl'] = { nom = 'polonais', wiktionnaire = true }
l['plb'] = { nom = 'polonombauk' }
l['plc'] = { nom = 'palawano central' }
l['pld'] = { nom = 'polari' }
l['ple'] = { nom = 'palu’e' }
l['plf'] = { nom = 'langues malayo-polynésiennes centrales', tri = 'malayo polynesiennes centrales langues' }
l['plg'] = { nom = 'pilagá' }
l['plj'] = { nom = 'polci' }
l['pll'] = { nom = 'palaung doré' }
l['pln'] = { nom = 'palenquero' }
l['plo'] = { nom = 'popoluca d’Oluta' }
l['plodarisch'] = { nom = 'plodarisch' }
l['plq'] = { nom = 'palaïte' }
l['plr'] = { nom = 'palaka' }
l['pls'] = { nom = 'popoloca de San Marcos Tlacoyalco' }
l['plt'] = { nom = 'malgache du plateau' }
l['plu'] = { nom = 'palikur' }
l['plw'] = { nom = 'palawano de Brooke’s Point' }
l['ply'] = { nom = 'palyu' }
l['plz'] = { nom = 'murut paluan' }
l['pma'] = { nom = 'paama' }
l['pmb'] = { nom = 'pambia' }
l['pmc'] = { nom = 'palumata' }
l['pmd'] = { nom = 'pallanganmiddang' }
l['pme'] = { nom = 'pwaamèi' }
l['pmf'] = { nom = 'pomona' }
l['pmh'] = { nom = 'prakrit maharashtri' }
l['pmi'] = { nom = 'primi du Nord' }
l['pmj'] = { nom = 'primi du Sud' }
l['pmk'] = { nom = 'pamlico' }
l['pml'] = { nom = 'lingua franca' }
l['pmm'] = { nom = 'pomo' }
l['pmn'] = { nom = 'pam' }
l['pmo'] = { nom = 'pom' }
l['pmq'] = { nom = 'pame du Nord' }
l['pmr'] = { nom = 'paynamar' }
l['pms'] = { nom = 'piémontais' }
l['pmt'] = { nom = 'paumotu' }
l['pmu'] = { nom = 'panjabi de Mirpur' }
l['pmw'] = { nom = 'miwok des plaines', tri = 'miwok plaines' }
l['pmx'] = { nom = 'naga poumei' }
l['pmy'] = { nom = 'malais papou' }
l['pmz'] = { nom = 'pame du Sud' }
l['pnb'] = { nom = 'pendjabi de l’Ouest', wiktionnaire = true }
l['png'] = { nom = 'pongu' }
l['pnh'] = { nom = 'tongareva' }
l['pni'] = { nom = 'aoheng' }
l['pnk'] = { nom = 'paunaka' }
l['pnn'] = { nom = 'pinai-hagahai' }
l['pno'] = { nom = 'huariapano' }
l['pnq'] = { nom = 'pana (Burkina Faso)' }
l['pnr'] = { nom = 'panim' }
l['pns'] = { nom = 'ponosakan' }
l['pnt'] = { nom = 'pontique' }
l['pnu'] = { nom = 'jiongnai' }
l['pnv'] = { nom = 'pinigura' }
l['pnw'] = { nom = 'panytyima' }
l['pnx'] = { nom = 'phong-kniang' }
l['pny'] = { nom = 'pinyin' }
l['pnz'] = { nom = 'pana (République centrafricaine)' }
l['poc'] = { nom = 'pokomam' }
l['pod'] = { nom = 'ponares' }
l['poe'] = { nom = 'popoloca de San Juan Atzingo' }
l['pof'] = { nom = 'poke' }
l['pog'] = { nom = 'potiguára' }
l['poh'] = { nom = 'poqomchi’' }
l['poi'] = { nom = 'popoluca de la Sierra' }
l['poitevin-saintongeais'] = { nom = 'poitevin-saintongeais' }
l['pom'] = { nom = 'pomo du Sud-Est' }
l['pon'] = { nom = 'pohnpei' }
l['poo'] = { nom = 'pomo central' }
l['pop'] = { nom = 'pwapwâ' }
l['poq'] = { nom = 'popoluca de Texistepec' }
l['pos'] = { nom = 'popoluca de Sayula' }
l['pot'] = { nom = 'potawatomi' }
l['pov'] = { nom = 'créole de Guinée-Bissau', tri = 'creole guinee bissau' }
l['pow'] = { nom = 'popoloca otlaltepec de San Felipe' }
l['pox'] = { nom = 'polabe' }
l['poy'] = { nom = 'pogoro' }
l['poz'] = { nom = 'langues malayo-polynésiennes', tri = 'malayo polynesiennes langues' }
l['ppa'] = { nom = 'pao' }
l['ppe'] = { nom = 'papi' }
l['ppi'] = { nom = 'paipai' }
l['ppk'] = { nom = 'uma' }
l['ppl'] = { nom = 'pipil' }
l['ppm'] = { nom = 'papuma' }
l['ppn'] = { nom = 'papapana' }
l['ppo'] = { nom = 'folopa' }
l['ppp'] = { nom = 'pelende' }
l['ppt'] = { nom = 'pare' }
l['ppu'] = { nom = 'papora' }
l['pqa'] = { nom = 'pa’a' }
l['pqe'] = { nom = 'langues malayo-polynésiennes orientales', tri = 'malayo polynesiennes orientales langues' }
l['pqm'] = { nom = 'malécite-passamaquoddy' }
l['pqw'] = { nom = 'langues malayo-polynésiennes occidentales', tri = 'malayo polynesiennes occidentales langues' }
l['pra'] = { nom = 'langues prâkrites', tri = 'prakrites langues' }
l['prb'] = { nom = 'lua’' }
l['prc'] = { nom = 'parachi' }
l['prd'] = { nom = 'persan dari' }
l['pre'] = { nom = 'principense' }
l['prf'] = { nom = 'paranan' }
l['prg'] = { nom = 'vieux prussien', tri = 'prussien vieux' }
l['pri'] = { nom = 'paicî' }
l['prk'] = { nom = 'parauk' }
l['prm'] = { nom = 'porome' }
l['pro'] = { nom = 'ancien occitan', tri = 'occitan ancien' }
l['prq'] = { nom = 'perené' }
l['prs'] = { nom = 'dari' }
l['prt'] = { nom = 'phai' }
l['pru'] = { nom = 'puragi' }
l['prx'] = { nom = 'purki' }
l['ps'] = { nom = 'pachto', wiktionnaire = true }
l['psa'] = { nom = 'aghu d’Asue', tri = 'aghu Asue' }
l['psd'] = { nom = 'langue des signes des Indiens des plaines', tri = 'signes indiens plaines' }
l['pse'] = { nom = 'malais central' }
l['psi'] = { nom = 'pashayi du Sud-Est' }
l['psl'] = { nom = 'langue des signes de Porto Rico', tri = 'signes porto rico' }
l['pso'] = { nom = 'langue des signes polonaise', tri = 'signes polonaise' }
l['psr'] = { nom = 'langue des signes portugaise', tri = 'signes portugaise' }
l['pss'] = { nom = 'kaulong' }
l['pst'] = { nom = 'pachto central' }
l['psw'] = { nom = 'port Sandwich' }
l['psy'] = { nom = 'piscataway' }
l['pt'] = { nom = 'portugais', wiktionnaire = true }
l['pth'] = { nom = 'pataxó hã-ha-hãe' }
l['pti'] = { nom = 'pintiini' }
l['ptq'] = { nom = 'pattapu' }
l['ptr'] = { nom = 'piamatsina' }
l['ptt'] = { nom = 'enrekang' }
l['ptv'] = { nom = 'port vato' }
l['pua'] = { nom = 'purépecha des hauts-plateaux de l’Ouest' }
l['pub'] = { nom = 'purum' }
l['puc'] = { nom = 'punan merap' }
l['pud'] = { nom = 'punan aput' }
l['pue'] = { nom = 'gününa yajich' }
l['puf'] = { nom = 'punan merah' }
l['pug'] = { nom = 'phuie' }
l['pui'] = { nom = 'puinave' }
l['puj'] = { nom = 'punan tubu’' }
l['pum'] = { nom = 'puma' }
l['pup'] = { nom = 'pulabu' }
l['puq'] = { nom = 'puquina' }
l['pur'] = { nom = 'puruborá' }
l['put'] = { nom = 'putoh' }
l['puu'] = { nom = 'pounou' }
l['puw'] = { nom = 'puluwat' }
l['puy'] = { nom = 'purisimeño' }
l['pwb'] = { nom = 'panawa' }
l['pwg'] = { nom = 'gapapaiwa' }
l['pwi'] = { nom = 'patwin' }
l['pwm'] = { nom = 'molbog' }
l['pwn'] = { nom = 'paiwan' }
l['pwo'] = { nom = 'pwo de l’Ouest' }
l['pxm'] = { nom = 'mixe de Quetzaltepec' }
l['pym'] = { nom = 'fyam' }
l['pyn'] = { nom = 'poyanáwa' }
l['pyu'] = { nom = 'puyuma' }
l['pyx'] = { nom = 'pyu (Birmanie)' }
l['pyy'] = { nom = 'pyen' }
l['pzn'] = { nom = 'para naga' }
l['qcx'] = { nom = 'mucuchí' }
l['qdh'] = { nom = 'chapakura' }
l['qij'] = { nom = 'maypure' }
l['qlz'] = { nom = 'masacara' }
l['qok'] = { nom = 'vieux khmer', tri = 'khmer vieux' }
l['qpj'] = { nom = 'timote' }
l['qpl'] = { nom = 'pamigua' }
l['qu'] = { nom = 'quechua', wiktionnaire = true }
l['qua'] = { nom = 'quapaw' }
l['qub'] = { nom = 'quechua de Huallaga Huánuco', tri = 'quechua Huallaga Huanuco' }
l['quc'] = { nom = 'quiché' }
l['qud'] = { nom = 'quichua de Calderón', tri = 'quichua Calderon' }
l['quf'] = { nom = 'quechua de Lambayeque', tri = 'quechua Lambayeque' }
l['qug'] = { nom = 'quichua du Chimborazo', tri = 'quichua Chimborazo' }
l['quh'] = { nom = 'quechua de la Bolivie du Sud', tri = 'quechua Bolivie Sud' }
l['qui'] = { nom = 'quileute' }
l['quk'] = { nom = 'quechua de Chachapoyas', tri = 'quechua Chachapoyas' }
l['qum'] = { nom = 'sipakapense' }
l['qun'] = { nom = 'quinault' }
l['qur'] = { nom = 'quechua de Yanahuanca Pasco', tri = 'quechua Yanahuanca Pasco' }
l['qus'] = { nom = 'quechua de Santiago del Estero', tri = 'quechua Santiago del Estero' }
l['quv'] = { nom = 'sakapultèque' }
l['quy'] = { nom = 'quechua d’Ayacucho', tri = 'quechua Ayacucho' }
l['quz'] = { nom = 'quechua de Cuzco', tri = 'quechua Cuzco' }
l['qva'] = { nom = 'quechua d’Ambo-Pasco', tri = 'quechua Ambo Pasco' }
l['qvc'] = { nom = 'quechua de Cajamarca', tri = 'quechua Cajamarca' }
l['qvi'] = { nom = 'quichua d’Imbabura', tri = 'quichua Imbabura' }
l['qvn'] = { nom = 'quechua du Junín du Nord', tri = 'quechua Junin Nord' }
l['qvo'] = { nom = 'quechua de Napo', tri = 'quechua Napo' }
l['qvp'] = { nom = 'quechua de Pacaraos', tri = 'quechua Pacaraos' }
l['qvs'] = { nom = 'quechua de San Martín', tri = 'quechua San Martin' }
l['qvw'] = { nom = 'quechua de Huaylla Wanca', tri = 'quechua Huaylla Wanca' }
l['qvy'] = { nom = 'queyu' }
l['qwa'] = { nom = 'quechua de Corongo Ancash', tri = 'quechua Corongo Ancash' }
l['qwc'] = { nom = 'quechua classique' }
l['qwe'] = { nom = 'langues quechuas', tri = 'quechuas langues' }
l['qwm'] = { nom = 'couman' }
l['qwt'] = { nom = 'kwalhioqua-tlatskanai' }
l['qxh'] = { nom = 'quechua de Panao Huánuco', tri = 'quechua Panao Huanuco' }
l['qxl'] = { nom = 'quichua de Salasaca', tri = 'quichua Salasaca' }
l['qxq'] = { nom = 'kachkaï' }
l['qxs'] = { nom = 'qiang du Sud' }
l['qxu'] = { nom = 'quechua d’Arequipa-La Unión', tri = 'quechua Arequipa la union' }
l['qya'] = { nom = 'quenya' }
l['qyp'] = { nom = 'quiripi' }
l['rab'] = { nom = 'camling' }
l['rac'] = { nom = 'rasawa' }
l['rad'] = { nom = 'rhade' }
l['rag'] = { nom = 'logoli' }
l['rah'] = { nom = 'rabha' }
l['raj'] = { nom = 'rajasthani' }
l['rak'] = { nom = 'bohuai' }
l['ral'] = { nom = 'ralte' }
l['ram'] = { nom = 'canela' }
l['ran'] = { nom = 'riantana' }
l['rao'] = { nom = 'rao' }
l['rap'] = { nom = 'rapanui' }
l['rar'] = { nom = 'rarotongien' }
l['ras'] = { nom = 'tegali' }
l['rat'] = { nom = 'razajerdi' }
l['rau'] = { nom = 'raute' }
l['rav'] = { nom = 'sampang' }
l['raw'] = { nom = 'rawang' }
l['rax'] = { nom = 'rang' }
l['ray'] = { nom = 'rapa' }
l['raz'] = { nom = 'rahambuu' }
l['rbb'] = { nom = 'rumai' }
l['rcf'] = { nom = 'créole réunionnais' }
l['rea'] = { nom = 'rerau' }
l['reb'] = { nom = 'rembong' }
l['ree'] = { nom = 'rejang kayan' }
l['reg'] = { nom = 'kara (Tanzanie)' }
l['rei'] = { nom = 'reli' }
l['rej'] = { nom = 'rejang' }
l['rel'] = { nom = 'rendille' }
l['ren'] = { nom = 'rengao' }
l['rer'] = { nom = 'rer bare' }
l['res'] = { nom = 'reshe' }
l['ret'] = { nom = 'retta' }
l['rey'] = { nom = 'reyesano' }
l['rga'] = { nom = 'roria' }
l['rge'] = { nom = 'romano-grec' }
l['rgn'] = { nom = 'romagnol' }
l['rgr'] = { nom = 'resigaro' }
l['rhg'] = { nom = 'rohingya' }
l['rhp'] = { nom = 'yahang' }
l['ria'] = { nom = 'riang (Inde)' }
l['rif'] = { nom = 'rifain' }
l['ril'] = { nom = 'riang (Birmanie)' }
l['rim'] = { nom = 'nyaturu' }
l['rin'] = { nom = 'nungu' }
l['rir'] = { nom = 'ribun' }
l['rit'] = { nom = 'ritarungo' }
l['rji'] = { nom = 'raji' }
l['rkb'] = { nom = 'rikbaktsa' }
l['rkm'] = { nom = 'marka' }
l['rm'] = { nom = 'romanche', wiktionnaire = true }
l['rma'] = { nom = 'rama' }
l['rmb'] = { nom = 'rembarunga' }
l['rmc'] = { nom = 'romani des Carpates' }
l['rme'] = { nom = 'angloromani' }
l['rmf'] = { nom = 'kalo finnois' }
l['rmg'] = { nom = 'voyageur norvégien' }
l['rmh'] = { nom = 'murkim' }
l['rmi'] = { nom = 'lomavren' }
l['rml'] = { nom = 'romani balte' }
l['rmm'] = { nom = 'roma' }
l['rmn'] = { nom = 'romani balkanique' }
l['rmo'] = { nom = 'sinte' }
l['rmp'] = { nom = 'rempi' }
l['rmq'] = { nom = 'caló' }
l['rms'] = { nom = 'langue des signes roumaine', tri = 'signes roumaine' }
l['rmt'] = { nom = 'domari' }
l['rmu'] = { nom = 'tavringer' }
l['rmv'] = { nom = 'romanova' }
l['rmw'] = { nom = 'romani gallois' }
l['rmy'] = { nom = 'vlax' }
l['rmz'] = { nom = 'marma' }
l['rn'] = { nom = 'kirundi', wiktionnaire = true }
l['rna'] = { nom = 'runa' }
l['rnd'] = { nom = 'ruund' }
l['rng'] = { nom = 'ronga' }
l['rnn'] = { nom = 'roon' }
l['rnp'] = { nom = 'rongpo' }
l['rnr'] = { nom = 'nari nari' }
l['rnw'] = { nom = 'rungwa' }
l['ro'] = { nom = 'roumain', wiktionnaire = true }
l['roa'] = { nom = 'langues romanes', tri = 'romanes langues' }
l['roa-leo'] = { nom = 'léonais' }
l['roa-opt'] = { nom = 'galaïco-portugais' }
l['roa-tara'] = { nom = 'tarentin' }
l['rob'] = { nom = 'tae’' }
l['roc'] = { nom = 'roglai de Cac Gia' }
l['rod'] = { nom = 'rogo' }
l['roe'] = { nom = 'ronji' }
l['rof'] = { nom = 'rombo' }
l['rog'] = { nom = 'roglai du Nord' }
l['rol'] = { nom = 'romblomanon' }
l['rom'] = { nom = 'romani' }
l['romanica'] = { nom = 'romanica' }
l['roo'] = { nom = 'rotokas' }
l['rop'] = { nom = 'kriol' }
l['ror'] = { nom = 'rongga' }
l['rou'] = { nom = 'rounga' }
l['rouran'] = { nom = 'rouran' }
l['row'] = { nom = 'dela-oenale' }
l['rpn'] = { nom = 'repanbitip' }
l['rpt'] = { nom = 'rapting' }
l['rro'] = { nom = 'roro' }
l['rsi'] = { nom = 'langue des signes rennellaise', tri = 'signes rennellaise' }
l['rsl'] = { nom = 'langue des signes russe', tri = 'signes russe' }
l['rtc'] = { nom = 'rungtu chin' }
l['rth'] = { nom = 'ratahan' }
l['rtm'] = { nom = 'rotuman' }
l['ru'] = { nom = 'russe', portail = true, wiktionnaire = true }
l['rub'] = { nom = 'gungu' }
l['rue'] = { nom = 'ruthène' }
l['ruf'] = { nom = 'luguru' }
l['rug'] = { nom = 'roviana' }
l['ruh'] = { nom = 'ruga' }
l['rui'] = { nom = 'rufiji' }
l['ruk'] = { nom = 'rukuba' }
l['ruo'] = { nom = 'istro-roumain' }
l['rup'] = { nom = 'aroumain', wmlien = 'roa-rup', wiktionnaire = true }
l['ruq'] = { nom = 'mégléno-roumain' }
l['russenorsk'] = { nom = 'russenorsk' }
l['ruthène ancien'] = { nom = 'ruthène ancien' }
l['rut'] = { nom = 'rutul' }
l['rw'] = { nom = 'kinyarwanda', wiktionnaire = true }
l['rwa'] = { nom = 'rawo' }
l['rwk'] = { nom = 'rwa' }
l['rxd'] = { nom = 'ngardi' }
l['rxw'] = { nom = 'karuwali' }
l['ryn'] = { nom = 'amami du Nord' }
l['rys'] = { nom = 'yaeyama' }
l['ryu'] = { nom = 'okinawaïen' }
l['sa'] = { nom = 'संस्कृत', wiktionnaire = true }
l['saa'] = { nom = 'saba' }
l['sab'] = { nom = 'buglere' }
l['sac'] = { nom = 'mesquakie' }
l['sacata'] = { nom = 'sacata' }
l['sad'] = { nom = 'sandawe' }
l['sae'] = { nom = 'sabanê' }
l['saf'] = { nom = 'safaliba' }
l['sagz-âbâdi'] = { nom = 'sagz-âbâdi' }
l['sah'] = { nom = 'iakoute' }
l['sai'] = { nom = 'langues sud-amérindiennes', tri = 'sud amerindiennes langues' }
l['saj'] = { nom = 'sahu' }
l['sak'] = { nom = 'sake' }
l['sal'] = { nom = 'langues salish', tri = 'salish langues' }
l['salentin'] = { nom = 'salentin' }
l['sam'] = { nom = 'araméen samaritain' }
l['samnite'] = { nom = 'samnite' }
l['sao'] = { nom = 'sause' }
l['sap'] = { nom = 'sanapaná' }
l['saq'] = { nom = 'samburu' }
l['sar'] = { nom = 'saraveca' }
l['sarthois'] = { nom = 'sarthois' }
l['sas'] = { nom = 'sassak' }
l['sat'] = { nom = 'santal' }
l['sau'] = { nom = 'saleman' }
l['saurano'] = { nom = 'saurano' }
l['sav'] = { nom = 'saafi' }
l['saw'] = { nom = 'sawi' }
l['sax'] = { nom = 'sa' }
l['say'] = { nom = 'saya' }
l['saynawa'] = { nom = 'saynawa' }
l['saz'] = { nom = 'saurachtra' }
l['sba'] = { nom = 'ngambay' }
l['sbc'] = { nom = 'kele (Papouasie-Nouvelle-Guinée)', tri = 'kele papouasie nouvelle guinee' }
l['sbd'] = { nom = 'san du Sud' }
l['sbf'] = { nom = 'shabo' }
l['sbg'] = { nom = 'seget' }
l['sbh'] = { nom = 'sori-harengan' }
l['sbi'] = { nom = 'seti' }
l['sbk'] = { nom = 'safwa' }
l['sbl'] = { nom = 'sambal de Botolan' }
l['sbn'] = { nom = 'sindhi bhil' }
l['sbo'] = { nom = 'sabüm' }
l['sbp'] = { nom = 'sangu' }
l['sbq'] = { nom = 'sirva' }
l['sbr'] = { nom = 'murut sembakung' }
l['sbs'] = { nom = 'subiya' }
l['sbt'] = { nom = 'kimki' }
l['sbv'] = { nom = 'sabin' }
l['sbw'] = { nom = 'himba' }
l['sby'] = { nom = 'soli' }
l['sc'] = { nom = 'sarde', wiktionnaire = true }
l['scb'] = { nom = 'chut' }
l['sce'] = { nom = 'dongxiang' }
l['sch'] = { nom = 'sakachep' }
l['sci'] = { nom = 'malais du Sri Lanka' }
l['scl'] = { nom = 'shina' }
l['scn'] = { nom = 'sicilien', wiktionnaire = true }
l['sco'] = { nom = 'scots' }
l['scp'] = { nom = 'yolmo' }
l['scq'] = { nom = 'saoch' }
l['scs'] = { nom = 'esclave du Nord' }
l['scw'] = { nom = 'sha' }
l['scx'] = { nom = 'sicule' }
l['sd'] = { nom = 'sindhi', wiktionnaire = true }
l['sdc'] = { nom = 'sassarais' }
l['sde'] = { nom = 'surubu' }
l['sdf'] = { nom = 'sarli' }
l['sdg'] = { nom = 'savi' }
l['sdh'] = { nom = 'kurde du Sud' }
l['sdk'] = { nom = 'sos kundi' }
l['sdm'] = { nom = 'semandang' }
l['sdn'] = { nom = 'gallurais' }
l['sdo'] = { nom = 'bukar sadong bidayuh' }
l['sdp'] = { nom = 'sherdukpen' }
l['sds'] = { nom = 'sened' }
l['sdv'] = { nom = 'langues soudaniques orientales', tri = 'soudaniques orientales langues' }
l['sdz'] = { nom = 'sallands' }
l['se'] = { nom = 'same du Nord', tri = 'same nord' }
l['sea'] = { nom = 'semai' }
l['seb'] = { nom = 'shempire' }
l['sec'] = { nom = 'sechelt' }
l['sed'] = { nom = 'sedang' }
l['see'] = { nom = 'seneca' }
l['sef'] = { nom = 'tyébara' }
l['seh'] = { nom = 'cisena' }
l['sei'] = { nom = 'seri' }
l['sek'] = { nom = 'sekani' }
l['sel'] = { nom = 'selkoupe' }
l['sem'] = { nom = 'langues sémitiques', tri = 'semitiques langues' }
l['sen'] = { nom = 'nanerge' }
l['seo'] = { nom = 'suarmin' }
l['sep'] = { nom = 'sucite' }
l['seputan'] = { nom = 'seputan' }
l['seq'] = { nom = 'senara' }
l['ser'] = { nom = 'serrano' }
l['ses'] = { nom = 'songhaï koyraboro senni' }
l['set'] = { nom = 'sentani' }
l['seu'] = { nom = 'serui-laut' }
l['sev'] = { nom = 'sénoufo de Nyarafolo' }
l['sew'] = { nom = 'sewa bay' }
l['sey'] = { nom = 'secoya' }
l['sez'] = { nom = 'senthang chin' }
l['sfb'] = { nom = 'langue des signes de Belgique francophone' }
l['sfe'] = { nom = 'subanen de l’Est', tri = 'subanen est' }
l['sfw'] = { nom = 'sehwi' }
l['sg'] = { nom = 'sango', wiktionnaire = true }
l['sga'] = { nom = 'vieil irlandais', tri = 'irlandais vieil' }
l['sgb'] = { nom = 'ayta mag-antsi' }
l['sgc'] = { nom = 'kipsigis' }
l['sge'] = { nom = 'punan kelai' }
l['sgh'] = { nom = 'shughni' }
l['sgi'] = { nom = 'suga' }
l['sgk'] = { nom = 'sangkong' }
l['sgn'] = { nom = 'langues des signes', tri = 'signes langues' }
l['sgr'] = { nom = 'sangesari' }
l['sgs'] = { nom = 'samogitien', wmlien = 'bat-smg' }
l['sgt'] = { nom = 'brokpake' }
l['sgw'] = { nom = 'sebat bet gurage' }
l['sgy'] = { nom = 'sangletchi' }
l['sgz'] = { nom = 'sursurunga' }
l['sh'] = { nom = 'serbo-croate', wiktionnaire = true }
l['sha'] = { nom = 'shall-zwall' }
l['shang'] = { nom = 'shang' }
l['shb'] = { nom = 'ninam' }
l['she'] = { nom = 'sheko' }
l['shg'] = { nom = 'shua' }
l['shh'] = { nom = 'shoshone' }
l['shi'] = { nom = 'chleuh' }
l['shj'] = { nom = 'caning' }
l['shinman'] = { nom = 'shinman' }
l['shk'] = { nom = 'shilluk' }
l['shn'] = { nom = 'shan', wiktionnaire = true }
l['sho'] = { nom = 'shanga' }
l['shp'] = { nom = 'shipibo-conibo' }
l['shr'] = { nom = 'mashi (République démocratique du Congo)', tri = 'mashi congo' }
l['shs'] = { nom = 'shuswap' }
l['sht'] = { nom = 'shasta' }
l['shu'] = { nom = 'arabe tchadien' }
l['shv'] = { nom = 'shehri' }
l['shw'] = { nom = 'shwai' }
l['shx'] = { nom = 'ho-nte' }
l['shy'] = { nom = 'chaoui', wiktionnaire = true }
l['shz'] = { nom = 'syenara' }
l['si'] = { nom = 'cingalais', wiktionnaire = true }
l['sia'] = { nom = 'same d’Akkala', tri = 'same akkala' }
l['sib'] = { nom = 'sebop' }
l['sic'] = { nom = 'malinguat' }
l['sid'] = { nom = 'sidamo' }
l['sie'] = { nom = 'simaa' }
l['sii'] = { nom = 'shompen' }
l['sij'] = { nom = 'numbami' }
l['sik'] = { nom = 'sikiana' }
l['sil'] = { nom = 'sisaala des Tumulung', tri = 'sisaala tumulung' }
l['sim'] = { nom = 'mende (Papouasie-Nouvelle-Guinée)' }
l['sio'] = { nom = 'langues siouanes', tri = 'siouanes langues' }
l['sip'] = { nom = 'sikkimais' }
l['siq'] = { nom = 'sonia' }
l['sir'] = { nom = 'siri' }
l['sis'] = { nom = 'siuslaw' }
l['sit'] = { nom = 'langues sino-tibétaines', tri = 'sino tibetaines langues' }
l['situ'] = { nom = 'situ' }
l['siu'] = { nom = 'sinagen' }
l['siw'] = { nom = 'siwai' }
l['six'] = { nom = 'sumau' }
l['siy'] = { nom = 'sivandi' }
l['siz'] = { nom = 'siwi' }
l['sja'] = { nom = 'epena saija' }
l['sjd'] = { nom = 'same de Kildin', tri = 'same kildin' }
l['sje'] = { nom = 'same de Pite', tri = 'same pite' }
l['sjk'] = { nom = 'same de Kemi', tri = 'same kemi' }
l['sjl'] = { nom = 'miji' }
l['sjm'] = { nom = 'mapun' }
l['sjn'] = { nom = 'sindarin' }
l['sjo'] = { nom = 'xibe' }
l['sjr'] = { nom = 'siar' }
l['sjt'] = { nom = 'same de Ter', tri = 'same ter' }
l['sju'] = { nom = 'same d’Ume', tri = 'same ume' }
l['sjw'] = { nom = 'shawnee' }
l['sk'] = { nom = 'slovaque', wiktionnaire = true }
l['ska'] = { nom = 'skagit' }
l['skb'] = { nom = 'saek' }
l['skc'] = { nom = 'ma manda' }
l['skd'] = { nom = 'miwok méridional de la Sierra' }
l['ske'] = { nom = 'seke (Vanuatu)' }
l['skf'] = { nom = 'mekens' }
l['ski'] = { nom = 'sika' }
l['skj'] = { nom = 'seke (Népal)' }
l['skr'] = { nom = 'saraiki', wiktionnaire = true }
l['sks'] = { nom = 'maia' }
l['sku'] = { nom = 'sakao' }
l['skv'] = { nom = 'skou' }
l['skx'] = { nom = 'seko padang' }
l['sky'] = { nom = 'sikaiana' }
l['sl'] = { nom = 'slovène', wiktionnaire = true }
l['sla'] = { nom = 'langues slaves', tri = 'slaves langues' }
l['slc'] = { nom = 'sáliva' }
l['sld'] = { nom = 'sisaali' }
l['sle'] = { nom = 'sholega' }
l['slg'] = { nom = 'murut selungai' }
l['slh'] = { nom = 'lushootseed du Sud' }
l['sli'] = { nom = 'bas-silésien', tri = 'silesien bas' }
l['slm'] = { nom = 'sama pangutaran' }
l['sln'] = { nom = 'antoniaño' }
l['slovince'] = { nom = 'slovince' }
l['slovio'] = { nom = 'slovio' }
l['slp'] = { nom = 'lamaholot' }
l['slr'] = { nom = 'salar' }
l['slt'] = { nom = 'sila' }
l['slu'] = { nom = 'selaru' }
l['sly'] = { nom = 'selayar' }
l['slz'] = { nom = 'ma’ya' }
l['sm'] = { nom = 'samoan', wiktionnaire = true }
l['sma'] = { nom = 'same du Sud', tri = 'same sud' }
l['smb'] = { nom = 'simbari' }
l['smc'] = { nom = 'som' }
l['smh'] = { nom = 'samei' }
l['smi'] = { nom = 'langues sames', tri = 'sames langues' }
l['smj'] = { nom = 'same de Lule', tri = 'same lule' }
l['smk'] = { nom = 'bolinao' }
l['smn'] = { nom = 'same d’Inari', tri = 'same inari' }
l['smp'] = { nom = 'samaritain' }
l['smq'] = { nom = 'samo (Papouasie-Nouvelle-Guinée)' }
l['smr'] = { nom = 'simeulue' }
l['sms'] = { nom = 'same skolt' }
l['smt'] = { nom = 'simte' }
l['smu'] = { nom = 'somray' }
l['smy'] = { nom = 'semnani' }
l['sn'] = { nom = 'shona', wiktionnaire = true }
l['snc'] = { nom = 'sinaugoro' }
l['sne'] = { nom = 'bau bidayuh' }
l['snf'] = { nom = 'noon' }
l['snj'] = { nom = 'sango riverain' }
l['snk'] = { nom = 'soninké' }
l['snl'] = { nom = 'sangil' }
l['snm'] = { nom = 'ma’di du Sud' }
l['snn'] = { nom = 'siona' }
l['sno'] = { nom = 'snohomish' }
l['snp'] = { nom = 'siane' }
l['snq'] = { nom = 'massango' }
l['snr'] = { nom = 'sihan' }
l['sns'] = { nom = 'nahavaq' }
l['snu'] = { nom = 'senggi' }
l['snv'] = { nom = 'sa’ban' }
l['snw'] = { nom = 'selee' }
l['snx'] = { nom = 'sam' }
l['sny'] = { nom = 'saniyo-hiyewe' }
l['snz'] = { nom = 'sinsauru' }
l['so'] = { nom = 'somali', wiktionnaire = true }
l['sob'] = { nom = 'sobei' }
l['soc'] = { nom = 'so (République démocratique du Congo)', tri = 'so congo' }
l['sod'] = { nom = 'songoora' }
l['sog'] = { nom = 'sogdien' }
l['soi'] = { nom = 'sonha' }
l['soj'] = { nom = 'soi' }
l['sok'] = { nom = 'sokoro' }
l['sol'] = { nom = 'solos' }
l['solrésol'] = { nom = 'solrésol' }
l['son'] = { nom = 'langues songhaïes', tri = 'songhaies langues' }
l['sonqor'] = { nom = 'sonqor' }
l['soo'] = { nom = 'songo' }
l['sor'] = { nom = 'somrai' }
l['sorbung'] = { nom = 'sorbung' }
l['sos'] = { nom = 'sembla' }
l['sou'] = { nom = 'thaï du Sud' }
l['sov'] = { nom = 'sonsorolais' }
l['sow'] = { nom = 'sowanda' }
l['sox'] = { nom = 'swo' }
l['soy'] = { nom = 'miyobe' }
l['soz'] = { nom = 'temi' }
l['spb'] = { nom = 'sepa (Indonésie)' }
l['spd'] = { nom = 'saep' }
l['spe'] = { nom = 'sepa (Papouasie-Nouvelle-Guinée)' }
l['spi'] = { nom = 'saponi' }
l['spk'] = { nom = 'sengo' }
l['spl'] = { nom = 'selepet' }
l['spn'] = { nom = 'sanapaná' }
l['spo'] = { nom = 'spokane' }
l['spp'] = { nom = 'supyiré' }
l['spr'] = { nom = 'saparua' }
l['spu'] = { nom = 'sapuan' }
l['spx'] = { nom = 'picène du Sud' }
l['spy'] = { nom = 'sabaot' }
l['sq'] = { nom = 'albanais', wiktionnaire = true }
l['sqa'] = { nom = 'shama' }
l['sqh'] = { nom = 'shau' }
l['sqj'] = { nom = 'langues albanaises', tri = 'albanaises langues' }
l['sqk'] = { nom = 'langue des signes albanaise', tri = 'signes albanaise' }
l['sqm'] = { nom = 'suma' }
l['sqn'] = { nom = 'susquehannock' }
l['sqo'] = { nom = 'sourkhei' }
l['sqq'] = { nom = 'sou' }
l['sqr'] = { nom = 'arabe sicilien' }
l['sqs'] = { nom = 'langue des signes sri-lankaise', tri = 'signes sri lankaise' }
l['sqt'] = { nom = 'soqotri' }
l['squ'] = { nom = 'squamish' }
l['sr'] = { nom = 'serbe', wiktionnaire = true }
l['sra'] = { nom = 'saruga' }
l['srb'] = { nom = 'sora' }
l['src'] = { nom = 'logudorais' }
l['sre'] = { nom = 'sara' }
l['srf'] = { nom = 'nafi' }
l['srh'] = { nom = 'sariqoli' }
l['sri'] = { nom = 'siriano' }
l['srk'] = { nom = 'murut serudung' }
l['srl'] = { nom = 'isirawa' }
l['srm'] = { nom = 'saramaccan' }
l['srn'] = { nom = 'sranan' }
l['sro'] = { nom = 'campidanais' }
l['srq'] = { nom = 'siriono' }
l['srr'] = { nom = 'sérère' }
l['srs'] = { nom = 'sarsi' }
l['sru'] = { nom = 'suruí' }
l['srw'] = { nom = 'serua' }
l['sry'] = { nom = 'sera' }
l['ss'] = { nom = 'swazi', wiktionnaire = true }
l['ssa'] = { nom = 'langues nilo-sahariennes', tri = 'nilo sahariennes langues' }
l['ssb'] = { nom = 'sama méridional' }
l['ssc'] = { nom = 'suba-simbiti' }
l['ssd'] = { nom = 'siroi' }
l['sse'] = { nom = 'sama balangingi' }
l['ssf'] = { nom = 'thao' }
l['ssg'] = { nom = 'seimat' }
l['ssh'] = { nom = 'arabe shihhi' }
l['ssj'] = { nom = 'sausi' }
l['ssl'] = { nom = 'sisaala de l’Ouest', tri = 'sisaala ouest' }
l['ssm'] = { nom = 'semnam' }
l['ssn'] = { nom = 'waata' }
l['sso'] = { nom = 'sissano' }
l['ssp'] = { nom = 'langue des signes espagnole', tri = 'signes espagnole' }
l['ssr'] = { nom = 'langue des signes suisse romande', tri = 'signes suisse romande' }
l['sss'] = { nom = 'sô' }
l['sst'] = { nom = 'sinasina' }
l['ssu'] = { nom = 'susuami' }
l['ssv'] = { nom = 'shark bay' }
l['ssx'] = { nom = 'samberigi' }
l['ssy'] = { nom = 'saho' }
l['st'] = { nom = 'sotho du Sud', wiktionnaire = true }
l['sta'] = { nom = 'settla' }
l['stb'] = { nom = 'subanen du Nord', tri = 'subanen nord' }
l['ste'] = { nom = 'liana-seti' }
l['stf'] = { nom = 'seta' }
l['stg'] = { nom = 'trieng' }
l['sth'] = { nom = 'shelta' }
l['sti'] = { nom = 'stieng' }
l['stj'] = { nom = 'san matya' }
l['stl'] = { nom = 'stellingwarfs' }
l['stm'] = { nom = 'setaman' }
l['stn'] = { nom = 'owa' }
l['sto'] = { nom = 'stoney' }
l['stp'] = { nom = 'tepehuan du Sud-Est' }
l['stq'] = { nom = 'frison saterlandais' }
l['str'] = { nom = 'salish des détroits' }
l['sts'] = { nom = 'shumashti' }
l['stu'] = { nom = 'samtao' }
l['stv'] = { nom = 'silt’e' }
l['stw'] = { nom = 'satawalais' }
l['sty'] = { nom = 'tatar de Sibérie' }
l['su'] = { nom = 'soundanais', wiktionnaire = true }
l['sua'] = { nom = 'sulka' }
l['sub'] = { nom = 'suku' }
l['suc'] = { nom = 'subanen de l’Ouest', tri = 'subanen ouest' }
l['sue'] = { nom = 'suena' }
l['sui'] = { nom = 'suki' }
l['suj'] = { nom = 'shubi' }
l['suk'] = { nom = 'soukouma' }
l['sul'] = { nom = 'surigaonon' }
l['suq'] = { nom = 'suri' }
l['sur'] = { nom = 'mwaghavul' }
l['sus'] = { nom = 'soussou' }
l['sut'] = { nom = 'subtiaba' }
l['suv'] = { nom = 'sulung' }
l['suw'] = { nom = 'sumbwa' }
l['sux'] = { nom = 'sumérien' }
l['suy'] = { nom = 'suyá' }
l['suz'] = { nom = 'sunwar' }
l['sv'] = { nom = 'suédois', wiktionnaire = true }
l['sva'] = { nom = 'svane' }
l['svb'] = { nom = 'ulau-suain' }
l['sve'] = { nom = 'serili' }
l['svm'] = { nom = 'slave molisan' }
l['svs'] = { nom = 'savosavo' }
l['sw'] = { nom = 'swahili', wiktionnaire = true }
l['swb'] = { nom = 'shimaoré', tri = 'shimaore' }
l['swc'] = { nom = 'swahili du Congo' }
l['swg'] = { nom = 'souabe' }
l['swi'] = { nom = 'sui' }
l['swj'] = { nom = 'shira' }
l['swl'] = { nom = 'langue des signes suédoise', tri = 'signes suedoise' }
l['swm'] = { nom = 'samosa' }
l['swn'] = { nom = 'sawknah' }
l['swo'] = { nom = 'shanenawa' }
l['swq'] = { nom = 'sharwa' }
l['swr'] = { nom = 'saweru' }
l['swt'] = { nom = 'sawila' }
l['sww'] = { nom = 'sowa' }
l['swx'] = { nom = 'suruwahá' }
l['swy'] = { nom = 'sarua' }
l['sxb'] = { nom = 'suba' }
l['sxc'] = { nom = 'sicanien' }
l['sxg'] = { nom = 'shixing' }
l['sxk'] = { nom = 'kalapuya du Sud', tri = 'kalapuya sud' }
l['sxm'] = { nom = 'samre' }
l['sxn'] = { nom = 'sangir' }
l['sxr'] = { nom = 'saaroa' }
l['sxu'] = { nom = 'haut-saxon', tri = 'saxon haut' }
l['sya'] = { nom = 'siang' }
l['syb'] = { nom = 'subanen central' }
l['syc'] = { nom = 'syriaque classique' }
l['syd'] = { nom = 'langues samoyèdes', tri = 'samoyedes langues' }
l['syi'] = { nom = 'seki' }
l['syk'] = { nom = 'sukur' }
l['syl'] = { nom = 'sylheti' }
l['sym'] = { nom = 'san maya' }
l['syn'] = { nom = 'senaya' }
l['syr'] = { nom = 'syriaque' }
l['syw'] = { nom = 'syuba' }
l['sza'] = { nom = 'semelai' }
l['szb'] = { nom = 'ngalum' }
l['szc'] = { nom = 'semaq beri' }
l['sze'] = { nom = 'seze' }
l['szg'] = { nom = 'sengele' }
l['szl'] = { nom = 'silésien' }
l['szp'] = { nom = 'inanwatan' }
l['szw'] = { nom = 'sawai' }
l['szy'] = { nom = 'sakizaya' }
l['ta'] = { nom = 'tamoul', wiktionnaire = true }
l['taa'] = { nom = 'bas tanana', tri = 'tanana bas' }
l['tab'] = { nom = 'tabassaran' }
l['tabancale'] = { nom = 'tabancale' }
l['tac'] = { nom = 'tarahumara occidental' }
l['tad'] = { nom = 'tause' }
l['tae'] = { nom = 'tariana' }
l['taf'] = { nom = 'tapirapé' }
l['tag'] = { nom = 'tagoi' }
l['tai'] = { nom = 'langues taïes', tri = 'taies langues' }
l['taïfale'] = { nom = 'taïfale' }
l['taj'] = { nom = 'tamang oriental' }
l['tak'] = { nom = 'tala' }
l['tal'] = { nom = 'tal' }
l['tan'] = { nom = 'tangale' }
l['tangam'] = { nom = 'tangam' }
l['tao'] = { nom = 'yami' }
l['taokas'] = { nom = 'taokas' }
l['tap'] = { nom = 'taabwa' }
l['taq'] = { nom = 'tamasheq' }
l['tar'] = { nom = 'tarahumara central' }
l['tas'] = { nom = 'tây bồi' }
l['tau'] = { nom = 'haut tanana', tri = 'tanana haut' }
l['tav'] = { nom = 'tatuyo' }
l['tax'] = { nom = 'tamki' }
l['tay'] = { nom = 'atayal' }
l['taz'] = { nom = 'tocho' }
l['tba'] = { nom = 'aikanã' }
l['tbc'] = { nom = 'takia' }
l['tbd'] = { nom = 'kaki ae' }
l['tbf'] = { nom = 'mandara' }
l['tbi'] = { nom = 'gaahmg' }
l['tbj'] = { nom = 'tiang' }
l['tbk'] = { nom = 'tagbanwa de Calamian' }
l['tbl'] = { nom = 'tboli' }
l['tbm'] = { nom = 'tagbu' }
l['tbo'] = { nom = 'tawala' }
l['tbp'] = { nom = 'taworta' }
l['tbq'] = { nom = 'langues tibéto-birmanes', tri = 'tibeto birmanes langues' }
l['tbr'] = { nom = 'tumtum' }
l['tbu'] = { nom = 'tubar' }
l['tbv'] = { nom = 'tobo' }
l['tby'] = { nom = 'tabaru' }
l['tca'] = { nom = 'ticuna' }
l['tcb'] = { nom = 'tanacross' }
l['tcc'] = { nom = 'datooga' }
l['tcd'] = { nom = 'tafi' }
l['tce'] = { nom = 'tutchone du Sud' }
l['tcf'] = { nom = 'me’phaa de Malinaltepec', tri = 'mephaa Malinaltepec' }
l['tcg'] = { nom = 'tamagario' }
l['tch'] = { nom = 'créole anglais des îles Turques-et-Caïques', tri = 'creole turques et caiques anglais' }
l['tcp'] = { nom = 'tawr' }
l['tcq'] = { nom = 'kaiy' }
l['tcs'] = { nom = 'créole du détroit de Torrès', tri = 'creole torres detroit' }
l['tct'] = { nom = 'then' }
l['tcx'] = { nom = 'toda' }
l['tcy'] = { nom = 'toulou' }
l['tda'] = { nom = 'tagdal' }
l['tdc'] = { nom = 'emberá tadó' }
l['tdd'] = { nom = 'tai nua' }
l['tde'] = { nom = 'tiranige diga' }
l['tdf'] = { nom = 'talieng' }
l['tdh'] = { nom = 'thulung' }
l['tdi'] = { nom = 'tomadino' }
l['tdj'] = { nom = 'tajio' }
l['tdk'] = { nom = 'tambas' }
l['tdl'] = { nom = 'sur' }
l['tdm'] = { nom = 'taruma' }
l['tdn'] = { nom = 'tondano' }
l['tds'] = { nom = 'doutai' }
l['tdt'] = { nom = 'tetun dili' }
l['tdu'] = { nom = 'tindal dusun' }
l['tdv'] = { nom = 'toro' }
l['te'] = { nom = 'télougou', wiktionnaire = true }
l['tea'] = { nom = 'temiar' }
l['tec'] = { nom = 'terik' }
l['ted'] = { nom = 'kroumen tépo' }
l['tee'] = { nom = 'tepehua de Huehuetla' }
l['tef'] = { nom = 'teressa' }
l['teh'] = { nom = 'tehuelche' }
l['tei'] = { nom = 'torricelli' }
l['tem'] = { nom = 'temné' }
l['ten'] = { nom = 'tama (Colombie)' }
l['teo'] = { nom = 'teso' }
l['tep'] = { nom = 'tepecano' }
l['tep (Nigeria)'] = { nom = 'tep (Nigeria)' }
l['teq'] = { nom = 'temein' }
l['ter'] = { nom = 'téréno' }
l['tes'] = { nom = 'tengger' }
l['tet'] = { nom = 'tétoum' }
l['teu'] = { nom = 'soo' }
l['tev'] = { nom = 'teor' }
l['tew'] = { nom = 'tewa' }
l['tex'] = { nom = 'tennet' }
l['tey'] = { nom = 'tulishi' }
l['tez'] = { nom = 'tetserret' }
l['tfn'] = { nom = 'dena’ina' }
l['tfr'] = { nom = 'teribe' }
l['tft'] = { nom = 'ternate' }
l['tg'] = { nom = 'tadjik', wiktionnaire = true }
l['tgb'] = { nom = 'tobilung' }
l['tgc'] = { nom = 'tigak' }
l['tgf'] = { nom = 'chalikha' }
l['tgo'] = { nom = 'sudest' }
l['tgp'] = { nom = 'tangoa' }
l['tgq'] = { nom = 'tring' }
l['tgs'] = { nom = 'nume' }
l['tgt'] = { nom = 'tagbanwa central' }
l['tgv'] = { nom = 'tingui-boto' }
l['tgw'] = { nom = 'tagbana' }
l['tgx'] = { nom = 'tagish' }
l['th'] = { nom = 'thaï', wiktionnaire = true }
l['thd'] = { nom = 'thayore' }
l['the'] = { nom = 'chitwania' }
l['thf'] = { nom = 'thangmi' }
l['thh'] = { nom = 'tarahumara du Nord' }
l['thi'] = { nom = 'tai long' }
l['thk'] = { nom = 'tharaka' }
l['thm'] = { nom = 'thavung' }
l['thp'] = { nom = 'thompson' }
l['thr'] = { nom = 'rana tharu' }
l['ths'] = { nom = 'thakali' }
l['tht'] = { nom = 'tahltan' }
l['thu'] = { nom = 'thuri' }
l['thv'] = { nom = 'tamahaq' }
l['thx'] = { nom = 'thaé' }
l['thy'] = { nom = 'tha' }
l['thz'] = { nom = 'tayart tamajeq' }
l['ti'] = { nom = 'tigrigna', wiktionnaire = true }
l['tia'] = { nom = 'tamazight de Tidikelt', tri = 'tamazight Tidikelt' }
l['tic'] = { nom = 'tira' }
l['tid'] = { nom = 'tidong' }
l['tiefo de Nyafogo'] = { nom = 'tiefo de Nyafogo' }
l['tif'] = { nom = 'tifal' }
l['tig'] = { nom = 'tigré' }
l['tih'] = { nom = 'murut timugon' }
l['tii'] = { nom = 'tiene' }
l['tij'] = { nom = 'tilung' }
l['tik'] = { nom = 'tikar' }
l['til'] = { nom = 'tillamook' }
l['tim'] = { nom = 'timbe' }
l['tin'] = { nom = 'tindi' }
l['tingalan'] = { nom = 'tingalan' }
l['tio'] = { nom = 'teop' }
l['tip'] = { nom = 'trimuris' }
l['tiq'] = { nom = 'tiefo de Daramandugu' }
l['tis'] = { nom = 'itneg des Masadiit', tri = 'itneg masadiit' }
l['tischlbongarisch'] = { nom = 'tischlbongarisch' }
l['tit'] = { nom = 'tinigua' }
l['tiv'] = { nom = 'tiv' }
l['tiw'] = { nom = 'tiwi' }
l['tix'] = { nom = 'tiwa du Sud' }
l['tiy'] = { nom = 'tiruray' }
l['tiz'] = { nom = 'tai hongjin' }
l['tjg'] = { nom = 'tunjung' }
l['tji'] = { nom = 'tujia du Nord' }
l['tjm'] = { nom = 'timucua' }
l['tjs'] = { nom = 'tujia du Sud' }
l['tju'] = { nom = 'tjurruru' }
l['tjw'] = { nom = 'djabwurrung' }
l['tk'] = { nom = 'turkmène', wiktionnaire = true }
l['tkd'] = { nom = 'tukudede' }
l['tke'] = { nom = 'takwane' }
l['tkl'] = { nom = 'tokelauien' }
l['tkn'] = { nom = 'toku-no-shima' }
l['tkp'] = { nom = 'tikopia' }
l['tkq'] = { nom = 'tèè' }
l['tkr'] = { nom = 'tsakhur' }
l['tks'] = { nom = 'takestani' }
l['tkt'] = { nom = 'tharu de Kathoriya' }
l['tku'] = { nom = 'totonaque du haut Necaxa', tri = 'totonaque Necaxa haut' }
l['tkw'] = { nom = 'teanu' }
l['tkx'] = { nom = 'tangko' }
l['tl'] = { nom = 'tagalog', wiktionnaire = true }
l['tla'] = { nom = 'tepehuan du Sud-Ouest' }
l['tlb'] = { nom = 'tobelo' }
l['tlc'] = { nom = 'totonaque de Misantla', tri = 'totonaque Misantla' }
l['tlf'] = { nom = 'telefol' }
l['tlg'] = { nom = 'tofanma' }
l['tlh'] = { nom = 'klingon' }
l['tli'] = { nom = 'tlingit' }
l['tlj'] = { nom = 'kitalinga' }
l['tlk'] = { nom = 'taloki' }
l['tll'] = { nom = 'tetela' }
l['tlm'] = { nom = 'tolomako' }
l['tlo'] = { nom = 'talodi' }
l['tlq'] = { nom = 'tai loi' }
l['tls'] = { nom = 'tambotalo' }
l['tlt'] = { nom = 'teluti' }
l['tlu'] = { nom = 'tulehu' }
l['tlv'] = { nom = 'taliabu' }
l['tlx'] = { nom = 'khehek' }
l['tly'] = { nom = 'talysh' }
l['tma'] = { nom = 'tama (Tchad)' }
l['tmb'] = { nom = 'avava' }
l['tmc'] = { nom = 'tumak' }
l['tmd'] = { nom = 'haruai' }
l['tmf'] = { nom = 'toba mascoy' }
l['tmh'] = { nom = 'tamasheq (macrolangue)' }
l['tmi'] = { nom = 'tutuba' }
l['tmj'] = { nom = 'samarokena' }
l['tmn'] = { nom = 'taman' }
l['tmo'] = { nom = 'temoq' }
l['tmp'] = { nom = 'tai mène' }
l['tmq'] = { nom = 'tumleo' }
l['tmr'] = { nom = 'judéo-araméen babylonien' }
l['tms'] = { nom = 'tima' }
l['tmt'] = { nom = 'tasmate' }
l['tmu'] = { nom = 'iau' }
l['tmw'] = { nom = 'temuan' }
l['tmz'] = { nom = 'tamanaku' }
l['tn'] = { nom = 'tswana', wiktionnaire = true }
l['tna'] = { nom = 'tacana' }
l['tnc'] = { nom = 'tanimuca' }
l['tni'] = { nom = 'tandia' }
l['tnk'] = { nom = 'kwamera' }
l['tnl'] = { nom = 'lenakel' }
l['tnm'] = { nom = 'tabla' }
l['tnn'] = { nom = 'tanna du Nord' }
l['tnp'] = { nom = 'whitesands' }
l['tnq'] = { nom = 'taïno' }
l['tnr'] = { nom = 'bédik' }
l['tnt'] = { nom = 'tontemboan' }
l['tnw'] = { nom = 'tonsawang' }
l['tnx'] = { nom = 'tanema' }
l['to'] = { nom = 'tongien', wiktionnaire = true }
l['tob'] = { nom = 'toba' }
l['toc'] = { nom = 'totonaque de Coyutla', tri = 'totonaque Coyutla' }
l['toe'] = { nom = 'tomedes' }
l['tog'] = { nom = 'tonga (Malawi)' }
l['toi'] = { nom = 'tonga (Zambie)' }
l['toj'] = { nom = 'tojolabal' }
l['tok'] = { nom = 'toki pona' }
l['tol'] = { nom = 'tolowa' }
l['tom'] = { nom = 'tombulu' }
l['tongzha'] = { nom = 'tongzha' }
l['too'] = { nom = 'totonaque de Xicotepec de Juárez', tri = 'totonaque Xicotepec Juarez' }
l['top'] = { nom = 'totonaque de Papantla', tri = 'totonaque Papantla' }
l['tor'] = { nom = 'banda togbo-vara' }
l['tos'] = { nom = 'totonaque de la sierra', tri = 'totonaque Sierra' }
l['tou'] = { nom = 'tho' }
l['tourangeau'] = { nom = 'tourangeau' }
l['tow'] = { nom = 'jemez' }
l['tox'] = { nom = 'tobi' }
l['toy'] = { nom = 'topoiyo' }
l['toz'] = { nom = 'to' }
l['tpa'] = { nom = 'taupota' }
l['tpc'] = { nom = 'me’phaa d’Azoyu', tri = 'mephaa Azoyu' }
l['tpe'] = { nom = 'tippera' }
l['tpf'] = { nom = 'tarpia' }
l['tpg'] = { nom = 'kula' }
l['tpi'] = { nom = 'tok pisin', wiktionnaire = true }
l['tpj'] = { nom = 'tapieté' }
l['tpl'] = { nom = 'me’phaa de Tlacoapa', tri = 'mephaa Tlacoapa' }
l['tpm'] = { nom = 'tampulma' }
l['tpn'] = { nom = 'tupinambá' }
l['tpp'] = { nom = 'tepehua de Pisaflores' }
l['tpr'] = { nom = 'tupari' }
l['tpt'] = { nom = 'tepehua de Tlachichilco' }
l['tpu'] = { nom = 'tampuan' }
l['tpv'] = { nom = 'tanapag' }
l['tpw'] = { nom = 'tupi' }
l['tpx'] = { nom = 'me’phaa d’Acatepec', tri = 'mephaa Acatepec' }
l['tpy'] = { nom = 'trumai' }
l['tqb'] = { nom = 'tembé' }
l['tql'] = { nom = 'lehali' }
l['tqn'] = { nom = 'tenino' }
l['tqo'] = { nom = 'toaripi' }
l['tqr'] = { nom = 'torona' }
l['tqt'] = { nom = 'totonaque de l’Ouest', tri = 'totonaque Ouest' }
l['tqu'] = { nom = 'touo' }
l['tqw'] = { nom = 'tonkawa' }
l['tr'] = { nom = 'turc', wiktionnaire = true }
l['tra'] = { nom = 'tirahi' }
l['trb'] = { nom = 'terebu' }
l['trc'] = { nom = 'trique de Copala' }
l['trd'] = { nom = 'turi' }
l['tre'] = { nom = 'tarangan oriental' }
l['trf'] = { nom = 'créole trinidadien' }
l['trg'] = { nom = 'lishán didán' }
l['trh'] = { nom = 'turaka' }
l['tri'] = { nom = 'trio' }
l['trj'] = { nom = 'toram' }
l['trk'] = { nom = 'langues turques', tri = 'turques langues' }
l['trl'] = { nom = 'cryptolecte écossais' }
l['trm'] = { nom = 'tregami' }
l['trn'] = { nom = 'trinitario' }
l['tro'] = { nom = 'tarao' }
l['trp'] = { nom = 'kokborok' }
l['trq'] = { nom = 'trique de San Martín Itunyoso' }
l['trr'] = { nom = 'taushiro' }
l['trs'] = { nom = 'trique de Chicahuaxtla' }
l['trt'] = { nom = 'tunggare' }
l['tru'] = { nom = 'turoyo' }
l['trv'] = { nom = 'seediq' }
l['trw'] = { nom = 'torwali' }
l['trx'] = { nom = 'tringgus-sembaan bidayuh' }
l['try'] = { nom = 'turung' }
l['trz'] = { nom = 'torá' }
l['ts'] = { nom = 'tsonga', wiktionnaire = true }
l['tsa'] = { nom = 'tsaangi' }
l['tsb'] = { nom = 'tsamai' }
l['tsc'] = { nom = 'tswa' }
l['tsd'] = { nom = 'tsakonien' }
l['tse'] = { nom = 'langue des signes tunisienne', tri = 'signes tunisienne' }
l['tsg'] = { nom = 'tausug' }
l['tsh'] = { nom = 'tsuvan' }
l['tshobdun'] = { nom = 'tshobdun' }
l['tsi'] = { nom = 'tsimshian' }
l['tsj'] = { nom = 'tshangla' }
l['tsk'] = { nom = 'tseku' }
l['tsm'] = { nom = 'langue des signes turque', tri = 'signes turque' }
l['tsolyáni'] = { nom = 'tsolyáni', tri = 'tsolyani' }
l['tsr'] = { nom = 'akei' }
l['tss'] = { nom = 'langue des signes taïwanaise', tri = 'signes taiwanaise' }
l['tst'] = { nom = 'tondi songway kiini' }
l['tsu'] = { nom = 'tsou' }
l['tsv'] = { nom = 'tsogo' }
l['tsx'] = { nom = 'mubami' }
l['tsz'] = { nom = 'purépecha' }
l['tt'] = { nom = 'tatare', wiktionnaire = true }
l['tta'] = { nom = 'tutelo' }
l['ttb'] = { nom = 'gaa' }
l['ttc'] = { nom = 'tectitèque' }
l['ttd'] = { nom = 'tauade' }
l['tte'] = { nom = 'bwanabwana' }
l['ttf'] = { nom = 'tuotomb' }
l['tth'] = { nom = 'haut ta’oih' }
l['tti'] = { nom = 'tobati' }
l['ttj'] = { nom = 'tooro' }
l['ttk'] = { nom = 'totoró' }
l['ttl'] = { nom = 'totela' }
l['ttm'] = { nom = 'tutchone du Nord' }
l['ttn'] = { nom = 'towei' }
l['ttq'] = { nom = 'tamajaq' }
l['ttr'] = { nom = 'tera' }
l['tts'] = { nom = 'isan' }
l['ttt'] = { nom = 'tat' }
l['ttu'] = { nom = 'torau' }
l['ttw'] = { nom = 'long wat' }
l['tty'] = { nom = 'sikaritai' }
l['ttz'] = { nom = 'tsum' }
l['tub'] = { nom = 'tubatulabal' }
l['tuc'] = { nom = 'mutu' }
l['tud'] = { nom = 'tuxá' }
l['tue'] = { nom = 'tuyuca' }
l['tuf'] = { nom = 'tunebo' }
l['tug'] = { nom = 'tunia' }
l['tuh'] = { nom = 'taulil' }
l['tui'] = { nom = 'toupouri' }
l['tum'] = { nom = 'tumbuka' }
l['tun'] = { nom = 'tunica' }
l['tuo'] = { nom = 'tucano' }
l['tup'] = { nom = 'langues tupies', tri = 'tupies langues' }
l['tuq'] = { nom = 'tedaga' }
l['tus'] = { nom = 'tuscarora' }
l['tussentaal'] = { nom = 'tussentaal' }
l['tut'] = { nom = 'langues altaïques', tri = 'altaiques langues' }
l['tuu'] = { nom = 'tututni' }
l['tuv'] = { nom = 'turkana' }
l['tuw'] = { nom = 'langues toungouses', tri = 'toungouses langues' }
l['tux'] = { nom = 'tuxinawa' }
l['tuy'] = { nom = 'tuken' }
l['tuz'] = { nom = 'tchourama' }
l['tva'] = { nom = 'vaghua' }
l['tvd'] = { nom = 'tsuvadi' }
l['tve'] = { nom = 'te’un' }
l['tvk'] = { nom = 'ambrym du Sud-Est' }
l['tvl'] = { nom = 'tuvalu' }
l['tvm'] = { nom = 'tela-masbuar' }
l['tvo'] = { nom = 'tidore' }
l['tvu'] = { nom = 'tunen' }
l['tvw'] = { nom = 'sedoa' }
l['tw'] = { nom = 'twi', wiktionnaire = true }
l['twa'] = { nom = 'twana' }
l['twd'] = { nom = 'tweants' }
l['twe'] = { nom = 'teiwa' }
l['twf'] = { nom = 'tiwa du Nord' }
l['twm'] = { nom = 'monba' }
l['two'] = { nom = 'tswapong' }
l['twq'] = { nom = 'tasawaq' }
l['twt'] = { nom = 'turiwara' }
l['twu'] = { nom = 'termanu' }
l['twy'] = { nom = 'taboyan' }
l['txa'] = { nom = 'tombonuwo' }
l['txb'] = { nom = 'tokharien B' }
l['txc'] = { nom = 'tsetsaut' }
l['txe'] = { nom = 'totoli' }
l['txg'] = { nom = 'tangoute' }
l['txh'] = { nom = 'thrace' }
l['txi'] = { nom = 'ikpeng' }
l['txm'] = { nom = 'tomini' }
l['txn'] = { nom = 'tarangan de l’Ouest' }
l['txo'] = { nom = 'toto' }
l['txq'] = { nom = 'tii' }
l['txr'] = { nom = 'tartessien' }
l['txs'] = { nom = 'tonsea' }
l['txt'] = { nom = 'citak' }
l['txu'] = { nom = 'kayapó' }
l['txx'] = { nom = 'tatana' }
l['txy'] = { nom = 'antanosy' }
l['ty'] = { nom = 'tahitien' }
l['tya'] = { nom = 'tauya' }
l['tye'] = { nom = 'kyanga' }
l['typ'] = { nom = 'thaypan' }
l['tyt'] = { nom = 'tày tac' }
l['tyv'] = { nom = 'touvain' }
l['tyz'] = { nom = 'tày' }
l['tza'] = { nom = 'langue des signes tanzanienne', tri = 'signes tanzanienne' }
l['tzh'] = { nom = 'tzeltal' }
l['tzj'] = { nom = 'tz’utujil' }
l['tzl'] = { nom = 'talossan' }
l['tzm'] = { nom = 'tamazight du Maroc central', tri = 'tamazight Maroc central' }
l['tzn'] = { nom = 'tugun' }
l['tzo'] = { nom = 'tzotzil' }
l['uam'] = { nom = 'uamué' }
l['uar'] = { nom = 'tairuma' }
l['ubi'] = { nom = 'ubi' }
l['ubl'] = { nom = 'buhi’non' }
l['ubr'] = { nom = 'ubir' }
l['ubu'] = { nom = 'umbu-ungu' }
l['uby'] = { nom = 'oubykh' }
l['uda'] = { nom = 'uda' }
l['ude'] = { nom = 'oudégué' }
l['udg'] = { nom = 'muduga' }
l['udi'] = { nom = 'oudi' }
l['udj'] = { nom = 'ujir' }
l['udl'] = { nom = 'wuzlam' }
l['udm'] = { nom = 'oudmourte' }
l['udu'] = { nom = 'uduk' }
l['ug'] = { nom = 'ouïghour', wiktionnaire = true }
l['uga'] = { nom = 'ougaritique' }
l['uge'] = { nom = 'ughele' }
l['ugo'] = { nom = 'ugong' }
l['uhn'] = { nom = 'damal' }
l['uis'] = { nom = 'uisai' }
l['uiv'] = { nom = 'iyive' }
l['uji'] = { nom = 'tanjijili' }
l['uk'] = { nom = 'ukrainien', wiktionnaire = true }
l['ukk'] = { nom = 'muak sa-aak' }
l['ukq'] = { nom = 'ukwa' }
l['ula'] = { nom = 'fungwa' }
l['ulc'] = { nom = 'oultch' }
l['ule'] = { nom = 'lule' }
l['ulf'] = { nom = 'usku' }
l['uli'] = { nom = 'ulithi' }
l['ulk'] = { nom = 'meriam' }
l['ull'] = { nom = 'ullatan' }
l['ulm'] = { nom = 'ulumanda’' }
l['uln'] = { nom = 'unserdeutsch' }
l['ulu'] = { nom = 'oma longh' }
l['ulw'] = { nom = 'ulwa' }
l['uma'] = { nom = 'umatilla' }
l['umb'] = { nom = 'oumboundou' }
l['umc'] = { nom = 'marrucin' }
l['umd'] = { nom = 'umbindhamu' }
l['umg'] = { nom = 'umbuygamu' }
l['umi'] = { nom = 'ukit' }
l['umo'] = { nom = 'umotina' }
l['ump'] = { nom = 'umpila' }
l['ums'] = { nom = 'pendau' }
l['umu'] = { nom = 'munsee' }
l['una'] = { nom = 'watut du Nord' }
l['und'] = { nom = 'langue indéterminée', tri = '*indeterminee' }
l['une'] = { nom = 'uneme' }
l['ung'] = { nom = 'ngarinyin' }
l['unm'] = { nom = 'unami' }
l['unn'] = { nom = 'kurnai' }
l['unr'] = { nom = 'mundari' }
l['unz'] = { nom = 'kaili d’Unde', tri = 'kaili unde' }
l['upv'] = { nom = 'uripiv-wala-rano-atchin' }
l['ur'] = { nom = 'ourdou', wiktionnaire = true }
l['ura'] = { nom = 'urarina' }
l['urb'] = { nom = 'kaapor' }
l['ure'] = { nom = 'uru' }
l['urf'] = { nom = 'uradhi' }
l['urg'] = { nom = 'urigina' }
l['urh'] = { nom = 'urhobo' }
l['uri'] = { nom = 'urim' }
l['urj'] = { nom = 'langues ouraliennes', tri = 'ouraliennes langues' }
l['urk'] = { nom = 'urak lawoi’' }
l['url'] = { nom = 'urali' }
l['urn'] = { nom = 'uruangnirin' }
l['uro'] = { nom = 'ura (Papouasie-Nouvelle-Guinée)' }
l['urp'] = { nom = 'uru-pa-in' }
l['urr'] = { nom = 'löyöp' }
l['urt'] = { nom = 'urat' }
l['uru'] = { nom = 'urumi' }
l['urv'] = { nom = 'uruava' }
l['urw'] = { nom = 'sop' }
l['ury'] = { nom = 'orya' }
l['usi'] = { nom = 'usui' }
l['usk'] = { nom = 'usakade' }
l['usp'] = { nom = 'uspantèque' }
l['uss'] = { nom = 'us-saare' }
l['usu'] = { nom = 'uya' }
l['ute'] = { nom = 'ute' }
l['ute-che'] = { nom = 'chemehuevi' }
l['ute-sou'] = { nom = 'paiute du Sud' }
l['uth'] = { nom = 'ut-hun' }
l['utr'] = { nom = 'etulo' }
l['utu'] = { nom = 'utu' }
l['uum'] = { nom = 'urum' }
l['uun'] = { nom = 'pazeh' }
l['uur'] = { nom = 'ura (Vanuatu)' }
l['uuu'] = { nom = 'u' }
l['uve'] = { nom = 'fagauvea' }
l['uvh'] = { nom = 'uri' }
l['uwa'] = { nom = 'kuku-uwanh' }
l['uz'] = { nom = 'ouzbek', wiktionnaire = true }
l['vaa'] = { nom = 'vaagri booli' }
l['vae'] = { nom = 'vale' }
l['vaf'] = { nom = 'vafsi' }
l['vag'] = { nom = 'vagla' }
l['vai'] = { nom = 'vaï' }
l['vaj'] = { nom = 'vasekele' }
l['vam'] = { nom = 'vanimo' }
l['van'] = { nom = 'valman' }
l['vao'] = { nom = 'vao' }
l['vap'] = { nom = 'vaiphei' }
l['var'] = { nom = 'guarijio' }
l['vas'] = { nom = 'vasavi' }
l['vay'] = { nom = 'wayu' }
l['vbb'] = { nom = 'babar du Sud-Est' }
l['ve'] = { nom = 'venda' }
l['vec'] = { nom = 'vénitien', wiktionnaire = true }
l['ved'] = { nom = 'veddah' }
l['vel'] = { nom = 'veluws' }
l['vem'] = { nom = 'vemgo-mabas' }
l['veo'] = { nom = 'ventureño' }
l['vep'] = { nom = 'vepse' }
l['ver'] = { nom = 'mom jango' }
l['vi'] = { nom = 'vietnamien', wiktionnaire = true }
l['vic'] = { nom = 'créole des Îles Vierges', tri = 'creole vierges' }
l['vid'] = { nom = 'vidunda' }
l['vieil écossais'] = { nom = 'vieil écossais', tri = 'ecossais vieil' }
l['vieil okinawaïen'] = { nom = 'vieil okinawaïen', tri = 'okinawaien vieux' }
l['vieux brittonique'] = { nom = 'vieux brittonique', tri = 'brittonique vieux' }
l['vieux danois'] = { nom = 'vieux danois', tri = 'danois vieux' }
l['vieux khmer pré-angkorien'] = { nom = 'vieux khmer pré-angkorien', tri = 'khmer vieux pre angkorien' }
l['vieux norvégien'] = { nom = 'vieux norvégien', tri = 'norvégien vieux' }
l['vieux novgorodien'] = { nom = 'vieux novgorodien', tri = 'novgorodien vieux' }
l['vieux polonais'] = { nom = 'vieux polonais', tri = 'polonais vieux' }
l['vieux suédois'] = { nom = 'vieux suédois', tri = 'suedois vieux' }
l['vif'] = { nom = 'vili' }
l['vig'] = { nom = 'viemo' }
l['vil'] = { nom = 'vilela' }
l['vin'] = { nom = 'vinza' }
l['vis'] = { nom = 'vishavan' }
l['vit'] = { nom = 'viti' }
l['viv'] = { nom = 'iduna' }
l['vka'] = { nom = 'kariyarra' }
l['vkl'] = { nom = 'kulisusu' }
l['vkm'] = { nom = 'kamakan' }
l['vko'] = { nom = 'kodeoha' }
l['vkp'] = { nom = 'korlai' }
l['vlp'] = { nom = 'valpei' }
l['vls'] = { nom = 'flamand occidental' }
l['vma'] = { nom = 'martuthunira' }
l['vmb'] = { nom = 'mbabaram' }
l['vme'] = { nom = 'masela de l’Est' }
l['vmf'] = { nom = 'francique oriental' }
l['vmj'] = { nom = 'mixtèque d’Ixtayutla', tri = 'mixteque ixtayutla' }
l['vml'] = { nom = 'malgana' }
l['vmp'] = { nom = 'mazatèque de Soyaltepec', tri = 'mazateque soyaltepec' }
l['vmw'] = { nom = 'makhuwa' }
l['vmy'] = { nom = 'mazatèque de San Bartolomé Ayautla', tri = 'mazateque san bartolome ayautla' }
l['vmz'] = { nom = 'mazatèque de Mazatlán', tri = 'mazateque mazatlan' }
l['vnk'] = { nom = 'lovono' }
l['vnm'] = { nom = 'neve’ei' }
l['vnp'] = { nom = 'vunapu' }
l['vo'] = { nom = 'volapük', wiktionnaire = true }
l['volow'] = { nom = 'volow' }
l['volsque'] = { nom = 'volsque' }
l['vor'] = { nom = 'voro' }
l['vot'] = { nom = 'vote' }
l['vra'] = { nom = 'vera’a' }
l['vro'] = { nom = 'võro', wmlien = 'fiu-vro' }
l['vrt'] = { nom = 'banam bay' }
l['vun'] = { nom = 'wunjo' }
l['vut'] = { nom = 'vute' }
l['vwa'] = { nom = 'awa (môn-khmer)' }
l['wa'] = { nom = 'wallon', wiktionnaire = true }
l['waa'] = { nom = 'walla walla' }
l['wab'] = { nom = 'wab' }
l['wac'] = { nom = 'wasco-wishram' }
l['wad'] = { nom = 'wandamen' }
l['wae'] = { nom = 'walser' }
l['wah'] = { nom = 'watubela' }
l['wai'] = { nom = 'wares' }
l['waj'] = { nom = 'waffa' }
l['wak'] = { nom = 'langues wakashennes', tri = 'wakashennes langues' }
l['wal'] = { nom = 'wolaytta' }
l['wam'] = { nom = 'massachusett' }
l['wan'] = { nom = 'wan' }
l['wañám'] = { nom = 'wañám' }
l['wao'] = { nom = 'wappo' }
l['wap'] = { nom = 'wapishana' }
l['waq'] = { nom = 'wageman' }
l['war'] = { nom = 'waray (Philippines)' }
l['was'] = { nom = 'washo' }
l['wat'] = { nom = 'kaninuwa' }
l['wau'] = { nom = 'waurá' }
l['wav'] = { nom = 'waka' }
l['waw'] = { nom = 'waiwai' }
l['wax'] = { nom = 'marangis' }
l['way'] = { nom = 'wayana' }
l['waz'] = { nom = 'wampur' }
l['wba'] = { nom = 'warao' }
l['wbb'] = { nom = 'wabo' }
l['wbe'] = { nom = 'waritai' }
l['wbf'] = { nom = 'wara' }
l['wbh'] = { nom = 'wanda' }
l['wbi'] = { nom = 'wanji' }
l['wbj'] = { nom = 'alagwa' }
l['wbk'] = { nom = 'waigali' }
l['wbl'] = { nom = 'wakhi' }
l['wbm'] = { nom = 'vo' }
l['wbp'] = { nom = 'warlpiri' }
l['wbt'] = { nom = 'warnman' }
l['wbv'] = { nom = 'wajarri' }
l['wbw'] = { nom = 'woi' }
l['wca'] = { nom = 'yanomámi' }
l['wdj'] = { nom = 'wadjiginy' }
l['wdk'] = { nom = 'wadikali' }
l['wea'] = { nom = 'wewaw' }
l['wec'] = { nom = 'wé occidental' }
l['wed'] = { nom = 'wedau' }
l['weg'] = { nom = 'wergaia' }
l['weh'] = { nom = 'weh' }
l['wei'] = { nom = 'kiunum' }
l['wem'] = { nom = 'gbe weme' }
l['wen'] = { nom = 'langues sorabes', tri = 'sorabes langues' }
l['weo'] = { nom = 'wemale' }
l['wep'] = { nom = 'westphalien' }
l['wer'] = { nom = 'weri' }
l['wes'] = { nom = 'pidgin camerounais' }
l['wet'] = { nom = 'perai' }
l['weu'] = { nom = 'rawngtu' }
l['wew'] = { nom = 'wejewa' }
l['wfg'] = { nom = 'zorop' }
l['wga'] = { nom = 'wagaya' }
l['wgg'] = { nom = 'wangganguru' }
l['wgi'] = { nom = 'wahgi' }
l['wgo'] = { nom = 'waigeo' }
l['wgu'] = { nom = 'wirangu' }
l['wgy'] = { nom = 'warrgamay' }
l['whg'] = { nom = 'wahgi du Nord' }
l['whk'] = { nom = 'lebu’ kulit' }
l['wic'] = { nom = 'wichita' }
l['wie'] = { nom = 'wik-epa' }
l['wif'] = { nom = 'wik-keyangan' }
l['wig'] = { nom = 'wik-ngathan' }
l['wih'] = { nom = 'wik-me’anha' }
l['wii'] = { nom = 'minidien' }
l['wij'] = { nom = 'wik-iiyanh' }
l['wim'] = { nom = 'wik-mungkan' }
l['win'] = { nom = 'winnebago' }
l['wir'] = { nom = 'wiraféd' }
l['wiu'] = { nom = 'wiru' }
l['wiv'] = { nom = 'vitu' }
l['wiy'] = { nom = 'wiyot' }
l['wji'] = { nom = 'warji' }
l['wku'] = { nom = 'kunduvadi' }
l['wkw'] = { nom = 'wakawaka' }
l['wlc'] = { nom = 'shimwali' }
l['wle'] = { nom = 'wolane' }
l['wlk'] = { nom = 'wailaki' }
l['wll'] = { nom = 'wali (Soudan)' }
l['wlm'] = { nom = 'moyen gallois', tri = 'gallois moyen' }
l['wlo'] = { nom = 'wolio' }
l['wlr'] = { nom = 'wailapa' }
l['wls'] = { nom = 'wallisien' }
l['wlv'] = { nom = 'wichí lhamtés vejoz' }
l['wmb'] = { nom = 'wambaya' }
l['wmc'] = { nom = 'wamas' }
l['wmd'] = { nom = 'mamaindé' }
l['wme'] = { nom = 'wambule' }
l['wmg'] = { nom = 'muya de l’Ouest' }
l['wmh'] = { nom = 'waimaha' }
l['wms'] = { nom = 'wambon' }
l['wmt'] = { nom = 'walmajarri' }
l['wmw'] = { nom = 'mwani' }
l['wnc'] = { nom = 'wantoat' }
l['wnd'] = { nom = 'wandarang' }
l['wne'] = { nom = 'waneci' }
l['wng'] = { nom = 'wanggom' }
l['wni'] = { nom = 'shindzuani' }
l['wnk'] = { nom = 'wanokaka' }
l['wno'] = { nom = 'wano' }
l['wnp'] = { nom = 'wanap' }
l['wnu'] = { nom = 'usan' }
l['wnw'] = { nom = 'wintu' }
l['wny'] = { nom = 'wanyi' }
l['wo'] = { nom = 'wolof', wiktionnaire = true }
l['woc'] = { nom = 'wogeo' }
l['wod'] = { nom = 'wolani' }
l['woe'] = { nom = 'woléaïen' }
l['wog'] = { nom = 'wogamusin' }
l['woi'] = { nom = 'kamang' }
l['wom'] = { nom = 'wom (Nigeria)' }
l['won'] = { nom = 'wongo' }
l['wor'] = { nom = 'woria' }
l['wos'] = { nom = 'hanga hundi' }
l['wow'] = { nom = 'wawonii' }
l['wpc'] = { nom = 'maco' }
l['wra'] = { nom = 'warapu' }
l['wrb'] = { nom = 'warluwara' }
l['wrg'] = { nom = 'warungu' }
l['wrh'] = { nom = 'wiradjuri' }
l['wrk'] = { nom = 'garrwa' }
l['wrm'] = { nom = 'warumungu' }
l['wro'] = { nom = 'worrorra' }
l['wrp'] = { nom = 'waropen' }
l['wrr'] = { nom = 'wardaman' }
l['wrs'] = { nom = 'waris' }
l['wru'] = { nom = 'waru' }
l['wrw'] = { nom = 'gugu warra' }
l['wrx'] = { nom = 'wae rana' }
l['wry'] = { nom = 'merwari' }
l['wrz'] = { nom = 'waray (Australie)' }
l['wsa'] = { nom = 'warembori' }
l['wsi'] = { nom = 'wusi' }
l['wsk'] = { nom = 'waskia' }
l['wss'] = { nom = 'wasa' }
l['wsv'] = { nom = 'wotapuri-katarqala' }
l['wtf'] = { nom = 'watiwa' }
l['wth'] = { nom = 'wathawurrung' }
l['wti'] = { nom = 'berta' }
l['wtw'] = { nom = 'wotu' }
l['wuh'] = { nom = 'wutunhua' }
l['wul'] = { nom = 'silimo' }
l['wulguru'] = { nom = 'wulguru' }
l['wun'] = { nom = 'bungu' }
l['wut'] = { nom = 'wutung' }
l['wuu'] = { nom = 'wu' }
l['wuy'] = { nom = 'wauyai' }
l['wwo'] = { nom = 'dorig' }
l['wwr'] = { nom = 'warrwa' }
l['www'] = { nom = 'wawa' }
l['wya'] = { nom = 'wyandot' }
l['wya-hur'] = { nom = 'huron' }
l['wyb'] = { nom = 'wangaaybuwan-ngiyambaa' }
l['wyi'] = { nom = 'woiwurrung' }
l['wym'] = { nom = 'wilamowicien' }
l['wyr'] = { nom = 'ayuru' }
l['wyy'] = { nom = 'fidjien de l’Ouest' }
l['xaa'] = { nom = 'arabe andalou' }
l['xab'] = { nom = 'sambe' }
l['xad'] = { nom = 'adai' }
l['xag'] = { nom = 'albanien' }
l['xal'] = { nom = 'kalmouk' }
l['xam'] = { nom = 'ǀxam', tri = 'xam' }
l['xan'] = { nom = 'xamtanga' }
l['xap'] = { nom = 'apalachee' }
l['xaq'] = { nom = 'aquitain' }
l['xas'] = { nom = 'kamasse' }
l['xat'] = { nom = 'katawixi' }
l['xau'] = { nom = 'kauwera' }
l['xav'] = { nom = 'xavante' }
l['xaw'] = { nom = 'kawaiisu' }
l['xay'] = { nom = 'kayan de Mahakam' }
l['xbc'] = { nom = 'bactrien' }
l['xbg'] = { nom = 'bunganditj' }
l['xbi'] = { nom = 'kombio' }
l['xbm'] = { nom = 'moyen breton', tri = 'breton moyen' }
l['xbr'] = { nom = 'kambera' }
l['xcb'] = { nom = 'cambrien' }
l['xce'] = { nom = 'celtibère' }
l['xch'] = { nom = 'chimakum' }
l['xcl'] = { nom = 'arménien ancien' }
l['xco'] = { nom = 'chorasmien' }
l['xcm'] = { nom = 'comecrudo' }
l['xcn'] = { nom = 'cotoname' }
l['xcr'] = { nom = 'carien' }
l['xct'] = { nom = 'tibétain classique' }
l['xcu'] = { nom = 'couronien' }
l['xcw'] = { nom = 'coahuilteco' }
l['xdc'] = { nom = 'dace' }
l['xdk'] = { nom = 'dharug' }
l['xdm'] = { nom = 'édomite' }
l['xdo'] = { nom = 'kwandu' }
l['xdy'] = { nom = 'malais dayak' }
l['xeb'] = { nom = 'éblaïte' }
l['xed'] = { nom = 'hdi' }
l['xeg'] = { nom = 'ǁxegwi', tri = 'xegwi' }
l['xem'] = { nom = 'kembayan' }
l['xer'] = { nom = 'xerénte' }
l['xes'] = { nom = 'kesawai' }
l['xet'] = { nom = 'xéta' }
l['xeu'] = { nom = 'keoru-ahia' }
l['xfa'] = { nom = 'falisque' }
l['xga'] = { nom = 'galate' }
l['xgf'] = { nom = 'gabrielino-fernandeño' }
l['xgm'] = { nom = 'dharumbal' }
l['xgn'] = { nom = 'langues mongoles', tri = 'mongoles langues' }
l['xh'] = { nom = 'xhosa', wiktionnaire = true }
l['xha'] = { nom = 'harami' }
l['xhc'] = { nom = 'hunnique' }
l['xia'] = { nom = 'xiandao' }
l['xib'] = { nom = 'ibère' }
l['xii'] = { nom = 'xiri' }
l['xil'] = { nom = 'illyrien' }
l['xin'] = { nom = 'xinca' }
l['xiy'] = { nom = 'xipaya' }
l['xkc'] = { nom = 'kho’ini' }
l['xke'] = { nom = 'kereho' }
l['xkf'] = { nom = 'khengkha' }
l['xkg'] = { nom = 'kagoro' }
l['xkj'] = { nom = 'kajali' }
l['xkq'] = { nom = 'koroni' }
l['xkr'] = { nom = 'xakriabá' }
l['xku'] = { nom = 'kaamba' }
l['xkw'] = { nom = 'kembra' }
l['xky'] = { nom = 'uma’ lasan' }
l['xkz'] = { nom = 'kurtokha' }
l['xla'] = { nom = 'kamula' }
l['xlc'] = { nom = 'lycien' }
l['xld'] = { nom = 'lydien' }
l['xlg'] = { nom = 'ligure ancien' }
l['xln'] = { nom = 'alain' }
l['xlo'] = { nom = 'loup A' }
l['xlp'] = { nom = 'lépontique' }
l['xls'] = { nom = 'lusitain' }
l['xlu'] = { nom = 'louvite' }
l['xma'] = { nom = 'mushungulu' }
l['xmb'] = { nom = 'mboa' }
l['xmc'] = { nom = 'emakhuwa emarevoni' }
l['xmd'] = { nom = 'mbudum' }
l['xme'] = { nom = 'mède' }
l['xmf'] = { nom = 'mingrélien' }
l['xmk'] = { nom = 'ancien macédonien', tri = 'macedonien ancien' }
l['xmm'] = { nom = 'malais de Manado' }
l['xmr'] = { nom = 'méroïtique' }
l['xmt'] = { nom = 'matbat' }
l['xmz'] = { nom = 'mori bawah' }
l['xna'] = { nom = 'ancien arabe du Nord', tri = 'arabe du nord ancien' }
l['xnb'] = { nom = 'kanakanabu' }
l['xnd'] = { nom = 'langues na-dénées', tri = 'na denees langues' }
l['xng'] = { nom = 'moyen mongol', tri = 'mongol moyen' }
l['xni'] = { nom = 'ngarigu' }
l['xno'] = { nom = 'anglo-normand' }
l['xnr'] = { nom = 'kangri' }
l['xns'] = { nom = 'kanashi' }
l['xnt'] = { nom = 'narragansett' }
l['xny'] = { nom = 'nyiyaparli' }
l['xnz'] = { nom = 'kenzi' }
l['xoc'] = { nom = 'o’chi’chi’' }
l['xod'] = { nom = 'kokoda' }
l['xom'] = { nom = 'komo' }
l['xon'] = { nom = 'konkomba' }
l['xoo'] = { nom = 'xukuru' }
l['xop'] = { nom = 'kopar' }
l['xpe'] = { nom = 'kpellé du Liberia', tri = 'kpelle Liberia' }
l['xpi'] = { nom = 'picte' }
l['xpg'] = { nom = 'phrygien' }
l['xpm'] = { nom = 'pumpokol' }
l['xpq'] = { nom = 'mohegan' }
l['xpr'] = { nom = 'parthe' }
l['xps'] = { nom = 'pisidien' }
l['xpu'] = { nom = 'punique' }
l['xpy'] = { nom = 'puyo' }
l['xra'] = { nom = 'krahô' }
l['xrb'] = { nom = 'karaboro de l’Est' }
l['xre'] = { nom = 'kreye' }
l['xrn'] = { nom = 'arin' }
l['xrr'] = { nom = 'rhétique' }
l['xrt'] = { nom = 'aranama' }
l['xrw'] = { nom = 'karawa' }
l['xsa'] = { nom = 'sabéen' }
l['xsb'] = { nom = 'sambal' }
l['xsc'] = { nom = 'scythe' }
l['xsd'] = { nom = 'sidétique' }
l['xse'] = { nom = 'sempan' }
l['xsi'] = { nom = 'sio' }
l['xsl'] = { nom = 'esclave du Sud' }
l['xsm'] = { nom = 'kassem' }
l['xso'] = { nom = 'solano' }
l['xsp'] = { nom = 'silopi' }
l['xsq'] = { nom = 'makhuwa-saka' }
l['xsr'] = { nom = 'sherpa' }
l['xss'] = { nom = 'assane' }
l['xsu'] = { nom = 'sanumá' }
l['xsv'] = { nom = 'sudovien' }
l['xsy'] = { nom = 'saisiyat' }
l['xta'] = { nom = 'mixtèque de Xochapa', tri = 'mixteque xochapa' }
l['xtc'] = { nom = 'katcha-kadugli-miri' }
l['xtd'] = { nom = 'mixtèque de Diuxi-Tilantongo', tri = 'mixteque diuxi tilantongo' }
l['xtm'] = { nom = 'mixtèque de Magdalena Peñasco', tri = 'mixteque magdalena penasco' }
l['xto'] = { nom = 'tokharien A' }
l['xtw'] = { nom = 'tawandê' }
l['xty'] = { nom = 'mixtèque de Yoloxochitl', tri = 'mixteque yoloxochitl' }
l['xtz'] = { nom = 'tasmanien' }
l['xua'] = { nom = 'alu kurumba' }
l['xub'] = { nom = 'bettu kurumba' }
l['xud'] = { nom = 'umiida' }
l['xug'] = { nom = 'kunigami' }
l['xuj'] = { nom = 'jennu kurumba' }
l['xul'] = { nom = 'ngunawal' }
l['xum'] = { nom = 'ombrien' }
l['xun'] = { nom = 'unggarranggu' }
l['xup'] = { nom = 'haut umpqua', tri = 'umpqua haut' }
l['xur'] = { nom = 'urartéen' }
l['xuu'] = { nom = 'kxoe' }
l['xve'] = { nom = 'vénète' }
l['xvi'] = { nom = 'kamviri' }
l['xvn'] = { nom = 'vandale' }
l['xvs'] = { nom = 'vestinien' }
l['xwa'] = { nom = 'kwaza' }
l['xwc'] = { nom = 'woccon' }
l['xwd'] = { nom = 'wadi wadi' }
l['xwg'] = { nom = 'kwegu' }
l['xwk'] = { nom = 'wangkumara' }
l['xwo'] = { nom = 'oïrate' }
l['xww'] = { nom = 'wemba wemba' }
l['xxb'] = { nom = 'boro' }
l['xxk'] = { nom = 'keo' }
l['xxt'] = { nom = 'tambora' }
l['xyy'] = { nom = 'yorta yorta' }
l['xzh'] = { nom = 'zhang-zhung' }
l['yaa'] = { nom = 'yaminahua' }
l['yab'] = { nom = 'yuhup' }
l['yac'] = { nom = 'yali de Pass Valley' }
l['yad'] = { nom = 'yagua' }
l['yae'] = { nom = 'pumé' }
l['yaf'] = { nom = 'kiyaka' }
l['yag'] = { nom = 'yagan' }
l['yah'] = { nom = 'yazgulami' }
l['yai'] = { nom = 'yaghnobi' }
l['yaj'] = { nom = 'banda-yangere' }
l['yak'] = { nom = 'yakama' }
l['yal'] = { nom = 'dialonké' }
l['yam'] = { nom = 'yamba' }
l['yan'] = { nom = 'mayangna' }
l['yao'] = { nom = 'yao' }
l['yap'] = { nom = 'yapois' }
l['yar'] = { nom = 'yabarana' }
l['yaq'] = { nom = 'yaqui' }
l['yas'] = { nom = 'nugunu (Cameroun)' }
l['yat'] = { nom = 'yambeta' }
l['yau'] = { nom = 'yuwana' }
l['yav'] = { nom = 'yangben' }
l['yaw'] = { nom = 'yawalapití' }
l['yax'] = { nom = 'yauma' }
l['yay'] = { nom = 'agwagwune' }
l['yba'] = { nom = 'yala' }
l['ybb'] = { nom = 'yemba' }
l['ybe'] = { nom = 'yugur occidental' }
l['ybh'] = { nom = 'yakha' }
l['ybj'] = { nom = 'hasha' }
l['ybo'] = { nom = 'yabong' }
l['yby'] = { nom = 'yaweyuha' }
l['ycn'] = { nom = 'yucuna' }
l['ydd'] = { nom = 'yiddish de l’Est' }
l['ydg'] = { nom = 'yidgha' }
l['ydk'] = { nom = 'yoidik' }
l['yea'] = { nom = 'ravula' }
l['yec'] = { nom = 'yéniche' }
l['yee'] = { nom = 'yimas' }
l['yei'] = { nom = 'yeni' }
l['yej'] = { nom = 'yévanique' }
l['yel'] = { nom = 'yela' }
l['yer'] = { nom = 'tarok' }
l['yes'] = { nom = 'nyankpa' }
l['yet'] = { nom = 'yetfa' }
l['yeu'] = { nom = 'yerukala' }
l['yev'] = { nom = 'yapunda' }
l['yey'] = { nom = 'yeyi' }
l['yga'] = { nom = 'malyangapa' }
l['ygp'] = { nom = 'gepo' }
l['ygr'] = { nom = 'yagaria' }
l['ygw'] = { nom = 'yagwoia' }
l['yha'] = { nom = 'buyang baha' }
l['yhl'] = { nom = 'hlepho' }
l['yi'] = { nom = 'yiddish', wiktionnaire = true }
l['yia'] = { nom = 'yinggarda' }
l['yif'] = { nom = 'ache' }
l['yig'] = { nom = 'nasu wusa' }
l['yih'] = { nom = 'yiddish de l’Ouest' }
l['yii'] = { nom = 'yidiny' }
l['yij'] = { nom = 'yindjibarndi' }
l['yik'] = { nom = 'lalo de l’Est' }
l['yil'] = { nom = 'yindjilandji' }
l['yim'] = { nom = 'yimchungru' }
l['yiq'] = { nom = 'miqie' }
l['yis'] = { nom = 'yis' }
l['yir'] = { nom = 'aghu du Nord', tri = 'aghu Nord' }
l['yiu'] = { nom = 'awu' }
l['yix'] = { nom = 'ahi' }
l['yiy'] = { nom = 'yir yoront' }
l['yiz'] = { nom = 'azhe' }
l['yka'] = { nom = 'yakan' }
l['ykg'] = { nom = 'youkaguir de la toundra' }
l['yki'] = { nom = 'yoke' }
l['ykm'] = { nom = 'yakamul' }
l['yko'] = { nom = 'yasa' }
l['yky'] = { nom = 'yakoma' }
l['yla'] = { nom = 'ulwa (Papouasie-Nouvelle-Guinée)' }
l['ylg'] = { nom = 'yelogu' }
l['yli'] = { nom = 'yali d’Angguruk' }
l['yll'] = { nom = 'yil' }
l['yln'] = { nom = 'buyang langjia' }
l['ylo'] = { nom = 'naluo yi' }
l['ylr'] = { nom = 'yalarnnga' }
l['ylu'] = { nom = 'aribwaung' }
l['yly'] = { nom = 'nyelâyu' }
l['ymc'] = { nom = 'muji du Sud' }
l['yme'] = { nom = 'yameo' }
l['ymg'] = { nom = 'yamongeri' }
l['yml'] = { nom = 'iamalele' }
l['ymo'] = { nom = 'yangum mon' }
l['ymt'] = { nom = 'karagasse' }
l['ynd'] = { nom = 'yandruwandha' }
l['ynl'] = { nom = 'yangulam' }
l['ynn'] = { nom = 'yana' }
l['ynq'] = { nom = 'yendang' }
l['yns'] = { nom = 'yansi' }
l['yo'] = { nom = 'yoruba', wiktionnaire = true }
l['yob'] = { nom = 'yoba' }
l['yoi'] = { nom = 'yonaguni' }
l['yok-chk'] = { nom = 'chukchansi' }
l['yok-chw'] = { nom = 'chawchila' }
l['yok-chy'] = { nom = 'choynimni' }
l['yok-dum'] = { nom = 'dumna' }
l['yok-gas'] = { nom = 'gashowu' }
l['yok-hom'] = { nom = 'hometwoli' }
l['yok-lsj'] = { nom = 'san joaquin inférieur' }
l['yok-nut'] = { nom = 'tachi' }
l['yok-pos'] = { nom = 'palewyami' }
l['yok-tul'] = { nom = 'tulamni' }
l['yok-wik'] = { nom = 'wikchamni' }
l['yok-yaw'] = { nom = 'yawelmani' }
l['yok-ywd'] = { nom = 'yawdanchi' }
l['yol'] = { nom = 'yola' }
l['yom'] = { nom = 'yombe' }
l['yon'] = { nom = 'yongkom' }
l['yot'] = { nom = 'yotti' }
l['yoy'] = { nom = 'yoy' }
l['yox'] = { nom = 'yoron' }
l['ypa'] = { nom = 'phala' }
l['ypg'] = { nom = 'phola' }
l['ypk'] = { nom = 'langues youpikes', tri = 'youpikes langues' }
l['ypz'] = { nom = 'phuza' }
l['yrb'] = { nom = 'yareba' }
l['yre'] = { nom = 'yaouré' }
l['yrk'] = { nom = 'nénètse' }
l['yrl'] = { nom = 'nheengatu' }
l['yrn'] = { nom = 'yerong' }
l['yro'] = { nom = 'yaroamë' }
l['yrs'] = { nom = 'yarsun' }
l['yry'] = { nom = 'yarluyandi' }
l['ysd'] = { nom = 'samu' }
l['ysl'] = { nom = 'langue des signes yougoslave', tri = 'signes yougoslave' }
l['ysn'] = { nom = 'sani' }
l['ysr'] = { nom = 'sirenik' }
l['yss'] = { nom = 'yessan-mayo' }
l['ysy'] = { nom = 'sanie' }
l['yta'] = { nom = 'talu' }
l['ytl'] = { nom = 'tanglang' }
l['yua'] = { nom = 'maya yucatèque' }
l['yuanmen'] = { nom = 'yuanmen' }
l['yuc'] = { nom = 'yuchi' }
l['yud'] = { nom = 'arabe judéo-tripolitain' }
l['yue'] = { nom = 'cantonais', wmlien = 'zh-yue', portail = true, wiktionnaire = true }
l['yuf-hav'] = { nom = 'havasupai' }
l['yuf-wal'] = { nom = 'hualapai' }
l['yuf-yav'] = { nom = 'yavapai' }
l['yug'] = { nom = 'yug' }
l['yui'] = { nom = 'yuriti' }
l['yuj'] = { nom = 'karkar-yuri' }
l['yuk'] = { nom = 'yuki' }
l['yul'] = { nom = 'yulu' }
l['yulparija'] = { nom = 'yulparija' }
l['yum'] = { nom = 'quechan' }
l['yun'] = { nom = 'bena (Nigeria)' }
l['yup'] = { nom = 'yukpa' }
l['yuq'] = { nom = 'yuqui' }
l['yur'] = { nom = 'yurok' }
l['yurumanguí'] = { nom = 'yurumanguí' }
l['yut'] = { nom = 'yopno' }
l['yux'] = { nom = 'youkaguir de la Kolyma' }
l['yuy'] = { nom = 'yugur oriental' }
l['yuz'] = { nom = 'yuracaré' }
l['yva'] = { nom = 'yawa' }
l['yvt'] = { nom = 'yavitero' }
l['ywl'] = { nom = 'lalo de l’Ouest' }
l['ywr'] = { nom = 'yawuru' }
l['ywt'] = { nom = 'lalo central' }
l['yww'] = { nom = 'yawarawarga' }
l['yxl'] = { nom = 'yardliyawarra' }
l['yxu'] = { nom = 'yuyu' }
l['yyu'] = { nom = 'yau (province de Sandaun)' }
l['yzg'] = { nom = 'buyang ecun' }
l['za'] = { nom = 'zhuang', wiktionnaire = true }
l['zaa'] = { nom = 'zapotèque de la Sierra de Juárez', tri = 'zapotèque Juarez Sierra' }
l['zab'] = { nom = 'zapotèque de San Juan Guelavía', tri = 'zapotèque San Juan Guelavia' }
l['zac'] = { nom = 'zapotèque d’Ocotlán', tri = 'zapotèque Ocotlan' }
l['zad'] = { nom = 'zapotèque de Cajonos', tri = 'zapotèque Cajonos' }
l['zae'] = { nom = 'zapotèque de Yareni', tri = 'zapotèque Yareni' }
l['zaf'] = { nom = 'zapotèque d’Ayoquesco', tri = 'zapotèque Ayoquesco' }
l['zag'] = { nom = 'zaghawa' }
l['zai'] = { nom = 'zapotèque de l’Isthme', tri = 'zapotèque Isthme' }
l['zaj'] = { nom = 'zaramo' }
l['zak'] = { nom = 'zanaki' }
l['zal'] = { nom = 'zauzou' }
l['zam'] = { nom = 'zapotèque de Miahuatlán', tri = 'zapotèque Miahuatlan' }
l['zandui'] = { nom = 'zandui' }
l['zao'] = { nom = 'zapotèque d’Ozolotepec', tri = 'zapotèque Ozolotepec' }
l['zap'] = { nom = 'zapotèque' }
l['zaq'] = { nom = 'zapotèque d’Aloápam', tri = 'zapotèque Aloapam' }
l['zar'] = { nom = 'zapotèque de Rincón', tri = 'zapotèque Rincon' }
l['zas'] = { nom = 'zapotèque de Santo Domingo Albarradas', tri = 'zapotèque Santo DOmingo Albarradas' }
l['zat'] = { nom = 'zapotèque de Tabaa', tri = 'zapotèque Tabaa' }
l['zav'] = { nom = 'zapotèque de Yatzachi', tri = 'zapotèque Yatzachi' }
l['zaw'] = { nom = 'zapotèque de Mitla', tri = 'zapotèque Mitla' }
l['zax'] = { nom = 'zapotèque de Xadani', tri = 'zapotèque Xadani' }
l['zay'] = { nom = 'zayse-zergulla' }
l['zbc'] = { nom = 'batu belah' }
l['zbe'] = { nom = 'berawan long jegan' }
l['zbl'] = { nom = 'bliss' }
l['zbt'] = { nom = 'batui' }
l['zbu'] = { nom = 'zbu' }
l['zbw'] = { nom = 'berawan long terawan' }
l['zca'] = { nom = 'zapotèque de Coatecas Altas', tri = 'zapotèque Coatecas Altas' }
l['zdj'] = { nom = 'shingazidja' }
l['zea'] = { nom = 'zélandais' }
l['zeg'] = { nom = 'zenag' }
l['zen'] = { nom = 'zénaga' }
l['zga'] = { nom = 'kinga' }
l['zgb'] = { nom = 'zhuang de Guibei' }
l['zgh'] = { nom = 'amazighe standard marocain' }
l['zgr'] = { nom = 'magori' }
l['zh'] = { nom = 'chinois', portail = true, wiktionnaire = true }
l['zhb'] = { nom = 'zhaba' }
l['zhd'] = { nom = 'dai zhuang' }
l['zhn'] = { nom = 'nong zhuang' }
l['zhx'] = { nom = 'langues chinoises', tri = 'chinoises langues' }
l['zia'] = { nom = 'zia' }
l['zik'] = { nom = 'zimakani' }
l['zil'] = { nom = 'zialo' }
l['zin'] = { nom = 'zinza' }
l['ziw'] = { nom = 'zigua' }
l['zkb'] = { nom = 'koibale' }
l['zkg'] = { nom = 'koguryo' }
l['zkk'] = { nom = 'karankawa' }
l['zko'] = { nom = 'kott' }
l['zkr'] = { nom = 'zakhring' }
l['zkt'] = { nom = 'khitan' }
l['zku'] = { nom = 'kaurna' }
l['zkz'] = { nom = 'khazar' }
l['zle'] = { nom = 'langues slaves orientales', tri = 'slaves orientales langues' }
l['zls'] = { nom = 'langues slaves méridionales', tri = 'slaves meridionales langues' }
l['zlw'] = { nom = 'langues slaves occidentales', tri = 'slaves occidentales langues' }
l['zma'] = { nom = 'manda' }
l['zmb'] = { nom = 'zimba' }
l['zmc'] = { nom = 'margany' }
l['zme'] = { nom = 'mangerr' }
l['zmf'] = { nom = 'mfinu' }
l['zml'] = { nom = 'madngele' }
l['zmp'] = { nom = 'mpuono' }
l['zmr'] = { nom = 'maranunggu' }
l['zms'] = { nom = 'mbesa' }
l['zmu'] = { nom = 'muruwari' }
l['zmz'] = { nom = 'mbandja' }
l['znd'] = { nom = 'langues zandées', tri = 'zandees langues' }
l['zne'] = { nom = 'zandé' }
l['zng'] = { nom = 'mang' }
l['znk'] = { nom = 'manangkari' }
l['zns'] = { nom = 'mangas' }
l['zoc'] = { nom = 'zoque de Copainalá' }
l['zoh'] = { nom = 'zoque de Chimalapa' }
l['zom'] = { nom = 'zou' }
l['zoo'] = { nom = 'zapotèque d’Asunción Mixtepec', tri = 'zapotèque Asuncion Mixtepec' }
l['zoq'] = { nom = 'ayapaneco' }
l['zor'] = { nom = 'zoque de Rayón' }
l['zos'] = { nom = 'zoque de Francisco León' }
l['zpa'] = { nom = 'zapotèque de Lachiguiri', tri = 'zapotèque Lachiguiri' }
l['zpb'] = { nom = 'zapotèque de Yautepec', tri = 'zapotèque Yautepec' }
l['zpc'] = { nom = 'zapotèque de Choapan', tri = 'zapotèque Choapan' }
l['zpd'] = { nom = 'zapotèque de l’Ixtlán du Sud-Est', tri = 'zapotèque Ixtlan Sud Est' }
l['zpe'] = { nom = 'zapotèque de Petapa', tri = 'zapotèque Petapa' }
l['zpf'] = { nom = 'zapotèque de San Pedro Quiatoni', tri = 'zapotèque San Pedro Quiatoni' }
l['zpg'] = { nom = 'zapotèque de Guevea De Humboldt', tri = 'zapotèque Guevea de Humboldt' }
l['zph'] = { nom = 'zapotèque de Totomachapan', tri = 'zapotèque Totomachapan' }
l['zpi'] = { nom = 'zapotèque de Santa María Quiegolani', tri = 'zapotèque Santa Maria Quiegolani' }
l['zpj'] = { nom = 'zapotèque de Quiavicuzas', tri = 'zapotèque Quiavicuzas' }
l['zpk'] = { nom = 'zapotèque de Tlacolulita', tri = 'zapotèque Tlacolulita' }
l['zpl'] = { nom = 'zapotèque de Lachixío', tri = 'zapotèque Lachixio' }
l['zpm'] = { nom = 'zapotèque de Mixtepec', tri = 'zapotèque Mixtepec' }
l['zpn'] = { nom = 'zapotèque de Santa Inés Yatzechi', tri = 'zapotèque Santa Inez Yatzechi' }
l['zpo'] = { nom = 'zapotèque d’Amatlán', tri = 'zapotèque Amatlan' }
l['zpp'] = { nom = 'zapotèque d’El Alto', tri = 'zapotèque El Alto' }
l['zpq'] = { nom = 'zapotèque de San Bartolomé Zoogocho', tri = 'zapotèque San Bartolome Zoogocho' }
l['zpr'] = { nom = 'zapotèque de Xanica', tri = 'zapotèque Xanica' }
l['zps'] = { nom = 'zapotèque de Coatlán', tri = 'zapotèque Coatlan' }
l['zpt'] = { nom = 'zapotèque de San Vicente Coatlán', tri = 'zapotèque San Vicente Coatlan' }
l['zpu'] = { nom = 'zapotèque de Yalálag', tri = 'zapotèque Yalalag' }
l['zpv'] = { nom = 'zapotèque de San Baltazar Chichicápam', tri = 'zapotèque San Baltazar Chichicapam' }
l['zpw'] = { nom = 'zapotèque de Zaniza', tri = 'zapotèque Zaniza' }
l['zpx'] = { nom = 'zapotèque de San Baltazar Loxicha', tri = 'zapotèque San Baltazar Loxicha' }
l['zpy'] = { nom = 'zapotèque de Mazaltepec', tri = 'zapotèque Mazaltepec' }
l['zpz'] = { nom = 'zapotèque de Texmelucan', tri = 'zapotèque Texmelucan' }
l['zra'] = { nom = 'gaya' }
l['zrn'] = { nom = 'zirenkel' }
l['zro'] = { nom = 'záparo' }
l['zrp'] = { nom = 'sarphatique' }
l['zrs'] = { nom = 'mairasi' }
l['zsa'] = { nom = 'sarasira' }
l['zsr'] = { nom = 'zapotèque de Rincón du Sud', tri = 'zapotèque Rincon Sud' }
l['zsu'] = { nom = 'sukurum' }
l['zte'] = { nom = 'zapotèque d’Elotepec', tri = 'zapotèque Elotepec' }
l['ztg'] = { nom = 'zapotèque de San Francisco Ozolotepec', tri = 'zapotèque San Francisco Ozolotepec' }
l['ztl'] = { nom = 'zapotèque de Lapaguía-Guivini', tri = 'zapotèque Lapaguia Guivini' }
l['ztm'] = { nom = 'zapotèque de San Agustín Mixtepec', tri = 'zapotèque San Agustin Mixtepec' }
l['ztn'] = { nom = 'zapotèque de Santa Catarina Albarradas', tri = 'zapotèque Santa Catarina Albarradas' }
l['ztp'] = { nom = 'zapotèque de Loxicha', tri = 'zapotèque Loxicha' }
l['ztq'] = { nom = 'zapotèque de Quioquitani-Quierí', tri = 'zapotèque Quioquitani Quieri' }
l['zts'] = { nom = 'zapotèque de Tilquiapan', tri = 'zapotèque Tilquiapan' }
l['ztt'] = { nom = 'zapotèque de Tejalapan', tri = 'zapotèque Tejalapan' }
l['ztu'] = { nom = 'zapotèque de Güilá', tri = 'zapotèque Guila' }
l['ztx'] = { nom = 'zapotèque de Zaachila', tri = 'zapotèque Zaachila' }
l['zty'] = { nom = 'zapotèque de Yateé', tri = 'zapotèque Yatee' }
l['zu'] = { nom = 'zoulou', wiktionnaire = true }
l['zum'] = { nom = 'kumzari' }
l['zun'] = { nom = 'zuni' }
l['zwa'] = { nom = 'zay' }
l['zyb'] = { nom = 'zhuang de Yongbei' }
l['zyg'] = { nom = 'zhuang de Deqing' }
l['zyj'] = { nom = 'zhuang de Youjiang' }
l['zyn'] = { nom = 'zhuang de Yongnan' }
l['zza'] = { nom = 'zazaki' }
l['zzj'] = { nom = 'zhuang de Zuojiang' }
-- Fin langues
-- Redirections de langues
l['abk'] = l['ab']
l['aka'] = l['ak']
l['ancien danois'] = l['vieux danois']
l['ancien suédois'] = l['vieux suédois']
l['anglo-saxon'] = l['ang']
l['arb'] = l['ar']
l['ava'] = l['av']
l['bel'] = l['be']
l['ben'] = l['bn']
l['be-x-old'] = l['be-tarask']
l['bih'] = l['bh']
l['ca-val'] = l['ca-valencia']
l['calabrais central et méridional'] = l['calabrais centro-méridional']
l['celtique cisalpin'] = l['xlp']
l['cha'] = l['ch']
l['chu'] = l['cu']
l['chv'] = l['cv']
l['cym'] = l['cy']
l['dan'] = l['da']
l['dzo'] = l['dz']
l['erse'] = l['gd']
l['fas'] = l['fa']
l['fra-jer'] = l['normand']
l['fra-nor'] = l['normand']
l['gaul'] = l['gaulois']
l['gaumais'] = l['lorrain']
l['gcf'] = l['créole guadeloupéen']
l['gla'] = l['gd']
l['gle'] = l['ga']
l['glg'] = l['gl']
l['guj'] = l['gu']
l['hat'] = l['ht']
l['hau'] = l['ha']
l['hb'] = l['he']
l['hbs'] = l['sh']
l['heb'] = l['he']
l['ibo'] = l['ig']
l['insubre'] = l['xlp']
l['ipk'] = l['ik']
l['kal'] = l['kl']
l['kau'] = l['kr']
l['kaz'] = l['kk']
l['ko-Hani'] = l['ko']
l['ko-hanja'] = l['ko']
l['kur'] = l['ku']
l['lim'] = l['li']
l['lin'] = l['ln']
l['lit'] = l['lt']
l['lusitanien'] = l['xls']
l['mah'] = l['mh']
l['mal'] = l['ml']
l['manxois'] = l['gv']
l['mon'] = l['mn']
l['moyen scots'] = l['moyen écossais']
l['nrf'] = l['normand']
l['mri'] = l['mi']
l['nav'] = l['nv']
l['nde'] = l['nd']
l['nep'] = l['ne']
l['npi'] = l['ne']
l['nob'] = l['nb']
l['nno'] = l['nn']
l['orm'] = l['om']
l['per'] = l['fa']
l['poitevin'] = l['poitevin-saintongeais']
l['prv'] = l['oc']
l['roa-rup'] = l['rup']
l['roh'] = l['rm']
l['ron'] = l['ro']
l['run'] = l['rn']
l['rus'] = l['ru']
l['saintongeais'] = l['poitevin-saintongeais']
l['sicilo-calabrais'] = l['calabrais centro-méridional']
l['slk'] = l['sk']
l['slo'] = l['sk']
l['slv'] = l['sl']
l['smo'] = l['sm']
l['srd'] = l['sc']
l['srp'] = l['sr']
l['sud-picène'] = l['spx']
l['tir'] = l['ti']
l['tokipona'] = { nom = 'toki pona' }
l['ton'] = l['to']
l['tso'] = l['ts']
l['ukr'] = l['uk']
l['ven'] = l['ve']
l['vi-chunho'] = l['vi']
l['vi-chunom'] = l['vi']
l['vi-Hani'] = l['vi']
l['vieux curonien'] = l['xcu']
l['vieux néerlandais'] = l['vieux bas francique']
l['vieux scots'] = l['vieil écossais']
l['wel'] = l['cy']
l['xtg'] = l['gaulois']
l['yid'] = l['yi']
l['zahrar sproche'] = l['saurano']
l['zh-classical'] = l['lzh']
l['zh-min-nan'] = l['nan']
l['zh-yue'] = l['yue']
-- Fin redirections de langues
-- Proto-langues
l['indo-européen commun'] = { nom = 'indo-européen commun' }
l['proto-afro-asiatique'] = { nom = 'proto-afro-asiatique', tri = 'afro asiatique proto' }
l['proto-albanais'] = { nom = 'proto-albanais', tri = 'albanais proto' }
l['proto-algonquien'] = { nom = 'proto-algonquien', tri = 'algonquien proto' }
l['proto-altaïque'] = { nom = 'proto-altaïque', tri = 'altaique proto' }
l['proto-athapascan'] = { nom = 'proto-athapascan', tri = 'athapascan proto' }
l['proto-austroasiatique'] = { nom = 'proto-austroasiatique', tri = 'austroasiatique proto' }
l['proto-austronésien'] = { nom = 'proto-austronésien', tri = 'austronesien proto' }
l['proto-bahnarique'] = { nom = 'proto-bahnarique', tri = 'bahnarique proto' }
l['proto-bahnarique central'] = { nom = 'proto-bahnarique central', tri = 'bahnarique central proto' }
l['proto-bahnarique de l’Ouest'] = { nom = 'proto-bahnarique de l’Ouest', tri = 'bahnarique ouest proto' }
l['proto-bahnarique du Nord'] = { nom = 'proto-bahnarique du Nord', tri = 'bahnarique nord proto' }
l['proto-bahnarique du Sud'] = { nom = 'proto-bahnarique du Sud', tri = 'bahnarique sud proto' }
l['proto-balte'] = { nom = 'proto-balte', tri = 'balte proto' }
l['proto-balto-slave'] = { nom = 'proto-balto-slave', tri = 'balto slave proto' }
l['proto-bantou'] = { nom = 'proto-bantou', tri = 'bantou proto' }
l['proto-basque'] = { nom = 'proto-basque', tri = 'basque proto' }
l['proto-bodique oriental'] = { nom = 'proto-bodique oriental', tri = 'bodique oriental proto' }
l['proto-brittonique'] = { nom = 'proto-brittonique', tri = 'brittonique proto' }
l['proto-caribe'] = { nom = 'proto-caribe', tri = 'caribe proto' }
l['proto-celtique'] = { nom = 'proto-celtique', tri = 'celtique proto' }
l['proto-coréen'] = { nom = 'proto-coréen', tri = 'coréen proto' }
l['proto-costanoan'] = { nom = 'proto-costanoan', tri = 'costanoan proto' }
l['proto-dravidien'] = { nom = 'proto-dravidien', tri = 'dravidien proto' }
l['proto-dura'] = { nom = 'proto-dura', tri = 'dura proto' }
l['proto-fennique'] = { nom = 'proto-fennique', tri = 'fennique proto' }
l['proto-finno-ougrien'] = { nom = 'proto-finno-ougrien', tri = 'finno ougrien proto' }
l['proto-germanique'] = { nom = 'proto-germanique', tri = 'germanique proto' }
l['proto-germanique occidental'] = { nom = 'proto-germanique occidental', tri = 'germanique occidental proto' }
l['proto-grec'] = { nom = 'proto-grec', tri = 'grec proto' }
l['proto-hlai'] = { nom = 'proto-hlai', tri = 'hlai proto' }
l['proto-hrusique'] = { nom = 'proto-hrusique', tri = 'hrusique proto' }
l['proto-ienisseïen'] = { nom = 'proto-ienisseïen', tri = 'ienisseien proto' }
l['proto-indo-aryen'] = { nom = 'proto-indo-aryen', tri = 'indo aryen proto' }
l['proto-indo-iranien'] = { nom = 'proto-indo-iranien', tri = 'indo iranien proto' }
l['proto-iranien'] = { nom = 'proto-iranien', tri = 'iranien proto' }
l['proto-italique'] = { nom = 'proto-italique', tri = 'italique proto' }
l['proto-japonique'] = { nom = 'proto-japonique', tri = 'japonique proto' }
l['proto-japonique insulaire'] = { nom = 'proto-japonique insulaire', tri = 'japonique insulaire proto' }
l['proto-katuique'] = { nom = 'proto-katuique', tri = 'katuique proto' }
l['proto-keresan'] = { nom = 'proto-keresan', tri = 'keresan proto' }
l['proto-khasique'] = { nom = 'proto-khasique', tri = 'khasique proto' }
l['proto-khmer'] = { nom = 'proto-khmer', tri = 'khmer proto' }
l['proto-kiowa-tanoan'] = { nom = 'proto-kiowa-tanoan', tri = 'kiowa tanoan proto' }
l['proto-kiranti'] = { nom = 'proto-kiranti', tri = 'kiranti proto' }
l['proto-lolo'] = { nom = 'proto-lolo', tri = 'lolo proto' }
l['proto-lower cross'] = { nom = 'proto-lower cross', tri = 'lower cross proto' }
l['proto-malais'] = { nom = 'proto-malais', tri = 'malais proto' }
l['proto-malaïque'] = { nom = 'proto-malaïque', tri = 'malaique proto' }
l['proto-malayo-chamique'] = { nom = 'proto-malayo-chamique', tri = 'malayo chamique proto' }
l['proto-malayo-polynésien'] = { nom = 'proto-malayo-polynésien', tri = 'malayo polynesien proto' }
l['proto-malayo-sumbawien'] = { nom = 'proto-malayo-sumbawien', tri = 'malayo sumbawien proto' }
l['proto-masa'] = { nom = 'proto-masa', tri = 'masa proto' }
l['proto-maya'] = { nom = 'proto-maya', tri = 'maya proto' }
l['proto-micronésien'] = { nom = 'proto-micronésien', tri = 'micronesien proto' }
l['proto-miwok'] = { nom = 'proto-miwok', tri = 'miwok proto' }
l['proto-mongol'] = { nom = 'proto-mongol', tri = 'mongol proto' }
l['proto-môn-khmer'] = { nom = 'proto-môn-khmer', tri = 'mon khmer proto' }
l['proto-mônique'] = { nom = 'proto-mônique', tri = 'mônique proto' }
l['proto-murutique'] = { nom = 'proto-murutique', tri = 'murutique proto' }
l['proto-muskogéen'] = { nom = 'proto-muskogéen', tri = 'muskogeen proto' }
l['proto-nahuatl'] = { nom = 'proto-nahuatl', tri = 'nahuatl proto' }
l['proto-nguni'] = { nom = 'proto-nguni', tri = 'nguni proto' }
l['proto-nhanda-kartu'] = { nom = 'proto-nhanda-kartu', tri = 'nhanda kartu proto' }
l['proto-nivkh'] = { nom = 'proto-nivkh', tri = 'nivkh proto' }
l['proto-norrois'] = { nom = 'proto-norrois', tri = 'norrois proto' }
l['proto-numique'] = { nom = 'proto-numique', tri = 'numique proto' }
l['proto-océanien'] = { nom = 'proto-océanien', tri = 'oceanien proto' }
l['proto-one'] = { nom = 'proto-one', tri = 'one proto' }
l['proto-otomi'] = { nom = 'proto-otomi', tri = 'otomi proto' }
l['proto-ougrien'] = { nom = 'proto-ougrien', tri = 'ougrien proto' }
l['proto-ouralien'] = { nom = 'proto-ouralien', tri = 'ouralien proto' }
l['proto-palaungique'] = { nom = 'proto-palaungique', tri = 'palaungique proto' }
l['proto-pama-nyungan'] = { nom = 'proto-pama-nyungan', tri = 'pama nyungan proto' }
l['proto-paman'] = { nom = 'proto-paman', tri = 'paman proto' }
l['proto-polynésien'] = { nom = 'proto-polynésien', tri = 'polynesien proto' }
l['proto-pomo'] = { nom = 'proto-pomo', tri = 'pomo proto' }
l['proto-pong'] = { nom = 'proto-pong', tri = 'pong proto' }
l['proto-pwo'] = { nom = 'proto-pwo', tri = 'pwo proto' }
l['proto-ryūkyū'] = { nom = 'proto-ryūkyū', tri = 'ryukyu proto' }
l['proto-ryūkyū du Nord'] = { nom = 'proto-ryūkyū du Nord', tri = 'ryukyu nord proto' }
l['proto-ryūkyū du Sud'] = { nom = 'proto-ryūkyū méridional', tri = 'ryukyu sud proto' }
l['proto-Sabah du Sud-Ouest'] = { nom = 'proto-Sabah du Sud-Ouest', tri = 'sabah sud ouest proto' }
l['proto-same'] = { nom = 'proto-same', tri = 'same proto' }
l['proto-sangirien'] = { nom = 'proto-sangirien', tri = 'sangirien proto' }
l['proto-sarawak du Nord'] = { nom = 'proto-sarawak du Nord', tri = 'sarawak du nord proto' }
l['proto-sémitique'] = { nom = 'proto-sémitique', tri = 'semitique proto' }
l['proto-sérère-peul'] = { nom = 'proto-sérère-peul', tri = 'serere peul proto' }
l['proto-sino-tibétain'] = { nom = 'proto-sino-tibétain', tri = 'sino tibetain proto' }
l['proto-siouan'] = { nom = 'proto-siouan', tri = 'siouan proto' }
l['proto-slave'] = { nom = 'proto-slave', tri = 'slave proto' }
l['proto-subanen'] = { nom = 'proto-subanen', tri = 'subanen proto' }
l['proto-sunda-sulawesi'] = { nom = 'proto-sunda-sulawesi', tri = 'sunda sulawesi proto' }
l['proto-talodi'] = { nom = 'proto-talodi', tri = 'talodi proto' }
l['proto-tangkique'] = { nom = 'proto-tangkique', tri = 'tangkique proto' }
l['proto-tchadique central'] = { nom = 'proto-tchadique central', tri = 'tchadique central proto' }
l['proto-tibéto-birman'] = { nom = 'proto-tibéto-birman', tri = 'tibeto birman proto' }
l['proto-thaï'] = { nom = 'proto-thaï', tri = 'thai proto' }
l['proto-toungouse'] = { nom = 'proto-toungouse', tri = 'toungouse proto' }
l['proto-trans-néo-guinéen'] = { nom = 'proto-trans-néo-guinéen', tri = 'trans neo guineen proto' }
l['proto-tupi-guarani'] = { nom = 'proto-tupi-guarani', tri = 'tupi guarani proto' }
l['proto-turc'] = { nom = 'proto-turc', tri = 'turc proto' }
l['proto-vanuatu Nord-Central'] = { nom = 'proto-vanuatu Nord-Central', tri = 'vanuatu nord central proto' }
l['proto-viétique'] = { nom = 'proto-viétique', tri = 'vietique proto' }
l['proto-viêt-muong'] = { nom = 'proto-viêt-muong', tri = 'viet muong proto' }
l['proto-wa-lawa'] = { nom = 'proto-wa-lawa', tri = 'wa-lawa proto' }
l['proto-waïque'] = { nom = 'proto-waïque', tri = 'waique proto' }
l['proto-wintuan'] = { nom = 'proto-wintuan', tri = 'wintuan proto' }
-- Fin protolangues
-- Redirections de proto-langues
l['alg-pro'] = l['proto-algonquien']
l['ath-pro'] = l['proto-athapascan']
l['cel-pro'] = l['proto-celtique']
l['cost-pro'] = l['proto-costanoan']
l['fiu-pro'] = l['proto-finno-ougrien']
l['gem-pro'] = l['proto-germanique']
l['grk-pro'] = l['proto-grec']
l['ine-pie'] = l['indo-européen commun']
l['kere-pro'] = l['proto-keresan']
l['kita-pro'] = l['proto-kiowa-tanoan']
l['mus-pro'] = l['proto-muskogéen']
l['ougrien commun'] = l['proto-ougrien']
l['proto-chamito-sémitique'] = l['proto-afro-asiatique']
l['proto-indo-européen'] = l['indo-européen commun']
l['pomo-pro'] = l['proto-pomo']
l['sem-pro'] = l['proto-sémitique']
l['siou-pro'] = l['proto-siouan']
l['sit-pro'] = l['proto-sino-tibétain']
l['sla-pro'] = l['proto-slave']
l['trk-pro'] = l['proto-turc']
l['tupi-guarani'] = l['proto-tupi-guarani']
l['wint-pro'] = l['proto-wintuan']
-- Fin redirections de proto-langues
return l
0flz3xmgwlqejh09lcbbjuvtaj4vf06
मॉड्यूल:labels/data/lang/en
828
305032
487765
479859
2026-09-02T16:26:08Z
SM7
6218
localization...
487765
Scribunto
text/plain
local labels = {}
------------------------------------ North America ------------------------------------
labels["उत्तर अमेरिकी"] = {
aliases = {"उत्तर अमेरिकी"},
display = "[[कनाडा]], [[अमेरिकी अंग्रेज़ी|अमे.]]",
regional_categories = {"कनाडाई", "अमेरिकी"},
}
labels["caricature Black"] = {
display = "caricatures of Black speech",
def = "any of various caricatures of Black speech by non-Black writers",
aliases = {"caricature black", "a caricature of Black speech", "caricatures of Black speech"},
plain_categories = "Caricatures of Black English",
form_of_display = "a caricature of Black"
-- for use in T:pronunciation spelling of. use in T:altform and T:altspell is not intended and looks bad.
}
------------- Canada -------------
labels["Canada"] = {
aliases = {"CA", "Canadian", "CanE", "Canadian English"},
Wikipedia = "Canadian English",
regional_categories = "Canadian",
parent = "rawposcat:North American English,Commonwealth",
}
labels["Acadia"] = {
region = "colonial [[Acadia]]",
aliases = {"Acadian"},
Wikipedia = true,
regional_categories = "Acadian",
parent = "Canada",
}
labels["Alberta"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canadian Prairies",
}
labels["Atlantic Canada"] = {
Wikipedia = "Atlantic Canadian English",
regional_categories = "Atlantic Canadian",
parent = "Canada",
}
labels["British Columbia"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
labels["Canadian Prairies"] = {
the = true,
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
labels["Labrador"] = {
Wikipedia = true,
regional_categories = true,
parent = "Atlantic Canada",
}
labels["Manitoba"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canadian Prairies",
}
labels["Multicultural Toronto English"] = {
def = "the {{w|multiethnolect|multi-ethnic dialect}} of {{catlink|Canadian English}} used in the {{w|Greater Toronto Area}}, particularly among young non-white working-class speakers",
aliases = {"MTE"},
display = "MTE",
Wikipedia = true,
plain_categories = true,
parent = "Ontario",
}
labels["New Brunswick"] = {
Wikipedia = "Atlantic Canadian English",
regional_categories = true,
parent = "Atlantic Canada",
}
labels["Newfoundland"] = {
Wikipedia = "Newfoundland English",
regional_categories = true,
parent = "Atlantic Canada",
}
labels["Northwest Territories"] = {
region = "the [[Northwest Territories]] of [[Canada]]",
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
labels["Northwestern Ontario"] = {
aliases = {"northwestern Ontario", "Northwest Ontario", "northwest Ontario"},
Wikipedia = true,
regional_categories = true,
parent = "Ontario",
}
labels["Nova Scotia"] = {
Wikipedia = "Atlantic Canadian English",
regional_categories = true,
parent = "Atlantic Canada",
}
labels["Nunavut"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
labels["Ontario"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
labels["Prince Edward Island"] = {
Wikipedia = true,
regional_categories = true,
parent = "Atlantic Canada",
}
labels["Quebec"] = {
aliases = {"Québec"},
Wikipedia = "Quebec English",
regional_categories = true,
parent = "Canada",
}
labels["Saskatchewan"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canadian Prairies",
}
labels["Yukon"] = {
Wikipedia = true,
regional_categories = true,
parent = "Canada",
}
------------- US -------------
labels["अमे."] = {
region = "[[अमेरिका]]",
aliases = {"U.S.", "United States", "United States of America", "USA", "US English", "U.S. English", "America", "American", "American English"},
Wikipedia = "अमेरिकी अंग्रेज़ी",
regional_categories = "अमेरिकी",
parent = "rawposcat:उत्तर अमेरिकी अंग्रेज़ी",
}
labels["African-American Vernacular"] = {
def = "the variety of [[English]] spoken, especially in urban communities, by most working-class and some middle-class [[African-American]]s",
addl = "It is a [[sociolect]] with significantly different grammatical characteristics from {{w|Standard English}}, especially in {{w|tense-aspect}} and [[negation]] constructions. Many African-American communities maintain [[diglossia]] between African-American Vernacular English (AAVE) and Standard English.",
aliases = {"AAVE", "African American Vernacular", "African American Vernacular English", "African-American Vernacular English", "BVE"},
Wikipedia = "African-American Vernacular English",
regional_categories = true,
parent = "African-American",
}
labels["African-American"] = {
prep = "by",
region = "[[African-American]]s in the [[United States]]",
aliases = {"AA", "African-American English", "African American", "African American English", "AAE"},
Wikipedia = "African-American English",
regional_categories = true,
parent = "US",
}
labels["Alabama"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
labels["Alaska"] = {
Wikipedia = true,
regional_categories = true,
parent = "Northwestern US",
}
labels["Appalachia"] = {
aliases = {"Appalachian"},
Wikipedia = "Appalachian English",
regional_categories = "Appalachian",
parent = "US",
}
labels["Arizona"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southwestern US",
}
labels["Arkansas"] = {
Wikipedia = true,
regional_categories = "Arkansan",
parent = "South Midland US",
}
labels["Baltimore"] = {
Wikipedia = "Baltimore accent",
regional_categories = true,
parent = "Maryland",
}
labels["Boston"] = {
Wikipedia = "Boston accent",
regional_categories = true,
parent = "Massachusetts",
}
labels["Cajun"] = {
prep = "by",
region = "[[Cajun]]s in {{w|Acadiana|Southern Louisiana}}",
Wikipedia = "Cajun English",
regional_categories = true,
parent = "Louisiana",
}
labels["California"] = {
Wikipedia = "California English",
regional_categories = true,
parent = "Western US",
}
labels["Chicago"] = {
Wikipedia = {"Inland Northern American English", true},
regional_categories = true,
parent = "Illinois",
}
labels["Cincinnati"] = {
Wikipedia = "Midland American English#Cincinnati",
regional_categories = true,
parent = "Ohio,Kentucky",
}
labels["Colorado"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southwestern US",
}
labels["Connecticut"] = {
Wikipedia = true,
regional_categories = true,
parent = "New England",
}
labels["District of Columbia"] = {
region = "Washington, D.C.",
aliases = {"DC", "Washington, DC"},
Wikipedia = true,
regional_categories = "DC",
parent = "Mid-Atlantic US",
}
labels["Eastern New England"] = {
Wikipedia = "Eastern New England English",
regional_categories = true,
parent = "New England",
}
labels["Florida"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
labels["Georgia (US)"] = {
region = "the state of [[Georgia]] in the [[United States]]",
display = "Georgia",
Wikipedia = "Georgia (U.S. state)",
regional_categories = true,
parent = "Southern US",
}
labels["Hawaii"] = {
Wikipedia = true,
regional_categories = "Hawaiian",
parent = "Western US",
}
labels["Illinois"] = {
Wikipedia = true,
regional_categories = true,
parent = "Midland US,Northern US",
}
labels["Indiana"] = {
Wikipedia = true,
regional_categories = true,
parent = "Midland US,Northern US",
}
labels["Kentucky"] = {
Wikipedia = true,
regional_categories = true,
parent = "South Midland US",
}
labels["Louisiana"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
labels["Maine"] = {
Wikipedia = "Maine accent",
regional_categories = true,
parent = "New England",
}
labels["Maryland"] = {
Wikipedia = true,
regional_categories = true,
parent = "Mid-Atlantic US",
}
labels["Massachusetts"] = {
Wikipedia = true,
regional_categories = true,
parent = "New England",
}
labels["Memphis"] = {
regional_categories = true,
parent = "Southern US",
}
labels["Michigan"] = {
Wikipedia = true,
regional_categories = true,
parent = "Upper Midwestern US",
}
labels["Mid-Atlantic US"] = {
region = "the [[Mid-Atlantic]] United States",
Wikipedia = "Mid-Atlantic American English",
regional_categories = true,
parent = "US",
}
labels["Midland US"] = {
region = "the American [[Midland]]",
Wikipedia = "Midland American English",
regional_categories = true,
parent = "Midwestern US",
}
labels["Midwestern US"] = {
region = "the [[Midwest]] of the [[United States]]",
aliases = {"Midwest US"},
Wikipedia = "Midwestern American English",
regional_categories = true,
parent = "US",
}
labels["Mississippi"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
labels["Missouri"] = {
Wikipedia = true,
regional_categories = true,
parent = "Midland US",
}
labels["New England"] = {
Wikipedia = "New England English",
regional_categories = true,
parent = "Northeastern US",
}
labels["New Jersey"] = {
Wikipedia = "New Jersey English",
regional_categories = true,
parent = "Northeastern US",
}
labels["New Mexico"] = {
Wikipedia = "Western American English#New Mexico",
regional_categories = true,
parent = "Southwestern US",
}
labels["New Orleans"] = {
Wikipedia = "New Orleans English",
regional_categories = true,
parent = "Louisiana",
}
labels["New York City"] = {
aliases = {"NYC"},
Wikipedia = "New York City English",
regional_categories = true,
parent = "New York",
}
labels["New York"] = {
region = "the [[United States]] state of [[New York]]",
aliases = {"NY"},
Wikipedia = "New York English (disambiguation)",
regional_categories = true,
parent = "Northeastern US",
}
labels["North Carolina"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
-- can be split off if enough entries in it arise; group with Midland US for now
labels["North Midland US"] = {
aliases = {"Northern Midland US"},
Wikipedia = "Midland American English",
regional_categories = "Midland US",
}
labels["Northeastern US"] = {
region = "the {{w|Northeastern United States}}",
aliases = {"Northeast US"},
Wikipedia = {"Northern American English#Northeastern American English"},
regional_categories = true,
parent = "Northern US",
}
-- can be split off if enough entries in it arise; group with California for now
labels["Northern California"] = {
Wikipedia = "California English",
regional_categories = "California",
}
labels["Northwestern US"] = {
region = "the {{w|Northwestern United States}}",
aliases = {"Northwest US", "Pacific Northwest"},
Wikipedia = {"Pacific Northwest English", "Northwestern United States"},
regional_categories = true,
parent = "Western US",
}
labels["Ohio"] = {
Wikipedia = true,
regional_categories = true,
parent = "Midland US,Northern US",
}
labels["Oklahoma"] = {
Wikipedia = true,
regional_categories = true,
parent = "South Midland US",
}
labels["Pennsylvania Dutch English"] = {
prep = "by",
region = "{{w|Pennsylvania Dutch}} people in south-central [[Pennsylvania]]",
Wikipedia = true,
plain_categories = true,
parent = "Pennsylvania",
}
labels["Pennsylvania"] = {
Wikipedia = true,
regional_categories = true,
parent = "Northeastern US",
}
-- can be split off if enough entries in it arise; group with Pennsylvania for now
labels["Philadelphia"] = {
Wikipedia = "Philadelphia English",
regional_categories = true,
parent = "Pennsylvania,Mid-Atlantic US",
}
-- can be split off if enough entries in it arise; group with Western Pennsylvania for now
labels["Pittsburgh"] = {
Wikipedia = "Western Pennsylvania English",
regional_categories = "Western Pennsylvania",
parent = "Pennsylvania",
}
labels["Pittsburghese"] = {
Wikipedia = "Western Pennsylvania English",
regional_categories = "Western Pennsylvania",
parent = "Pennsylvania",
}
labels["Rhode Island"] = {
Wikipedia = true,
regional_categories = true,
parent = "New England",
}
labels["South Carolina"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
-- can be split off if enough entries in it arise; group with Midland US for now
labels["South Midland US"] = {
aliases = {"Southern Midland US"},
Wikipedia = "Midland American English",
regional_categories = "Midland US",
}
-- can be split off if enough entries in it arise; group with California for now
labels["Southern California"] = {
Wikipedia = "California English",
regional_categories = "California",
}
labels["Southern US"] = {
region = "the {{w|Southern United States}}",
aliases = {"Southern American English", "southern US", "US South"},
Wikipedia = "Southern American English",
regional_categories = true,
parent = "US",
}
labels["Southwestern US"] = {
region = "the {{w|Southwestern United States}}",
aliases = {"southwestern US", "Southwest US", "southwest US"},
Wikipedia = {"Western American English", "Southwestern United States"},
regional_categories = true,
parent = "Western US",
}
labels["St. Louis"] = {
Wikipedia = "St. Louis dialect",
regional_categories = true,
parent = "Missouri,Illinois",
}
labels["St. Vincent"] = {
Wikipedia = "Saint Vincent (Saint Vincent and the Grenadines)",
regional_categories = "Saint Vincentian",
parent = "Caribbean",
}
labels["Texas"] = {
Wikipedia = "Texan English",
regional_categories = true,
parent = "Southern US,Southwestern US",
}
labels["Upper Midwestern US"] = {
region = "the {{w|Upper Midwest}} of the [[United States]]",
aliases = {"Upper Midwest US"},
Wikipedia = {"North-Central American English", "Upper Midwest"},
regional_categories = true,
parent = "Midwestern US,Northern US",
}
labels["Vermont"] = {
Wikipedia = {"New England English", "Vermont"},
regional_categories = true,
parent = "New England",
}
labels["Virginia"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern US",
}
labels["Western Pennsylvania"] = {
aliases = {"Western Pennsylvania English"},
Wikipedia = "Western Pennsylvania English",
regional_categories = true,
parent = "Pennsylvania",
}
labels["Western US"] = {
region = "the {{w|Western United States}}",
aliases = {"western US"},
Wikipedia = {"Western American English", "Western United States"},
regional_categories = true,
parent = "US",
}
labels["Wisconsin"] = {
Wikipedia = true,
regional_categories = true,
parent = "Upper Midwestern US",
}
------------------------------------ Australia and New Zealand ------------------------------------
labels["Australian Aboriginal"] = {
prep = "by",
region = "[[Aboriginal]] people in [[Australia]]",
aliases = {"Australian aboriginal", "Australian Aboriginal English", "Australian aboriginal English", "Aboriginal Australian", "aboriginal Australian", "Aboriginal Australian English", "aboriginal Australian English"},
Wikipedia = "Australian Aboriginal English",
regional_categories = true,
parent = "Australia",
}
labels["Australia"] = {
aliases = {"Australian", "AU", "AuE", "Aus", "AusE"},
Wikipedia = "Australian English",
accent_Wikipedia = "Australian English phonology",
regional_categories = "Australian",
parent = "Oceania,Commonwealth",
}
labels["Canberra"] = {
region = "the [[Australian Capital Territory]] ([[Canberra]])",
Wikipedia = {"Variation in Australian English#Regional variation", true},
regional_categories = true,
parent = "Australia",
}
labels["New South Wales"] = {
aliases = {"NSW"},
Wikipedia = {"Variation in Australian English#Regional variation", true},
regional_categories = true,
parent = "Australia",
}
labels["New Zealand"] = {
aliases = {"NZ", "NZE"},
Wikipedia = "New Zealand English",
accent_Wikipedia = "New Zealand English phonology",
regional_categories = true,
parent = "Oceania,Commonwealth",
}
labels["Northern Territory"] = {
aliases = {"NT"},
Wikipedia = {"Variation in Australian English#Regional variation", true},
regional_categories = true,
parent = "Australia",
}
labels["Northern US"] = {
region = "the {{w|Northern United States}}",
aliases = {"Northern American English", "northern US", "US North"},
Wikipedia = "Northern American English",
regional_categories = true,
parent = "US",
}
labels["Queensland"] = {
Wikipedia = {"Variation in Australian English#Regional variation", true},
regional_categories = true,
parent = "Australia",
}
labels["South Australia"] = {
Wikipedia = "South Australian English",
regional_categories = "South Australian",
parent = "Australia",
}
labels["Tasmania"] = {
Wikipedia = {"Variation in Australian English#Regional variation", true},
regional_categories = "Tasmanian",
parent = "Australia",
}
labels["Victoria"] = {
Wikipedia = {"Variation in Australian English#Regional variation", "Victoria (state)"},
regional_categories = true,
parent = "Australia",
}
labels["Western Australia"] = {
Wikipedia = "Western Australian English",
regional_categories = "Western Australian",
parent = "Australia",
}
------------------------------------ Ireland ------------------------------------
labels["Cork"] = {
Wikipedia = {"South-West Irish English", "Cork (city)"},
regional_categories = "Munster",
}
labels["Dublin"] = {
Wikipedia = {"Dublin English", "Dublin", "DE"},
regional_categories = true,
parent = "Ireland",
}
labels["Ireland"] = {
aliases = {"Irish", "IE"},
Wikipedia = "Hiberno-English",
regional_categories = "Irish",
parent = "Europe",
}
labels["Munster"] = {
Wikipedia = {"South-West Irish English", "Munster"},
regional_categories = true,
parent = "Ireland",
}
------------------------------------ United Kingdom ------------------------------------
labels["यूके"] = {
addl = "Not to be confused with [[:Category:British English forms|British spellings]], a spelling system used in some English-speaking countries of the world.",
aliases = {"United Kingdom", "British", "Britain", "Great Britain"},
Wikipedia = "ब्रिटिश अंग्रेज़ी",
regional_categories = "ब्रिटिश",
parent = "Europe,Commonwealth",
country = "यूनाइटेड किंगडम",
}
labels["Antrim"] = {
Wikipedia = "County Antrim",
regional_categories = "Northern Irish",
}
labels["Bedfordshire"] = {
Wikipedia = "Bedfordshire dialect",
regional_categories = true,
parent = "Southern England",
}
labels["Berkshire"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern England",
}
labels["Birmingham"] = {
Wikipedia = "Brummie dialect",
regional_categories = true,
parent = "West Midlands",
}
labels["Bristol"] = {
region = "[[Bristol]], [[England]]",
aliases = {"Bristolian"},
Wikipedia = "Bristolian dialect",
regional_categories = "Bristolian",
parent = "West Country",
}
labels["Caithness"] = {
Wikipedia = true,
regional_categories = true,
parent = "Scotland",
}
labels["Cambridge University"] = {
prep = "at",
region = "{{w|Cambridge University}} in [[Cambridge]]",
aliases = {"University of Cambridge", "Cantab"},
Wikipedia = "University of Cambridge",
regional_categories = true,
parent = "East Anglia",
othercat = "en:Universities",
}
labels["Channel Islands"] = {
the = true,
Wikipedia = "Channel Island English",
regional_categories = true,
parent = "Europe,Commonwealth",
}
labels["Cockney"] = {
prep = "by",
region = "working-class [[Londoner]]s, especially in the [[East End]]",
Wikipedia = "Cockney#Speech",
regional_categories = true,
parent = "London",
}
labels["Cornwall"] = {
aliases = {"Cornish"},
Wikipedia = "Cornish dialect",
regional_categories = "Cornish",
parent = "West Country",
}
labels["Cumbria"] = {
aliases = {"Cumbrian"},
Wikipedia = "Cumbrian dialect",
regional_categories = "Cumbrian",
parent = "Northern England",
}
labels["Derbyshire"] = {
region = "[[Derbyshire]], which is geographically in the East Midlands but whose dialect is sometimes classified as West Midlands",
Wikipedia = "Derbyshire dialect",
regional_categories = true,
parent = "East Midlands,West Midlands",
}
labels["Devon"] = {
aliases = {"Devonshire"},
Wikipedia = {"West Country English", true},
regional_categories = "Devonian",
parent = "West Country",
}
labels["Dorset"] = {
Wikipedia = "Dorset dialect",
regional_categories = true,
parent = "West Country",
}
labels["Dundee"] = {
Wikipedia = true,
regional_categories = true,
parent = "Scotland",
}
labels["Durham University"] = {
prep = "at",
region = "{{w|Durham University}} in [[Durham]]",
Wikipedia = true,
regional_categories = true,
parent = "Durham",
othercat = "en:Universities",
}
labels["Durham"] = {
Wikipedia = "County Durham",
regional_categories = true,
parent = "Northumbria",
}
labels["East Anglia"] = {
Wikipedia = "East Anglian English",
regional_categories = "East Anglian",
parent = "England",
}
labels["East Midlands"] = {
region = "the [[East Midlands]] of [[England]]",
Wikipedia = "East Midlands English",
regional_categories = true,
parent = "Midlands",
}
labels["England"] = {
aliases = {"English"},
Wikipedia = "English language in England",
regional_categories = "English",
parent = "British",
}
labels["England and Wales"] = {
aliases = {"E&W"},
Wikipedia = true,
regional_categories = {"English", "Welsh"},
}
labels["Essex"] = {
Wikipedia = "Essex dialect",
regional_categories = true,
parent = "Southern England",
}
labels["Exmoor"] = {
Wikipedia = true,
regional_categories = {"Devonian", "Somerset"},
}
labels["Geordie"] = {
region = "Tyneside",
aliases = {"Geordie English", "Tyneside"},
Wikipedia = true,
plain_categories = true,
parent = "Northumbria",
}
labels["Gloucestershire"] = {
Wikipedia = {"West Country English", true},
regional_categories = true,
parent = "West Country",
}
labels["Guernsey"] = {
prep = "on",
Wikipedia = "Channel Island English#Guernsey English",
regional_categories = true,
parent = "Channel Islands",
}
labels["Hartlepool"] = {
Wikipedia = "Smoggie",
regional_categories = "Teesside",
}
labels["Herefordshire"] = {
Wikipedia = true,
regional_categories = true,
parent = "West Country",
}
labels["Isle of Man"] = {
prep = "on",
the = true,
aliases = {"Manx"},
Wikipedia = "Manx English",
regional_categories = "Manx",
parent = "British",
}
labels["Isle of Wight"] = {
prep = "on",
the = true,
Wikipedia = true,
regional_categories = true,
parent = "Southern England",
}
labels["Jersey"] = {
prep = "on",
Wikipedia = "Channel Island English#Jersey English",
regional_categories = true,
parent = "Channel Islands",
}
labels["Kent"] = {
aliases = {"Kentish"},
Wikipedia = "Kentish dialect",
regional_categories = "Kentish",
parent = "Southern England",
}
labels["Lancashire"] = {
Wikipedia = "Lancashire dialect",
regional_categories = true,
parent = "Northern England",
}
labels["Lewis"] = {
prep = "on",
region = "the [[Isle of Lewis]]",
aliases = {"Isle of Lewis"},
Wikipedia = "Isle of Lewis",
regional_categories = true,
parent = "Scotland",
}
labels["Lincolnshire"] = {
Wikipedia = "Lincolnshire dialect",
regional_categories = true,
parent = "East Midlands",
}
labels["Liverpool"] = {
region = "the {{w|Liverpool City Region}}, comprising the [[metropolitan county]] of [[Merseyside]] and the [[Cheshire]] [[unitary authority]] of [[Halton]]",
aliases = {"Scouse"},
Wikipedia = "Scouse",
regional_categories = "Liverpudlian",
parent = "Northern England",
}
labels["London"] = {
Wikipedia = "Estuary English",
regional_categories = true,
parent = "Southern England",
}
labels["Manchester"] = {
aliases = {"Mancunian"},
Wikipedia = "Manchester dialect",
regional_categories = "Mancunian",
parent = "Northern England",
}
labels["Mid-Ulster"] = {
region = "central [[Ulster]]",
aliases = {"Mid-Ulster English"},
Wikipedia = "Mid-Ulster English",
regional_categories = true,
parent = "Ulster,Northern Ireland",
}
labels["Midlands"] = {
region = "the [[Midlands]] of [[England]]",
aliases = {"English Midlands", "South Midlands"},
Wikipedia = "Midlands English",
regional_categories = true,
parent = "England",
}
labels["Multicultural London English"] = {
prep = "by",
region = "young, working-class people in multicultural parts of [[London]]",
aliases = {"MLE"},
display = "MLE",
Wikipedia = true,
plain_categories = true,
parent = "London",
}
labels["Norfolk"] = {
Wikipedia = "Norfolk dialect",
regional_categories = true,
parent = "East Anglia",
}
labels["North Wales"] = {
Wikipedia = {"Welsh English", true},
regional_categories = true,
parent = "Wales",
}
labels["Northern England"] = {
aliases = {"northern England", "North England", "north England"},
Wikipedia = "English language in Northern England",
regional_categories = true,
parent = "England",
}
labels["Northern Ireland"] = {
aliases = {"Northern Irish", "NI"},
Wikipedia = "Ulster English",
regional_categories = "Northern Irish",
parent = "Ulster",
}
labels["Northern Isles"] = {
display = "[[w:Orkney|Orkney]], [[w:Shetland|Shetland]]",
regional_categories = {"Orkney", "Shetland"},
}
labels["Northumberland"] = {
Wikipedia = {"Northumberland"},
regional_categories = true,
parent = "Northumbria",
}
labels["Northumbria"] = {
aliases = {"Northumbrian", "Northeast England", "North-East England", "North East England"},
Wikipedia = {"Northumbrian dialect", "Northumbria (modern)"},
regional_categories = "Northumbrian",
parent = "Northern England",
}
labels["Nottinghamshire"] = {
Wikipedia = "Nottinghamshire dialect",
regional_categories = true,
parent = "East Midlands",
}
labels["Orkney"] = {
prep = "on",
aliases = {"Orcadian"},
Wikipedia = {true, "Highland English"},
regional_categories = true,
parent = "Scotland",
}
labels["Oxbridge"] = {
Wikipedia = true,
regional_categories = {"Cambridge University", "Oxford University"},
}
labels["Oxford City"] = {
region = "the city of [[Oxford]] in [[England]]",
Wikipedia = true,
regional_categories = "Oxford",
parent = "Oxfordshire",
}
labels["Oxford University"] = {
prep = "at",
aliases = {"University of Oxford", "Oxon"},
Wikipedia = "University of Oxford",
regional_categories = true,
parent = "Oxford City",
othercat = "en:Universities",
}
labels["Oxfordshire"] = {
Wikipedia = true,
regional_categories = true,
parent = "Southern England",
}
labels["Pitmatic"] = {
Wikipedia = true,
regional_categories = true,
parent = "Northumbria",
}
labels["Potteries"] = {
region = "Stoke-on-Trent",
Wikipedia = "Potteries dialect",
regional_categories = true,
parent = "West Midlands",
}
labels["Scotland"] = {
aliases = {"Scottish", "Scottish English", "ScE"},
Wikipedia = "Scottish English",
regional_categories = "Scottish",
parent = "British",
}
labels["Shetland"] = {
region = "the [[Shetland Islands]]",
aliases = {"Shetland Islands", "Shetlands"},
Wikipedia = {true, "Highland English"},
regional_categories = true,
parent = "Scotland",
}
labels["Shropshire"] = {
Wikipedia = true,
regional_categories = true,
parent = "West Midlands",
}
labels["Somerset"] = {
Wikipedia = {"West Country English", true},
regional_categories = true,
parent = "West Country",
}
-- eventually maybe break this out into its own category
labels["South Midlands"] = {
Wikipedia = {"Midlands English", "South Midlands"},
regional_categories = "Midlands",
}
labels["South Wales"] = {
Wikipedia = {"Welsh English", true},
regional_categories = true,
parent = "Wales",
}
labels["Southern England"] = {
aliases = {"southern England", "South England", "south England", "Southern English"},
Wikipedia = "English in southern England",
regional_categories = true,
parent = "England",
}
labels["Suffolk"] = {
Wikipedia = "Suffolk dialect",
regional_categories = true,
parent = "East Anglia",
}
labels["Sussex"] = {
Wikipedia = "Sussex dialect",
regional_categories = true,
parent = "Southern England",
}
labels["Teesside"] = {
Wikipedia = "Smoggie",
regional_categories = true,
parent = "Northumbria",
}
-- Tyneside: see Geordie
labels["Ulster"] = {
Wikipedia = "Ulster English",
regional_categories = true,
parent = "Ireland",
}
labels["Wales"] = {
aliases = {"Welsh"},
Wikipedia = "Welsh English",
regional_categories = "Welsh",
parent = "British",
}
labels["Wearside"] = {
Wikipedia = {"Mackem", true},
regional_categories = true,
parent = "Northumbria",
}
labels["West Country"] = {
the = true,
aliases = {"West England", "west England"},
Wikipedia = "West Country English",
regional_categories = true,
parent = "England",
}
-- can be split off if enough entries in it arise; group with Cumbria for now
labels["West Cumbria"] = {
Wikipedia = "Cumbrian dialect",
regional_categories = "Cumbrian",
}
labels["West Midlands"] = {
region = "the [[West Midlands]] of [[England]]",
Wikipedia = "West Midlands English",
regional_categories = true,
parent = "Midlands",
}
labels["Wiltshire"] = {
Wikipedia = {"West Country English", true},
regional_categories = true,
parent = "West Country",
}
labels["Yorkshire"] = {
Wikipedia = "Yorkshire dialect",
regional_categories = true,
parent = "Northern England",
}
-------------------------------- South Asia --------------------------------
labels["South Asia"] = {
aliases = {"Indic", "South Asian"},
Wikipedia = "South Asian English",
regional_categories = "South Asian",
parent = "Asia",
}
labels["Afghanistan"] = {
Wikipedia = true,
regional_categories = "Afghan",
parent = "South Asia",
}
labels["Bangladesh"] = {
Wikipedia = "Bangladeshi English",
regional_categories = "Bangladeshi",
parent = "South Asia,Commonwealth",
}
labels["Nepal"] = {
Wikipedia = "Nepalese English",
regional_categories = "Nepali",
parent = "South Asia,Commonwealth",
}
labels["Sri Lanka"] = {
aliases = {"Sri Lankan"},
Wikipedia = "Sri Lankan English",
regional_categories = "Sri Lankan",
parent = "South Asia,Commonwealth",
}
labels["Pakistan"] = {
aliases = {"Pakistani"},
Wikipedia = "Pakistani English",
regional_categories = "Pakistani",
parent = "South Asia,Commonwealth",
}
labels["British Pakistani"] = {
prep = "by",
region = "{{w|British Pakistanis}}, i.e. [[British]] citizens of [[Pakistani]] origin",
Wikipedia = "British Pakistanis",
regional_categories = true,
parent = "South Asia,British",
}
labels["British India"] = {
fulldef = "Anglo-Indian terms or senses in English as used formerly by Britishers in {{w|British India}}",
Wikipedia = "Indian English", -- The WP articles are strictly divided by geography, not historical period
regional_categories = true,
parent = "South Asia,British",
othercat = "English terms with historical senses",
}
labels["भारत"] = {
aliases = {"भारतीय", "भारतीय अंग्रेज़ी", "InE"},
Wikipedia = "भारतीय अंग्रेज़ी",
accent_Wikipedia = "Indian English#Phonology",
regional_categories = "भारतीय",
parent = "दक्षिण एशिया,कॉमनवेल्थ",
}
labels["North India"] = {
Wikipedia = true,
regional_categories = "North Indian",
parent = "India",
}
labels["South India"] = {
aliases = {"South Indian"},
Wikipedia = true,
regional_categories = "South Indian",
parent = "India",
}
labels["West Bengal"] = {
Wikipedia = true,
accent_Wikipedia = "Regional differences and dialects in Indian English#Bengali English",
regional_categories = true,
parent = "India",
}
labels["हिंग्लिश"] = {
def = "[[हिंग्लिश]], an English-based [[creole]] incorporating many [[Hindi]] words; used informally in [[India]]",
Wikipedia = true,
plain_categories = true,
parent = "North India",
}
labels["Tamil Nadu"] = {
aliases = {"TN", "Tamilnadu"},
accent_Wikipedia = "Regional differences and dialects in Indian English#Southern Indian English",
parent="South India"
}
labels["Kerala"] = {
accent_Wikipedia = "Regional differences and dialects in Indian English#Malayali",
aliases = { "Malayalam", "Mallu" },
parent = "South India"
}
------------------------------------ World ------------------------------------
labels["Africa"] = {
aliases = {"African"},
Wikipedia = "African English",
regional_categories = "African",
parent = true,
}
labels["Antarctica"] = {
Wikipedia = "Antarctic English",
regional_categories = "Antarctic",
parent = true,
}
labels["Asia"] = {
Wikipedia = "Asian English",
regional_categories = "Asian",
parent = true,
}
labels["Bahamas"] = {
the = true,
Wikipedia = "Bahamian English",
regional_categories = "Bahaman",
parent = "Caribbean",
}
labels["Barbados"] = {
Wikipedia = "English in Barbados",
regional_categories = "Barbadian",
parent = "Caribbean",
}
labels["Belize"] = {
Wikipedia = "Belizean English",
regional_categories = "Belizean",
parent = "Caribbean,Central America",
}
labels["Benglish"] = {
def = "[[Benglish]], an English-based [[creole]] incorporating many [[Bengali]] words; used informally in [[Bangladesh]] and [[West Bengal]]",
aliases = {"Banglish"},
Wikipedia = true,
plain_categories = true,
parent = "Bangladesh,West Bengal",
}
labels["Bermuda"] = {
Wikipedia = "Bermudian English",
regional_categories = "Bermudian",
parent = "Caribbean,rawposcat:North American English,British",
}
labels["Botswana"] = {
Wikipedia = "Botswana English",
regional_categories = "Botswanan",
parent = "Africa",
}
labels["Brunei"] = {
Wikipedia = "Brunei English",
regional_categories = "Bruneian",
parent = "Southeast Asia",
}
labels["Cameroon"] = {
aliases = {"CM", "Cameroonian", "Cameroonian English", "en-CM"},
Wikipedia = "Cameroonian English",
regional_categories = "Cameroonian",
parent = "Africa",
}
labels["Caribbean"] = {
the = true,
aliases = {"West Indies"},
Wikipedia = "Caribbean English",
regional_categories = true,
parent = true,
}
labels["Cebu"] = {
Wikipedia = true,
regional_categories = true,
parent = "Philippines",
}
labels["Central America"] = {
Wikipedia = true,
regional_categories = "Central American",
parent = "rawposcat:North American English",
}
labels["Ceylon"] = {
Wikipedia = true,
regional_categories = "Sri Lankan",
}
labels["China"] = {
Wikipedia = true,
regional_categories = "Chinese",
parent = "East Asia",
}
labels["Chinese Filipino"] = {
verb = "used",
prep = "by",
region = "Chinese Filipinos",
aliases = {"Chinese-Filipino"}, -- Sociolect subset to Philippine English
-- may also see "Hokaglish" in Wikipedia, although Hokaglish is the codeswitching form with a Hokkien or Tagalog base, just like Philippine English to "Conyo" (English-based) and "Taglish" (Tagalog-based), whereas this is the English variant itself subset to Philippine English.
Wikipedia = "Chinese Filipino#Language",
regional_categories = true,
parent = "Philippines",
}
labels["Chinglish"] = {
def = "[[English]] that has been influenced by [[Chinese]]",
Wikipedia = true,
plain_categories = true,
parent = "China",
}
labels["Commonwealth"] = {
region = "the [[Commonwealth of Nations]]",
Wikipedia = "English in the Commonwealth of Nations",
regional_categories = true,
parent = true,
}
labels["Cuba"] = {
Wikipedia = true,
regional_categories = "Cuban",
parent = "Caribbean",
}
labels["East Africa"] = {
Wikipedia = true,
regional_categories = "East African",
parent = "Africa",
}
labels["East Asia"] = {
Wikipedia = true,
regional_categories = "East Asian",
parent = "Asia",
}
labels["Egypt"] = {
Wikipedia = true,
regional_categories = "Egyptian",
parent = "Africa,Middle East",
}
labels["Europe"] = {
aliases = {"European"},
Wikipedia = "English language in Europe",
regional_categories = "European",
parent = true,
}
labels["Fiji"] = {
Wikipedia = "Fijian English",
regional_categories = "Fijian",
parent = "Oceania,Commonwealth",
}
labels["Ghana"] = {
Wikipedia = "Ghanaian English",
regional_categories = "Ghanaian",
parent = "West Africa",
}
labels["Guyana"] = {
Wikipedia = {"Guyanese English", "Guyana"},
regional_categories = "Guyanese",
parent = "Caribbean,South America",
}
labels["Hong Kong"] = {
aliases = {"HK"},
Wikipedia = "Hong Kong English",
regional_categories = true,
parent = "China",
}
labels["Hungary"] = {
Wikipedia = true,
regional_categories = "Hungarian",
parent = "Europe",
}
labels["Indonesia"] = {
Wikipedia = "Indonesian English",
regional_categories = "Indonesian",
parent = "Southeast Asia",
}
labels["Israel"] = {
Wikipedia = "Israeli English",
regional_categories = "Israeli",
parent = "Middle East",
}
labels["Japan"] = {
Wikipedia = true,
regional_categories = "Japanese",
parent = "East Asia",
}
labels["Jamaica"] = {
aliases = {"Jamaican English", "Jamaican"},
Wikipedia = "Jamaican English",
regional_categories = "Jamaican",
parent = "Caribbean,Commonwealth",
}
labels["Kenya"] = {
Wikipedia = "Kenyan English",
regional_categories = "Kenyan",
parent = "East Africa",
}
labels["Liberia"] = {
Wikipedia = "Liberian English",
regional_categories = "Liberian",
parent = "West Africa",
}
labels["Libya"] = {
Wikipedia = true,
regional_categories = "Libyan",
parent = "Africa",
}
labels["Macau"] = {
Wikipedia = true,
regional_categories = "Macanese",
parent = "China",
}
labels["Mainland China"] = {
aliases = {"Mainland", "mainland", "mainland China"},
Wikipedia = true,
regional_categories = true,
parent = "China",
}
labels["Malaysia"] = {
aliases = {"Malaysian"},
Wikipedia = "Malaysian English",
regional_categories = "Malaysian",
parent = "Southeast Asia,Commonwealth",
}
labels["Malta"] = {
Wikipedia = "Maltese English",
regional_categories = "Maltese",
parent = "Europe",
}
labels["Manglish"] = {
def = "[[Manglish]], an English-based [[creole]] incorporating [[Malay]], [[Chinese]], and [[Tamil]] words; used informally in [[Malaysia]]",
Wikipedia = true,
plain_categories = true,
parent = "Malaysia",
}
labels["Mexico"] = {
Wikipedia = {"Mexican English", "Mexico"},
regional_categories = "Mexican",
parent = "rawposcat:North American English",
}
labels["Middle East"] = {
the = true,
Wikipedia = true,
regional_categories = "Middle Eastern",
parent = true,
}
labels["Myanmar"] = {
aliases = {"Burma"},
Wikipedia = "Myanmar English",
regional_categories = true,
parent = "Southeast Asia",
}
labels["Namibia"] = {
Wikipedia = "Namibian English",
regional_categories = "Namibian",
parent = "Africa",
}
labels["Natal"] = {
Wikipedia = "KwaZulu-Natal",
regional_categories = true,
parent = "South Africa",
}
labels["Nigeria"] = {
aliases = {"Nigerian"},
Wikipedia = "Nigerian English",
regional_categories = "Nigerian",
parent = "West Africa",
}
labels["Oceania"] = {
Wikipedia = "Oceanian English",
regional_categories = "Oceanian",
parent = true,
}
labels["Palestine"] = {
Wikipedia = true,
regional_categories = "Palestinian",
parent = "Middle East",
}
labels["Papua New Guinea"] = {
Wikipedia = "Papua New Guinean English",
regional_categories = "Papua New Guinean",
parent = "Oceania,Commonwealth",
}
labels["Philippines"] = {
the = true,
aliases = {"Philippine", "Philippine English"},
Wikipedia = "Philippine English",
regional_categories = "Philippine",
parent = "Southeast Asia",
}
labels["Baguio"] = {
Wikipedia = true,
regional_categories = true,
parent = "Philippines",
}
labels["Réunion"] = {
Wikipedia = true,
regional_categories = true,
parent = "Africa",
}
labels["Rhodesia"] = {
region = "the historical state of [[Rhodesia]]",
Wikipedia = "Zimbabwean English",
regional_categories = "Rhodesian",
parent = "Africa",
}
labels["Rwanda"] = {
Wikipedia = true,
regional_categories = "Rwandan",
parent = "Africa",
}
labels["Singapore"] = {
aliases = {"SG", "Singaporean"},
Wikipedia = "Singapore English",
regional_categories = true,
parent = "Southeast Asia,Commonwealth",
}
labels["Singlish"] = {
def = "[[Singlish]], an English-based [[creole]] incorporating many words of [[Chinese]], [[Malay]] and [[Indian]] origin; used informally in [[Singapore]]",
Wikipedia = true,
plain_categories = true,
parent = "Singapore",
}
labels["Solomon Islands"] = {
the = true,
Wikipedia = "Solomon Islands English",
regional_categories = true,
parent = "Oceania",
}
labels["South Africa"] = {
aliases = {"South African", "South African English", "ZA"},
Wikipedia = "South African English",
accent_Wikipedia = "South African English phonology",
accent_display = "General South African",
regional_categories = "South African",
parent = "Africa,Commonwealth",
}
labels["South America"] = {
aliases = {"South American"},
Wikipedia = "South American English",
regional_categories = "South American",
parent = true,
}
labels["South Korea"] = {
Wikipedia = "Korean English",
regional_categories = "South Korean",
parent = "East Asia",
}
labels["Southeast Asia"] = {
aliases = {"Southeast Asian", "South-East Asia", "South-East Asian", "South-east Asia", "South-east Asian", "SEA"},
Wikipedia = "Southeast Asian English",
regional_categories = "Southeast Asian",
parent = "Asia",
}
labels["Taiwan"] = {
aliases = {"Taiwanese"},
Wikipedia = true,
regional_categories = "Taiwanese",
parent = "East Asia",
}
labels["Tanzania"] = {
aliases = {"Tanzanian"},
Wikipedia = true,
regional_categories = "Tanzanian",
parent = "East Africa",
}
labels["Thailand"] = {
Wikipedia = "Tinglish",
regional_categories = "Thai",
parent = "Southeast Asia",
}
labels["Trinidad and Tobago"] = {
aliases = {"Trinidad", "Tobago", "Trinidadian"},
Wikipedia = "Trinidadian and Tobagonian English",
regional_categories = true,
parent = "Caribbean",
}
labels["Uganda"] = {
Wikipedia = "Ugandan English",
regional_categories = "Ugandan",
parent = "Africa",
}
labels["Vanuatu"] = {
Wikipedia = "Vanuatuan English",
regional_categories = true,
parent = "Oceania",
}
labels["Vietnam"] = {
Wikipedia = "Vietglish",
regional_categories = "Vietnamese",
parent = "Southeast Asia",
}
labels["West Africa"] = {
aliases = {"West African"},
Wikipedia = true,
regional_categories = "West African",
parent = "Africa",
}
labels["Zimbabwe"] = {
Wikipedia = "Zimbabwean English",
regional_categories = true,
parent = "Africa",
}
------------------------------------ non-regional ------------------------------------
labels["DoggoLingo"] = {
def = "[[DoggoLingo]]",
display = "[[DoggoLingo]]",
noreg = true,
plain_categories = true,
othercat = "English internet slang",
parent = "internet slang",
}
labels["Early Modern"] = {
prep = "from",
region = "the late 15th to the mid-17th centuries",
noreg = true,
nolink = true,
aliases = {"Early Modern English", "EME", "EMnE", "EModE"},
Wikipedia = "Early Modern English",
regional_categories = true,
parent = true,
}
labels["Late Modern"] = {
prep = "from",
region = "the mid-17th to the end of the 19th centuries",
noreg = true,
nolink = true,
aliases = {"Late Modern English", "LME"},
Wikipedia = "Late Modern English",
regional_categories = true,
parent = true,
}
-- for French terms used in French contexts
labels["Gallicism"] = {
noreg = true,
aliases = {"French", "Frenchism"},
plain_categories = true,
Wikipedia = "Glossary of French words and expressions in English",
othercat = "English terms by usage,English terms by orthographic property",
}
-- ideally this would sit at [[Module:category tree/pragmatic properties]] so it can be used for all languages, but those cats needs to begin with the language name...
labels["non-native speakers' English"] = {
display = "[[non-native speaker]]s' English",
noreg = true,
aliases = {"NNES", "NNSE"},
regional_categories = "Non-native speakers'",
Wikipedia = "English as a second or foreign language",
accent_Wikipedia = "Non-native pronunciations of English",
othercat = "English nonstandard terms,English terms by usage,English terms by orthographic property",
}
labels["Polari"] = {
def = "a form of cant slang used in [[Britain]] by some actors, circus and fairground showmen, professional wrestlers, merchant navy sailors, criminals, prostitutes, and the gay subculture",
noreg = true,
country = "the United Kingdom",
Wikipedia = true,
plain_categories = true,
othercat = "British slang,English cant,English gay slang",
parent = true,
}
-- Thieves' Cant is English-only, for other languages, use "criminal slang"
labels["thieves' cant"] = {
fulldef = "A secret language formerly used by thieves, beggars and hustlers of various kinds in [[Great Britain]] and to a lesser extent in other English-speaking countries",
noreg = true,
aliases = {"Thieves' Cant", "Thieves' cant", "thieves cant", "thieves'", "thieves"},
Wikipedia = true,
-- FIXME: Currently pos_categories aren't recognized.
-- pos_categories = "Thieves' Cant",
plain_categories = "English Thieves' Cant",
parent = true,
othercat = "English cant",
}
------------------------------------ English-specific qualifier labels ------------------------------------
labels["attributive"] = {
display = "[[Appendix:English nouns#Attributive|attributive]]",
}
labels["attributively"] = {
display = "[[Appendix:English nouns#Attributive|attributively]]",
}
------------------------------------ supporting [[Template:standard spelling of]] et al. ------------------------------------
labels["American spelling"] = {
aliases = {"American form", "US spelling", "US form",
-- As in "color" vs. "colour"
"or form", "-or form",
"or spelling", "-or spelling",
-- As in "meter" vs. "metre"
"er form", "-er form",
"er spelling", "-er spelling"
},
Wikipedia = "American and British English spelling differences",
form_of_display = "American",
plain_categories = "American English forms",
}
labels["Australian spelling"] = {
aliases = {"Australian form"},
Wikipedia = "Australian English#Spelling and style",
form_of_display = "Australian",
plain_categories = "Australian English forms",
}
labels["British spelling"] = {
aliases = {"British form", "UK spelling", "UK form"},
Wikipedia = "American and British English spelling differences",
form_of_display = "British",
plain_categories = "British English forms",
}
labels["Commonwealth spelling"] = {
aliases = {"Commonwealth form",
-- As in "color" vs. "colour"
"our form", "-our form", "our spelling", "-our spelling",
-- As in "meter" vs. "metre"
"re form", "-re form", "re spelling", "-re spelling"
},
Wikipedia = "American and British English spelling differences",
form_of_display = "Commonwealth",
plain_categories = {"British English forms", "Canadian English forms", "Australian English forms"},
}
labels["Canadian spelling"] = {
aliases = {"Canadian form"},
Wikipedia = true,
form_of_display = "Canadian",
plain_categories = "Canadian English forms",
}
labels["Oxford British spelling"] = {
aliases = {"Oxford", "Oxford form", "Oxford spelling", "en-GB-oxendict",},
display = "[[w:Oxford spelling|Oxford]] [[British English]]",
plain_categories = "Oxford spellings",
}
labels["non-Oxford British spelling"] = {
aliases = {"Non-Oxford British spelling", "non-Oxford British form", "Non-Oxford British form", "non-Oxford form", "Non-Oxford form", "non-Oxford", "Non-Oxford", "not Oxford", "Not Oxford"},
display = "non-[[w:Oxford spelling|Oxford]] [[British English]]",
plain_categories = "British English forms",
}
labels["ise spelling"] = {
aliases = {
"ise", "-ise", "ise form", "-ise form", "-ise spelling", "isation", "-isation", "isation form", "-isation form", "isation spelling", "-isation spelling",
"ise-form" -- backwards compatability
},
display = "non-[[w:Oxford spelling|Oxford]] [[w:American and British English spelling differences|British spelling]]",
form_of_display = "non-[[w:Oxford spelling|Oxford]] [[w:American and British English spelling differences|British]]",
plain_categories = "British English forms",
}
labels["ize spelling"] = {
aliases = {
"ize", "-ize", "ize form", "-ize form", "-ize spelling", "ization", "-ization", "ization form", "-ization form", "ization spelling", "-ization spelling",
"ize-form" -- backwards compatability
},
display = "[[w:American and British English spelling differences|American]] and [[w:Oxford spelling|Oxford]] [[British English|British spelling]]",
form_of_display = "[[w:American and British English spelling differences|American]] and [[w:Oxford spelling|Oxford]] [[British English|British]]",
plain_categories = {"American English forms", "Oxford spellings"},
}
------------------------------------ supporting [[Template:inflection of]] ------------------------------------
-- This is added to an inflection line when something like {{infl of|en|make||th-form}} is used. Specifically, the form-of
-- tag 'th-form' is a shortcut for '3-th|s|spres|ind' (see [[Module:form of/lang-data/en]]); the tag '3-th' displays as
-- "third-person" (see [[Module:form of/lang-data/en]]) and attaches the following label (see [[Module:form of/cats]]).
labels["archaic third singular"] = {
display = "archaic",
Wikipedia = "English verbs#Archaic forms",
pos_categories = "archaic third-person singular forms",
}
-- This is added to an inflection line when something like {{infl of|en|make||st-form}} is used. See above.
labels["archaic second singular present"] = {
display = "archaic",
Wikipedia = "English verbs#Archaic forms",
pos_categories = "second-person singular forms",
}
-- This is added to an inflection line when something like {{infl of|en|make||st-past-form}} is used. See above.
labels["archaic second singular past"] = {
display = "archaic",
Wikipedia = "English verbs#Archaic forms",
pos_categories = "second-person singular past tense forms",
}
------------------------------------ accent qualifiers ------------------------------------
-- Generate the inverse of a sound change. In general, we should do this for sound changes that are either
-- extremely common (e.g. 'cot-caught') or dominant ('horse-hoarse', 'wine-whine') or are at least locally
-- dominant (e.g. 'cheer-chair'). The idea is that when presenting the pronunciation of an area with a locally
-- dominant pronunciation, we may want to also present the alternative pronunciation lacking the change, as long
-- as it is found at least somewhere in the area. Hence, for New Zealand, which typically has the cheer-chair
-- merger, we might might to present the non-merger pronunciation as well; but for a change like card-cord that
-- is recessive everywhere, it's unlikely we'll need to specifically highlight the inverse pronunciation (which
-- would be the standard, already covered elsewhere), and we can save memory and time by omitting the label.
local function generate_non(key, display)
if not labels[key] then
error(("Internal error: No label definition for key '%s'"):format(key))
end
local labval = mw.clone(labels[key])
labels["non-" .. key] = labval
if labval.aliases then
for i, alias in ipairs(labval.aliases) do
labval.aliases[i] = "non-" .. alias
end
end
if not display then
display = labval.display or key
if display:find("ing$") or display:find("[st]ion$") then
-- e.g. "Canadian raising", "t-glottalization"
display = "without " .. display
else
-- e.g. "cot-caught merger"
display = "without the " .. display
end
end
labval.display = display
end
labels["Anglicised"] = {
aliases = {"Anglicized"},
Wikipedia = "Anglicisation#Anglicisation of non-English-language vocabulary and names",
}
labels["bad-lad split"] = {
Wikipedia = true,
display = "''bad''–''lad'' split",
}
labels["Canadian raising"] = {
aliases = {"North American raising"},
Wikipedia = true,
}
generate_non("Canadian raising")
labels["Canadian Shift"] = {
aliases = {"Canadian Vowel Shift", "Canadian shift", "Canadian vowel shift"},
Wikipedia = true,
display = "Canadian Vowel Shift",
}
generate_non("Canadian Shift")
labels["card-cord"] = {
Wikipedia = "Card-cord merger",
display = "''card''–''cord'' merger",
}
labels["cheer-chair"] = {
aliases = {"near-square"},
Wikipedia = "near-square merger",
display = "''cheer''–''chair'' merger",
}
generate_non("cheer-chair")
labels["cot-caught"] = {
aliases = {"caught-cot"},
Wikipedia = "Cot–caught merger",
display = "''cot''–''caught'' merger",
}
generate_non("cot-caught")
labels["cure-fir"] = {
aliases = {"cure-nurse"},
Wikipedia = "Cure-nurse merger",
display = "''cure''–''fir'' merger",
}
generate_non("cure-fir")
labels["doll-dole"] = {
Wikipedia = "Doll-dole merger",
display = "''doll''–''dole'' merger",
}
labels["dough-door"] = {
Wikipedia = "Dough-door merger",
display = "''dough''–''door'' merger",
}
generate_non("dough-door")
labels["Estuary English"] = {
Wikipedia = true,
}
labels["fair-fur"] = {
aliases = {"square-nurse"},
Wikipedia = "Square-nurse merger",
display = "''fair''–''fur'' merger",
}
generate_non("fair-fur")
labels["father-bother"] = {
Wikipedia = "Father–bother merger",
display = "''father''-''bother'' merger",
}
generate_non("father-bother")
labels["fern-fir-fur"] = {
aliases = {"nurse merger"},
Wikipedia = "Fern-fir-fur merger",
display = "''fern''–''fir''–''fur'' merger",
}
generate_non("fern-fir-fur")
labels["fool-fall"] = {
Wikipedia = "English-language vowel changes before historic /l/#Fool–fall_merger",
display = "''fool''–''fall'' merger",
}
labels["foot-goose"] = {
Wikipedia = "Foot-goose merger",
display = "''foot''-''goose'' merger",
}
-- Most labels of the form 'foo-bar' are mergers. Since this is rather a split, include the word "split"
-- for clarity.
labels["foot-strut split"] = {
Wikipedia = "Phonological history of English close back vowels#FOOT–STRUT split",
display = "''foot''-''strut'' split",
}
generate_non("foot-strut split")
labels["full-fool"] = {
Wikipedia = "English-language vowel changes before historic /l/#Full–fool_merger",
display = "''full''–''fool'' merger",
}
labels["g-dropping"] = {
aliases = {"g dropping"},
Wikipedia = "G-dropping",
display = "''g''-dropping",
}
generate_non("g-dropping")
labels["General American"] = {
aliases = {"GenAm", "GA"},
Wikipedia = "General American English",
}
labels["glottalized"] = {
aliases = {"glottalization", "glottalised", "glottalisation"},
Wikipedia = "Phonological history of English consonant clusters#Glottalization",
}
labels["goose split"] = {
-- Phonemic split in some Southeastern England English variants.
Wikipedia = "English-language vowel changes before historic /l/#Goose_split",
display = "''goose'' split",
}
labels["gulf-golf"] = {
Wikipedia = "English-language vowel changes before historic /l/#Gulf-golf merger",
display = "''gulf''-''golf'' merger",
}
labels["h-dropping"] = {
Wikipedia = "H-dropping",
display = "''h''-dropping",
}
generate_non("h-dropping")
labels["happy-tensing"] = {
aliases = {"happy tensing"},
Wikipedia = "Happy tensing",
display = "''happy''-tensing",
}
generate_non("happy-tensing")
labels["horse-hoarse"] = {
Wikipedia = "horse–hoarse merger",
display = "''horse''–''hoarse'' merger",
}
generate_non("horse-hoarse")
labels["hurry-furry"] = {
Wikipedia = "hurry-furry merger",
display = "''hurry''–''furry'' merger",
}
generate_non("hurry-furry")
labels["Inland Northern US"] = {
aliases = {"Great Lakes", "Inland Northern", "Inland North", "Inland Northern American", "Inland Northern American English", "Inland Northern English", "Northern Cities Vowel Shift", "US Inland North", "northern cities vowel shift"},
Wikipedia = "Inland Northern American English",
display = "Inland Northern American",
}
labels["intrusive r"] = {
Wikipedia = "Intrusive r",
display = "intrusive R",
}
generate_non("intrusive r", "without intrusive R")
labels["laxing"] = {
Wikipedia = "Trisyllabic laxing"
}
generate_non("laxing")
labels["linking w"] = {
Wiktionary = "Appendix:English_pronunciation#Linking_semivowels",
display="linking W"
}
labels["linking y"] = {
Wiktionary = "Appendix:English_pronunciation#Linking_semivowels",
display="linking Y"
}
labels["l-vocalization"] = {
aliases = {"l-vocalisation"},
Wikipedia = "L-vocalization#Modern English",
display = "''l''-vocalization",
}
generate_non("l-vocalization")
labels["Latinate"] = {
Wikipedia = "Latin#Phonology",
}
labels["lot-cloth split"] = {
Wikipedia = true,
display = "''lot''–''cloth'' split",
}
generate_non("lot-cloth split")
labels["low-back-merger shift"] = {
aliases = {"LBMS", "low back merger shift"},
Wikipedia = "Low-back-merger shift",
display = "''low-back-merger shift",
}
labels["Mary-marry-merry"] = {
aliases = {"Mmmm"},
Wikipedia = "Mary–marry–merry merger",
display = "''Mary''–''marry''–''merry'' merger",
}
generate_non("Mary-marry-merry")
table.insert(labels["non-Mary-marry-merry"].aliases, "nMmmm")
labels["merry-Murray"] = {
aliases = {"Merry-Murray"},
Wikipedia = "Merry–Murray merger",
display = "''merry''–''Murray'' merger",
}
labels["mirror-nearer"] = {
aliases = {"Sirius-serious"},
Wikipedia = "Mirror-nearer merger",
display = "''mirror''–''nearer'' merger",
}
generate_non("mirror-nearer")
labels["nt-flapping"] = {
Wikipedia = "Flapping#Distribution",
display = "''nt''-flapping",
}
generate_non("nt-flapping")
labels["pane-pain"] = {
Wikipedia = "Pane–pain merger",
display = "''pane''–''pain'' merger"
}
generate_non("pane-pain")
labels["paw-poor"] = {
Wikipedia = "Rhoticity in English#/ɔː/–/ʊər/ merger",
display = "''paw''–''poor'' merger",
}
labels["pin-pen"] = {
aliases = {"pen-pin"},
Wikipedia = "pin–pen merger",
display = "''pin''–''pen'' merger",
}
labels["pour-poor"] = {
aliases = {"poor-pour", "cure-force"},
Wikipedia = "Cure–force merger",
display = "''pour''–''poor'' merger",
}
generate_non("pour-poor")
labels["r-dissimilation"] = {
Wikipedia = "Dissimilation",
display = "''r''-dissimilation",
}
labels["rhotic"] = {
Wikipedia = "Rhoticity in English",
}
labels["non-rhotic"] = {
aliases = {"nonrhotic"},
Wikipedia = "Rhoticity in English",
}
labels["Received Pronunciation"] = {
aliases = {"RP"},
Wikipedia = true,
}
labels["salary-celery"] = {
Wikipedia = "Salary–celery merger",
display = "''salary''–''celery'' merger",
}
labels["show-sure"] = {
Wikipedia = "Show-sure merger",
display = "''show''–''sure'' merger",
}
labels["Standard Southern British English"] = {
aliases = {"SSB", "SSBE", "Standard Southern British"},
Wikipedia = "Standard Southern British",
display = "Standard Southern British",
}
labels["stressed"] = {
Wikipedia = "Stress and vowel reduction in English#Weak and strong forms of function words",
display = "stressed form",
}
labels["tar-tire"] = {
Wikipedia = "/aɪər/–/ɑr/ merger",
display = "tar-tire merger",
}
labels["tar-tire-tower"] = {
Wikipedia = "English-language vowel changes before historic /r/#/aɪə/–/aʊə/–/ɑː/ merger",
display = "tar-tire-tower merger",
}
labels["t-flapping"] = {
Wikipedia = "t-flapping",
}
generate_non("t-flapping")
labels["t-glottalization"] = {
aliases = {"t-glottaling", "t-glottalisation"},
Wikipedia = "T-glottalization",
display = "''t''-glottalization",
}
generate_non("t-glottalization")
labels["th-fronting"] = {
Wikipedia = true,
display = "''th''-fronting",
}
labels["th-stopping"] = {
Wikipedia = true,
display = "''th''-stopping",
}
labels['toe-tow'] = {
Wikipedia = "Phonological history of English diphthongs#Toe–tow merger",
display = "''toe''–''tow'' merger"
}
generate_non("toe-tow")
labels["trap-bath split"] = {
Wikipedia = "trap–bath split",
display = "''trap''–''bath'' split",
}
generate_non("trap-bath split")
labels["triphthong smoothing"] = {
Wikipedia = "Triphthong smoothing",
display = "triphthong smoothing",
}
generate_non("triphthong smoothing")
labels["unstressed"] = {
Wikipedia = "Stress and vowel reduction in English#Weak and strong forms of function words",
display = "unstressed form",
}
labels["weak vowel"] = {
aliases = {"weak vowel merger"},
Wikipedia = "Weak vowel merger",
display = "weak vowel merger",
}
generate_non("weak vowel", "weak vowel distinction")
labels["wine-whine"] = {
Wikipedia = "wine–whine merger",
display = "''wine''–''whine'' merger",
}
generate_non("wine-whine")
labels["yod-coalescence"] = {
aliases = {"yod coalescence"},
Wikipedia = "yod-coalescence",
}
generate_non("yod-coalescence")
labels["yod-dropping"] = {
aliases = {"yod dropping"},
Wikipedia = "yod-dropping",
}
generate_non("yod-dropping")
labels["NG-coalescence"] = {
aliases = {"NG coalescence","ng-coalescence","ng coalescence"},
Wikipedia = "Ng coalescence",
}
generate_non("NG-coalescence")
labels["æ-raising"] = {
aliases = {"æ-tensing", "/æ/ raising", "/æ/ tensing", "ae-raising", "ae-tensing"},
Wikipedia = "/æ/ raising",
}
generate_non("æ-raising")
return require("Module:labels").finalize_data(labels)
ekfqk5f8cijpy7lmork6n258y0h4ch5
मॉड्यूल:etymology/specialized
828
305063
487879
480034
2026-09-03T10:11:32Z
SM7
6218
updating...
487879
Scribunto
text/plain
local export = {}
local m_str_utils = require("Module:string utilities")
local en_utilities_module = "Module:en-utilities"
local etymology_module = "Module:etymology"
local gsub = m_str_utils.gsub
local insert = table.insert
local pluralize = require(en_utilities_module).pluralize
local upper = m_str_utils.upper
-- This function handles all the messiness of different types of specialized borrowings. It should insert any
-- borrowing-type-specific categories into `categories` unless `nocat` is given, and return the text to display
-- before the source + term (or "" for no text).
local function get_specialized_borrowing_text_insert_cats(data)
local bortype, categories, lang, terms, source, nocap, nocat, senseid =
data.bortype, data.categories, data.lang, data.terms, data.source, data.nocap, data.nocat, data.senseid
local function inscat(cat)
if not nocat then
local display, sourcedisp = require(etymology_module).get_display_and_cat_name(source, "raw")
if cat:find("DISPLAY") then
cat = cat:gsub("DISPLAY", display)
elseif cat:find("SOURCE") then
cat = cat:gsub("SOURCE", sourcedisp)
else
cat = cat .. " " .. sourcedisp
end
insert(categories, lang:getFullName() .. " " .. cat)
end
end
-- `text` is the display text for the borrowing type, which gets converted
-- into a link.
-- `appendix` is a the glossary anchor, which defaults to `text`
-- `prep` is the preposition between the borrowing type and the language
-- name (e.g. "of", "from")
-- `pos` is the part of speech for the borrowing type ("noun" or
-- "adjective"; defaults to "noun")
-- `plural` is the plural form of the borrowing type; if not specified,
-- the pluralize function is used
local text, appendix, prep, pos, plural
if bortype == "calque" then
text, prep = "calque", "of"
inscat("terms calqued from")
elseif bortype == "partial-calque" then
text, prep = "partial calque", "of"
inscat("terms partially calqued from")
elseif bortype == "semantic-loan" then
text, prep = "semantic loan", "from"
inscat("semantic loans from")
elseif bortype == "transliteration" then
text, prep = "transliteration", "of"
inscat("terms borrowed from")
inscat("transliterations of DISPLAY terms")
elseif bortype == "phono-semantic-matching" then
text, prep = "phono-semantic matching", "of"
inscat("phono-semantic matchings from")
else
local langcode = lang:getCode()
local lang_is_source = langcode == source:getCode()
if lang_is_source then
-- Track, because this shouldn't be happening. A language can only have itself as a source further up the chain after a borrowing, which is always "derived".
require("Module:debug/track"){
"etymology/specialized/self-as-source",
"etymology/specialized/self-as-source/" .. langcode
}
inscat("terms borrowed back into")
else
inscat("terms borrowed from")
if bortype ~= "borrowing" then
inscat(bortype .. " borrowings from")
end
end
if bortype == "borrowing" then
text, appendix, prep, pos = "borrowed", "loanword", "from", "adjective"
elseif (
bortype == "learned" or
bortype == "semi-learned" or
bortype == "orthographic" or
bortype == "unadapted"
) then
text, prep = bortype .. " borrowing", "from"
elseif bortype == "adapted" then
text, prep = bortype .. " borrowing", "of"
else
error("Internal error: Unrecognized bortype: " .. bortype)
end
end
-- If the term is suppressed, the preposition should always be "from":
-- "Calque of Chinese 中國".
-- "Calque from Chinese" (not "Calque of Chinese").
if terms[1].term == "-" then
prep = "from"
end
appendix = "Appendix:Glossary#" .. (appendix or text)
if senseid then
local senseids, output = mw.text.split(senseid, '!!'), {}
for i, id in ipairs(senseids) do
-- FIXME: This should be done via a function.
insert(output, mw.getCurrentFrame():preprocess('{{senseno|' .. lang:getCode() .. '|' .. id .. (i == 1 and not nocap and "|uc=1" or "") .. '}}'))
end
local link
if senseid:find('!!') then
link, text = "are", pos == "adjective" and text or plural or pluralize(text)
else
link = pos == "adjective" and "is" or "is a"
end
text = mw.text.listToText(output) .. " " .. link .. " " .. '[[' .. appendix .. '|' .. text .. ']]'
else
text = "[[" .. appendix .. "|" .. (nocap and text or gsub(text, "^.", upper)) .. "]]"
end
return text .. " " .. prep .. " "
end
function export.specialized_borrowing(data)
local lang, sources, terms = data.lang, data.sources, data.terms
local categories = {}
local text
for _, source in ipairs(sources) do
text = get_specialized_borrowing_text_insert_cats {
bortype = data.bortype,
categories = categories,
lang = lang,
terms = terms,
source = source,
nocap = data.nocap,
nocat = data.nocat,
senseid = data.senseid,
}
end
text = data.notext and "" or text
local sourcetext = require(etymology_module).format_sources {
lang = lang,
sources = sources,
terms = terms,
sort_key = data.sort_key,
categories = categories,
nocat = data.nocat,
sourceconj = data.sourceconj,
}
return text .. require(etymology_module).format_links(terms, data.conj, "etymology/specialized", sourcetext)
end
return export
bvgt9bjaugs1kua7m5g9pj20a0vngnq
मॉड्यूल:zh/data/ts
828
306746
487887
487137
2026-09-03T10:35:27Z
SM7
6218
updating...
487887
Scribunto
text/plain
return {
["「"]="“",
["」"]="”",
["『"]="‘",
["』"]="’",
["㑮"]="𫝈",
["㑯"]="㑔",
["㑳"]="㑇",
["㑶"]="㐹",
["㑺"]="俊",
["㒓"]="𠉂",
["㒖"]="",
["㒜"]="𠇐",
["㒥"]="仹",
["㒧"]="𠌯",
["㒯"]="𱏩",
["㒿"]="𰖩",
["㓄"]="𪠟",
["㓖"]="𰃻",
["㓨"]="刾",
["㔃"]="𫦌",
["㔅"]="𫦅",
["㔋"]="𪟎",
["㔝"]="𫦩",
["㔢"]="𫦳",
["㔤"]="𱐳",
["㔶"]="𱑉",
["㕒"]="𰆕",
["㕢"]="𰇀",
["㖦"]="𰇎",
["㖮"]="𪠵",
["㗙"]="𫩩",
["㗢"]="𰇖",
["㗣"]="𫪺",
["㗰"]="𫩛",
["㗲"]="𠵾",
["㗶"]="𭇜",
["㗻"]="𫪀",
["㗼"]="𫩤",
["㗿"]="𪡛",
["㘉"]="𠰱",
["㘓"]="𪢌",
["㘔"]="𫬐",
["㘖"]="𰉁",
["㘙"]="𫪂",
["㘚"]="㘎",
["㙔"]="𰉘",
["㙡"]="𭎂",
["㙢"]="𰊟",
["㙬"]="𫮜",
["㙺"]="𰊛",
["㙾"]="𰉽",
["㛍"]="",
["㛝"]="𫝦",
["㜄"]="㚯",
["㜏"]="㛣",
["㜐"]="𫝧",
["㜕"]="",
["㜗"]="𡞋",
["㜞"]="𰌆",
["㜢"]="𡞱",
["㜥"]="𫰨",
["㜭"]="𫰠",
["㜮"]="𫱕",
["㜰"]="",
["㜷"]="𡝠",
["㜺"]="𫲗",
["㝞"]="𫳃",
["㞞"]="𪨊",
["㟦"]="",
["㟺"]="𪩇",
["㠁"]="𫶅",
["㠆"]="",
["㠏"]="㟆",
["㠘"]="𱛇",
["㠠"]="𰎐",
["㠣"]="𫵷",
["㡓"]="𫷅",
["㡞"]="𰏜",
["㢗"]="𪪑",
["㢝"]="𢋈",
["㤲"]="𫺁",
["㥮"]="㤘",
["㥷"]="𰑸",
["㦊"]="𫺆",
["㦎"]="𢛯",
["㦖"]="𫺓",
["㦛"]="𢗓",
["㦞"]="𪫷",
["㦡"]="",
["㦦"]="𫻁",
["㦬"]="𰑫",
["㦭"]="𭝋",
["㨛"]="𰓔",
["㨟"]="𫼥",
["㨥"]="𫽀",
["㨻"]="𪮃",
["㩇"]="𫽇",
["㩋"]="𪮋",
["㩌"]="𫽧",
["㩜"]="㨫",
["㩣"]="𫾉",
["㩦"]="携",
["㩭"]="𫽊",
["㩳"]="㧐",
["㩵"]="擜",
["㩷"]="𰔲",
["㪎"]="𪯋",
["㪹"]="𬖠",
["㪻"]="𫿳",
["㬙"]="𱡼",
["㬢"]="",
["㬣"]="𬀮",
["㬮"]="𰖠",
["㮣"]="概",
["㮧"]="𱣂",
["㮲"]="𰗙",
["㮿"]="",
["㯂"]="𰘀",
["㯆"]="𰗡",
["㯗"]="𱣡",
["㯤"]="𣘐",
["㯸"]="𰗦",
["㯺"]="𰗘",
["㰂"]="𰗵",
["㰄"]="",
["㰍"]="𬺜",
["㰙"]="𣗙",
["㰚"]="樆",
["㰰"]="𬅢",
["㰳"]="𭭈",
["㲯"]="𰚪",
["㲰"]="𰚔",
["㴸"]="𰛛",
["㴿"]="𰛽",
["㵍"]="𬇰",
["㵑"]="𰜢",
["㵒"]="𬈕",
["㵗"]="𣳆",
["㵤"]="𬉇",
["㵾"]="𪷍",
["㶆"]="𫞛",
["㶍"]="𰝟",
["㶏"]="𰝋",
["㶒"]="𰛩",
["㶕"]="𰝗",
["㷃"]="𰝾",
["㷍"]="𤆢",
["㷲"]="𰞉",
["㷶"]="𰞲",
["㷻"]="𭴊",
["㷿"]="𤈷",
["㸄"]="𱫅",
["㸅"]="𰞍",
["㸇"]="𤎺",
["㸊"]="𬋍",
["㸐"]="𬊾",
["㹂"]="𬌛",
["㹓"]="𰠴",
["㹙"]="𪺴",
["㹚"]="𱭰",
["㹽"]="𫞣",
["㺏"]="𤠋",
["㺑"]="𬌷",
["㺜"]="𪺻",
["㻶"]="𪼋",
["㼀"]="",
["㼁"]="",
["㼆"]="𬎆",
["㼈"]="𭹜",
["㼻"]="𬎧",
["㾵"]="𬏟",
["㾺"]="𬏜",
["㿉"]="𰣶",
["㿎"]="𬏷",
["㿖"]="𪽮",
["㿗"]="𤻊",
["㿧"]="𤽯",
["㿹"]="𰤨",
["䀉"]="𥁢",
["䀍"]="𰥊",
["䀴"]="𬑏",
["䀹"]="𥅴",
["䁑"]="𱲥",
["䁝"]="𰥞",
["䁪"]="𥇢",
["䁱"]="𬑒",
["䁺"]="𱲮",
["䁻"]="䀥",
["䂎"]="𥎝",
["䂓"]="𰦔",
["䂻"]="𱳱",
["䂾"]="𱴄",
["䃁"]="𰦴",
["䃕"]="𰦷",
["䃖"]="𱳳",
["䃘"]="𬒎",
["䃢"]="𰧎",
["䃣"]="𰦨",
["䃤"]="𬒕",
["䃮"]="鿎",
["䃴"]="𰧘",
["䅐"]="𫀨",
["䅘"]="𥟂",
["䅳"]="𫀬",
["䆅"]="𰨳",
["䆉"]="𫁂",
["䇓"]="𰩧",
["䈟"]="𱷸",
["䉅"]="𱷷",
["䉆"]="",
["䉍"]="𬕊",
["䉐"]="𬕛",
["䉑"]="𫁲",
["䉔"]="𱸐",
["䉙"]="𥬀",
["䉩"]="𱸂",
["䉬"]="𫂈",
["䉱"]="𬕦",
["䉲"]="𥮜",
["䉶"]="𫁷",
["䊛"]="𰪻",
["䊜"]="𰪫",
["䊟"]="𰫋",
["䊪"]="𥸯",
["䊭"]="𥺅",
["䊯"]="𰪩",
["䊲"]="𬡻",
["䊵"]="𮉠",
["䊷"]="䌶",
["䊹"]="纤",
["䊺"]="𫄚",
["䋃"]="𫄜",
["䋄"]="纲",
["䋆"]="𰬁",
["䋋"]="𱺘",
["䋍"]="𰬂",
["䋎"]="𬘜",
["䋏"]="𮉣",
["䋐"]="𬘙",
["䋑"]="𰬃",
["䋓"]="绉",
["䋔"]="𫄞",
["䋘"]="𱺛",
["䋙"]="䌺",
["䋚"]="䌻",
["䋝"]="𰬕",
["䋞"]="𮉦",
["䋦"]="𫄩",
["䋫"]="𰬑",
["䋱"]="𱺜",
["䋲"]="绳",
["䋹"]="䌿",
["䋺"]="𬘴",
["䋻"]="䌾",
["䋼"]="𫄮",
["䋽"]="𰬭",
["䋾"]="𬘲",
["䋿"]="𦈓",
["䌁"]="𬘱",
["䌇"]="𰬱",
["䌈"]="𦈖",
["䌋"]="𦈘",
["䌌"]="𰬶",
["䌏"]="𱺫",
["䌐"]="𬘮",
["䌖"]="𦈜",
["䌝"]="𦈟",
["䌞"]="𬘪",
["䌟"]="𦈞",
["䌥"]="𦈠",
["䌨"]="𱺯",
["䌪"]="𬙁",
["䌬"]="𱺕",
["䌰"]="𦈙",
["䍤"]="𫅅",
["䍦"]="䍠",
["䍷"]="𬙭",
["䍽"]="𦍠",
["䎘"]="𬚄",
["䎙"]="𫅭",
["䎱"]="䎬",
["䏊"]="𰭹",
["䐢"]="𰮙",
["䐣"]="𬁽",
["䐷"]="𬂅",
["䐹"]="𰮲",
["䐽"]="𰯎",
["䑗"]="𬛹",
["䑺"]="𱼸",
["䑼"]="𰰌",
["䓣"]="𬜯",
["䔇"]="𰰴",
["䔈"]="𰱀",
["䔡"]="𬝁",
["䕏"]="",
["䕠"]="𱽱",
["䕡"]="𰱩",
["䕤"]="𫟕",
["䕳"]="𦰴",
["䕵"]="𱾎",
["䕼"]="𬝴",
["䖀"]="𰲖",
["䖅"]="𫟑",
["䖚"]="𰲟",
["䗃"]="𰲳",
["䗅"]="𫊪",
["䗥"]="𰲯",
["䗯"]="𱿩",
["䗻"]="𮔂",
["䗽"]="𰳚",
["䗿"]="𧉞",
["䘇"]="蚉",
["䘉"]="蚕",
["䙔"]="𫋲",
["䙝"]="亵",
["䙡"]="䙌",
["䙰"]="褵",
["䙱"]="𧜭",
["䙼"]="𰴖",
["䚀"]="舰",
["䚆"]="𬢑",
["䚉"]="𬢐",
["䚕"]="𰴗",
["䚞"]="𰴤",
["䚩"]="𫌯",
["䚳"]="𬣛",
["䚵"]="𬣟",
["䚽"]="𬣜",
["䛀"]="𰵐",
["䛄"]="𫍠",
["䛅"]="𲂆",
["䛊"]="识",
["䛌"]="𰵜",
["䛍"]="𬣧",
["䛔"]="𲂈",
["䛘"]="𬣯",
["䛛"]="𬣬",
["䛞"]="𬣸",
["䛟"]="𰵢",
["䛠"]="𰵫",
["䛤"]="𬣹",
["䛩"]="𲂉",
["䛬"]="𬤁",
["䛭"]="𰵰",
["䛳"]="𫍫",
["䛴"]="",
["䛽"]="𬤌",
["䛿"]="𬤑",
["䜀"]="䜧",
["䜄"]="𰶈",
["䜉"]="𬤘",
["䜊"]="𲂓",
["䜋"]="𬤉",
["䜍"]="𬤟",
["䜎"]="𬣿",
["䜏"]="𰶇",
["䜒"]="𬤡",
["䜖"]="𫟢",
["䜚"]="𬤪",
["䜝"]="𬤬",
["䝏"]="𰶬",
["䝕"]="𬥄",
["䝡"]="𬥊",
["䝨"]="贤",
["䝭"]="𫎧",
["䝯"]="𬥵",
["䝲"]="赆",
["䝻"]="𧹕",
["䝼"]="䞍",
["䞀"]="𬥽",
["䞁"]="𬥺",
["䞂"]="𬥻",
["䞈"]="𧹑",
["䞉"]="𰷩",
["䞋"]="𫎪",
["䞓"]="𫎭",
["䟃"]="𫎺",
["䟄"]="𲃏",
["䟆"]="𫎳",
["䟇"]="𧺋",
["䟏"]="𰷴",
["䟐"]="𫎱",
["䟺"]="𬦥",
["䠆"]="𫏃",
["䠟"]="𰸈",
["䠠"]="𰸛",
["䠩"]="𰸊",
["䠮"]="𬧃",
["䠱"]="𨅛",
["䡁"]="𬧢",
["䡄"]="",
["䡅"]="𰹳",
["䡇"]="𰹷",
["䡊"]="𰹺",
["䡐"]="𫟤",
["䡓"]="𲀝",
["䡗"]="𬨆",
["䡘"]="𬨉",
["䡝"]="𰺑",
["䡟"]="𬨌",
["䡦"]="𬨑",
["䡩"]="𫟥",
["䡰"]="𰺘",
["䡴"]="𰺝",
["䡵"]="𫟦",
["䡶"]="𬨔",
["䡷"]="𰺡",
["䡹"]="𬨕",
["䡻"]="𰺤",
["䡾"]="𰺠",
["䢈"]="𰺭",
["䢙"]="𲅑",
["䢨"]="𨑹",
["䤌"]="𮠞",
["䤍"]="𰼑",
["䤝"]="𲇳",
["䤠"]="𰽠",
["䤤"]="𫟺",
["䤥"]="𰽺",
["䤨"]="𰽸",
["䤩"]="𬭈",
["䤪"]="𬭆",
["䤬"]="𰾈",
["䤭"]="",
["䤵"]="𰾐",
["䤸"]="𰾦",
["䤻"]="𰾖",
["䤼"]="𬭣",
["䥄"]="𫠀",
["䥇"]="䦂",
["䥊"]="𲈄",
["䥑"]="鿏",
["䥓"]="",
["䥔"]="𲈙",
["䥕"]="𬭯",
["䥖"]="𰾻",
["䥗"]="𫔋",
["䥛"]="𬭴",
["䥝"]="𰿁",
["䥞"]="𬭻",
["䥥"]="镰",
["䥩"]="𨱖",
["䥯"]="𫔆",
["䥱"]="䥾",
["䥴"]="𰿅",
["䥶"]="𰽝",
["䥷"]="𰿇",
["䥸"]="𨧮",
["䦌"]="𮤬",
["䦎"]="𰿨",
["䦖"]="",
["䦘"]="𨸄",
["䦛"]="䦶",
["䦜"]="𲈽",
["䦝"]="𬮨",
["䦟"]="䦷",
["䦣"]="",
["䦧"]="阋",
["䦪"]="𰿴",
["䦯"]="𫔵",
["䦱"]="𰿫",
["䦳"]="𨷿",
["䧞"]="𬮺",
["䧢"]="𨸟",
["䨴"]="𱁒",
["䩤"]="",
["䩫"]="𬰥",
["䪊"]="𫖅",
["䪍"]="𱁽",
["䪏"]="𩏼",
["䪐"]="𱂅",
["䪓"]="𬰳",
["䪗"]="𩐀",
["䪘"]="𩏿",
["䪜"]="𬰷",
["䪝"]="𱂌",
["䪥"]="𱂎",
["䪴"]="𫖫",
["䪼"]="𱂢",
["䪾"]="𫖬",
["䫀"]="𫖱",
["䫂"]="𫖰",
["䫈"]="𬱣",
["䫉"]="𬥈",
["䫌"]="𱂮",
["䫏"]="𬱦",
["䫐"]="𬃲",
["䫖"]="𲊾",
["䫜"]="𬱮",
["䫟"]="𫖲",
["䫠"]="𬱰",
["䫥"]="𱆚",
["䫩"]="𬱬",
["䫫"]="𲋀",
["䫲"]="𲋃",
["䫴"]="𩖗",
["䫶"]="𫖺",
["䫺"]="𲋎",
["䫻"]="𫗇",
["䫼"]="𬱷",
["䫽"]="𲋏",
["䫾"]="𫠈",
["䬀"]="𱃖",
["䬂"]="𬱸",
["䬅"]="𱃚",
["䬍"]="𬲀",
["䬎"]="𬱿",
["䬐"]="𱃜",
["䬓"]="𫗊",
["䬔"]="𱃞",
["䬘"]="𩙮",
["䬝"]="𩙯",
["䬞"]="𩙧",
["䬟"]="𱃙",
["䬣"]="𱃱",
["䬧"]="𫗟",
["䬪"]="𱃳",
["䬫"]="𬲮",
["䬬"]="𱃵",
["䬯"]="𬲫",
["䬰"]="𲋤",
["䬲"]="𬲯",
["䬳"]="𱃷",
["䬶"]="𬲷",
["䬹"]="𱃸",
["䬾"]="𬲻",
["䭀"]="𩠇",
["䭃"]="𩠈",
["䭅"]="𬲾",
["䭇"]="𬳀",
["䭈"]="𱄃",
["䭉"]="𬳅",
["䭑"]="𫗱",
["䭒"]="𬳋",
["䭓"]="𱃹",
["䭔"]="𫗰",
["䭕"]="𬲕",
["䭘"]="𬳑",
["䭞"]="𬲳",
["䭡"]="𱄉",
["䭢"]="𬲲",
["䭣"]="𬲶",
["䭭"]="𬱯",
["䭿"]="𩧭",
["䮂"]="𱅄",
["䮄"]="𫠊",
["䮈"]="𬳾",
["䮗"]="𬴁",
["䮝"]="𩧰",
["䮞"]="𩨁",
["䮠"]="𩧿",
["䮧"]="𱅠",
["䮫"]="𩨇",
["䮰"]="𫘮",
["䮲"]="𱅦",
["䮳"]="𩨏",
["䮴"]="𲌋",
["䮸"]="𬳸",
["䮽"]="𬴍",
["䮾"]="𩧪",
["䮿"]="𬴏",
["䯀"]="䯅",
["䯤"]="𩩈",
["䰎"]="𱆃",
["䰐"]="𱆅",
["䰖"]="𱆈",
["䰫"]="𱆙",
["䰲"]="𱇍",
["䰶"]="𲍈",
["䰷"]="𬶆",
["䰻"]="𱇕",
["䰽"]="𱇑",
["䰾"]="鲃",
["䱀"]="𫚐",
["䱁"]="𫚏",
["䱂"]="𱇤",
["䱅"]="𱇚",
["䱇"]="𱇞",
["䱊"]="𲍐",
["䱋"]="𲍎",
["䱌"]="𱇬",
["䱍"]="𬶊",
["䱎"]="𱇥",
["䱐"]="𱇲",
["䱒"]="𱇰",
["䱓"]="𬶓",
["䱗"]="𮬞",
["䱙"]="𩾈",
["䱚"]="𮬠",
["䱛"]="𮬟",
["䱜"]="𱇷",
["䱝"]="𲍕",
["䱟"]="𱈀",
["䱡"]="𱇽",
["䱤"]="𱇻",
["䱥"]="𱇹",
["䱧"]="𫚠",
["䱬"]="𩾊",
["䱭"]="𱈇",
["䱰"]="𩾋",
["䱱"]="𬶤",
["䱴"]="𱈈",
["䱵"]="𮬢",
["䱷"]="䲣",
["䱸"]="𫠑",
["䱹"]="𬶣",
["䱻"]="𮬡",
["䱽"]="䲝",
["䱾"]="𱈆",
["䲁"]="鳚",
["䲅"]="𫚜",
["䲉"]="𱈒",
["䲎"]="𲍙",
["䲏"]="𬶗",
["䲑"]="𲍇",
["䲕"]="𬶴",
["䲖"]="𩾂",
["䲗"]="𮬣",
["䲘"]="鳤",
["䲙"]="𬶎",
["䲚"]="𱈖",
["䲛"]="𱈛",
["䲨"]="𬷾",
["䲰"]="𪉂",
["䲸"]="𮭡",
["䲹"]="𱉖",
["䲼"]="𬸆",
["䳂"]="𲍲",
["䳄"]="𲍵",
["䳅"]="𱉙",
["䳇"]="𱉞",
["䳍"]="𮭥",
["䳏"]="𱉤",
["䳑"]="𲍳",
["䳒"]="𱉧",
["䳓"]="𱉦",
["䳕"]="𱉺",
["䳚"]="𱉶",
["䳜"]="𫛬",
["䳟"]="𱊂",
["䳡"]="𲍾",
["䳢"]="𫛰",
["䳤"]="𫛮",
["䳥"]="",
["䳧"]="𫛺",
["䳨"]="𬸛",
["䳫"]="𫛼",
["䳭"]="𱉼",
["䳮"]="𱊓",
["䳲"]="𱊙",
["䳺"]="𱊣",
["䳽"]="",
["䴇"]="𱊪",
["䴈"]="𬸩",
["䴉"]="鹮",
["䴋"]="𫜅",
["䴌"]="𲎈",
["䴏"]="",
["䴚"]="𮭰",
["䴝"]="𱊼",
["䴬"]="𪎈",
["䴭"]="𬹅",
["䴮"]="𱋆",
["䴱"]="𫜒",
["䴲"]="𱋊",
["䴳"]="𱋎",
["䴴"]="𪎋",
["䴵"]="𱋔",
["䴷"]="𬹉",
["䴸"]="𱋗",
["䴹"]="𱋙",
["䴺"]="𱋝",
["䴽"]="𫜔",
["䴾"]="𱋧",
["䵂"]="𱋪",
["䵃"]="𱋫",
["䵆"]="𱋮",
["䵐"]="𱋴",
["䵖"]="𬹔",
["䵘"]="𬓸",
["䵳"]="𪑅",
["䵴"]="𫜙",
["䵶"]="𱌁",
["䵷"]="𱌃",
["䶕"]="𫜨",
["䶗"]="𮯙",
["䶢"]="𬺍",
["䶣"]="𬺃",
["䶦"]="𬺉",
["䶧"]="𱌰",
["䶨"]="𱌵",
["䶪"]="𬺕",
["䶱"]="𱍇",
["䶲"]="𫜳",
["丟"]="丢",
["並"]="并",
["乾"]="干",
["亂"]="乱",
["亙"]="亘",
["亞"]="亚",
["佇"]="伫",
["佈"]="布",
["佔"]="占",
["併"]="并",
["來"]="来",
["侖"]="仑",
["侶"]="侣",
["俁"]="俣",
["係"]="系",
["俓"]="𠇹",
["俔"]="伣",
["俛"]="俯",
["俠"]="侠",
["俥"]="伡",
["俴"]="𠈙",
["俹"]="𱎫",
["倀"]="伥",
["倃"]="咱",
["倆"]="俩",
["倈"]="俫",
["倉"]="仓",
["個"]="个",
["們"]="们",
["倖"]="幸",
["倣"]="仿",
["倫"]="伦",
["倲"]="㑈",
["偉"]="伟",
["偑"]="㐽",
["偒"]="𱎟",
["偩"]="𰁾",
["側"]="侧",
["偵"]="侦",
["偺"]="咱",
["偽"]="伪",
["傌"]="㐷",
["傑"]="杰",
["傖"]="伧",
["傘"]="伞",
["備"]="备",
["傢"]="家",
["傪"]="𫢺",
["傭"]="佣",
["傯"]="偬",
["傱"]="𰁧",
["傳"]="传",
["傴"]="伛",
["債"]="债",
["傷"]="伤",
["傾"]="倾",
["僀"]="𰂗",
["僂"]="偻",
["僅"]="仅",
["僆"]="𫢪",
["僉"]="佥",
["僊"]="仙",
["働"]="动",
["僑"]="侨",
["僓"]="𰂜",
["僕"]="仆",
["僗"]="𫢬",
["僞"]="伪",
["僟"]="仉",
["僤"]="𫢸",
["僥"]="侥",
["僨"]="偾",
["僩"]="𰂎",
["僫"]="𱏀",
["僱"]="雇",
["僴"]="𰂋",
["僶"]="𠊟",
["價"]="价",
["僾"]="𫣊",
["儀"]="仪",
["儁"]="俊",
["儂"]="侬",
["億"]="亿",
["儅"]="𰁸",
["儈"]="侩",
["儉"]="俭",
["儌"]="侥",
["儎"]="傤",
["儐"]="傧",
["儔"]="俦",
["儕"]="侪",
["儖"]="𫣉",
["儗"]="拟",
["儘"]="尽",
["儜"]="佇",
["償"]="偿",
["儢"]="𰂦",
["儣"]="𠆲",
["儥"]="𰂏",
["儩"]="𰂭",
["優"]="优",
["儭"]="𠋆",
["儮"]="",
["儰"]="𫢭",
["儱"]="𫢒",
["儲"]="储",
["儵"]="倏",
["儷"]="俪",
["儸"]="㑩",
["儹"]="𰃆",
["儺"]="傩",
["儻"]="傥",
["儼"]="俨",
["兇"]="凶",
["兌"]="兑",
["兒"]="儿",
["兗"]="兖",
["兠"]="兜",
["內"]="内",
["兩"]="两",
["冊"]="册",
["冪"]="幂",
["凈"]="净",
["凍"]="冻",
["凔"]="𰃷",
["凙"]="𪞝",
["凜"]="凛",
["凟"]="𰃿",
["凱"]="凯",
["凴"]="凭",
["別"]="别",
["刪"]="删",
["刼"]="劫",
["剄"]="刭",
["則"]="则",
["剋"]="克",
["剎"]="刹",
["剏"]="创",
["剗"]="刬",
["剙"]="创",
["剛"]="刚",
["剝"]="剥",
["剮"]="剐",
["剳"]="札",
["剴"]="剀",
["創"]="创",
["剷"]="铲",
["剸"]="𰄞",
["剹"]="戮",
["剼"]="𱐠",
["剾"]="𠛅",
["劃"]="划",
["劇"]="剧",
["劉"]="刘",
["劊"]="刽",
["劌"]="刿",
["劍"]="剑",
["劏"]="㓥",
["劑"]="剂",
["劗"]="𭄛",
["劚"]="㔉",
["勁"]="劲",
["勌"]="倦",
["勑"]="敕",
["動"]="动",
["勗"]="勖",
["務"]="务",
["勛"]="勋",
["勝"]="胜",
["勞"]="劳",
["勢"]="势",
["勣"]="𪟝",
["勦"]="剿",
["勩"]="勚",
["勱"]="劢",
["勳"]="勋",
["勴"]="𰅔",
["勵"]="励",
["勸"]="劝",
["勻"]="匀",
["匭"]="匦",
["匯"]="汇",
["匰"]="𰅦",
["匱"]="匮",
["匳"]="奁",
["匵"]="𰅥",
["區"]="区",
["協"]="协",
["卨"]="𫧯",
["卻"]="却",
["厙"]="厍",
["厠"]="厕",
["厭"]="厌",
["厱"]="𰆚",
["厲"]="厉",
["厴"]="厣",
["參"]="参",
["叡"]="睿",
["叢"]="丛",
["吳"]="吴",
["吶"]="呐",
["呂"]="吕",
["咲"]="笑",
["咼"]="呙",
["員"]="员",
["哯"]="𠯟",
["哶"]="咩",
["唄"]="呗",
["唊"]="𰇕",
["唓"]="𪠳",
["唚"]="吣",
["唸"]="念",
["唻"]="𫪁",
["問"]="问",
["啓"]="启",
["啞"]="哑",
["啟"]="启",
["啢"]="唡",
["啣"]="衔",
["啺"]="𱒂",
["喎"]="㖞",
["喒"]="咱",
["喚"]="唤",
["喡"]="",
["喪"]="丧",
["喫"]="吃",
["喬"]="乔",
["單"]="单",
["喲"]="哟",
["嗁"]="啼",
["嗆"]="呛",
["嗇"]="啬",
["嗊"]="唝",
["嗎"]="吗",
["嗚"]="呜",
["嗧"]="𰇠",
["嗩"]="唢",
["嗶"]="哔",
["嗹"]="𪡏",
["嗿"]="𰇲",
["嘄"]="𫪧",
["嘆"]="叹",
["嘇"]="𰇼",
["嘍"]="喽",
["嘑"]="呼",
["嘓"]="啯",
["嘔"]="呕",
["嘖"]="啧",
["嘗"]="尝",
["嘜"]="唛",
["嘩"]="哗",
["嘪"]="𪡃",
["嘮"]="唠",
["嘯"]="啸",
["嘰"]="叽",
["嘳"]="𪡞",
["嘵"]="哓",
["嘸"]="呒",
["嘺"]="𪡀",
["嘽"]="啴",
["噁"]="𫫇",
["噅"]="𠯠",
["噓"]="嘘",
["噚"]="㖊",
["噝"]="咝",
["噞"]="𪡋",
["噠"]="哒",
["噥"]="哝",
["噦"]="哕",
["噧"]="𱒀",
["噯"]="嗳",
["噲"]="哙",
["噴"]="喷",
["噸"]="吨",
["噹"]="当",
["嚀"]="咛",
["嚂"]="𰈓",
["嚇"]="吓",
["嚈"]="𫩫",
["嚋"]="𱒦",
["嚌"]="哜",
["嚍"]="𫩺",
["嚐"]="尝",
["嚕"]="噜",
["嚙"]="啮",
["嚛"]="𪠸",
["嚝"]="𫩕",
["嚥"]="咽",
["嚦"]="呖",
["嚧"]="𠰷",
["嚨"]="咙",
["嚩"]="𰈶",
["嚪"]="𫫦",
["嚫"]="𰈍",
["嚬"]="𫫾",
["嚮"]="向",
["嚲"]="亸",
["嚳"]="喾",
["嚴"]="严",
["嚶"]="嘤",
["嚽"]="𪢕",
["囀"]="啭",
["囁"]="嗫",
["囂"]="嚣",
["囅"]="冁",
["囈"]="呓",
["囉"]="啰",
["囋"]="𰉄",
["囌"]="苏",
["囐"]="𰈯",
["囑"]="嘱",
["囒"]="𪢠",
["囓"]="啮",
["囕"]="𰈆",
["囖"]="𱕌",
["囪"]="囱",
["囧"]="冏",
["圇"]="囵",
["國"]="国",
["圍"]="围",
["園"]="园",
["圓"]="圆",
["圖"]="图",
["團"]="团",
["圞"]="𪢮",
["垷"]="𰉚",
["垻"]="坝",
["埉"]="𰉥",
["埡"]="垭",
["埨"]="𫭢",
["埬"]="𪣆",
["執"]="执",
["堅"]="坚",
["堈"]="𰉙",
["堊"]="垩",
["堖"]="垴",
["堚"]="𪣒",
["堝"]="埚",
["堦"]="阶",
["堯"]="尧",
["報"]="报",
["場"]="场",
["塊"]="块",
["塋"]="茔",
["塏"]="垲",
["塒"]="埘",
["塗"]="涂",
["塚"]="冢",
["塟"]="葬",
["塢"]="坞",
["塤"]="埙",
["塵"]="尘",
["塸"]="𫭟",
["塹"]="堑",
["塼"]="砖",
["塿"]="𪣻",
["墆"]="𰊂",
["墊"]="垫",
["墋"]="𫮅",
["墏"]="𰊈",
["墜"]="坠",
["墝"]="𫭪",
["墠"]="𫮃",
["墢"]="𫭨",
["墧"]="𰉩",
["墮"]="堕",
["墲"]="𪢸",
["墳"]="坟",
["墵"]="坛",
["墶"]="垯",
["墷"]="𰉪",
["墻"]="墙",
["墾"]="垦",
["墿"]="𰉣",
["壇"]="坛",
["壈"]="𡒄",
["壋"]="垱",
["壍"]="𰊢",
["壏"]="𰊑",
["壐"]="𱖚",
["壓"]="压",
["壔"]="𭎜",
["壘"]="垒",
["壙"]="圹",
["壚"]="垆",
["壛"]="𰊡",
["壜"]="坛",
["壝"]="𭏸",
["壞"]="坏",
["壟"]="垄",
["壠"]="垅",
["壢"]="坜",
["壧"]="𫭲",
["壩"]="坝",
["壪"]="塆",
["壯"]="壮",
["壺"]="壶",
["壼"]="壸",
["壽"]="寿",
["夠"]="够",
["夢"]="梦",
["夥"]="伙",
["夾"]="夹",
["奐"]="奂",
["奧"]="奥",
["奩"]="奁",
["奪"]="夺",
["奬"]="奖",
["奮"]="奋",
["奯"]="𫯥",
["奲"]="𫰂",
["奼"]="姹",
["妝"]="妆",
["妬"]="妒",
["妳"]="你",
["妷"]="侄",
["姉"]="姊",
["姍"]="姗",
["姙"]="妊",
["姦"]="奸",
["姪"]="侄",
["娙"]="𫰛",
["娛"]="娱",
["婁"]="娄",
["婜"]="𫰐",
["婡"]="𫝫",
["婣"]="姻",
["婦"]="妇",
["婨"]="𱙇",
["婬"]="淫",
["婭"]="娅",
["婸"]="𰋸",
["媁"]="𫰍",
["媈"]="𫝨",
["媜"]="𰌂",
["媧"]="娲",
["媮"]="偷",
["媯"]="妫",
["媰"]="㛀",
["媼"]="媪",
["媽"]="妈",
["媿"]="愧",
["嫈"]="𰌀",
["嫋"]="袅",
["嫗"]="妪",
["嫢"]="𫰹",
["嫥"]="𰋹",
["嫧"]="𰌇",
["嫰"]="嫩",
["嫵"]="妩",
["嫺"]="娴",
["嫻"]="娴",
["嫿"]="婳",
["嬀"]="妫",
["嬂"]="𡛰",
["嬃"]="媭",
["嬅"]="𫰡",
["嬇"]="𫝬",
["嬈"]="娆",
["嬋"]="婵",
["嬌"]="娇",
["嬐"]="𫰰",
["嬒"]="𫰢",
["嬙"]="嫱",
["嬝"]="袅",
["嬟"]="",
["嬡"]="嫒",
["嬣"]="𪥰",
["嬤"]="嬷",
["嬦"]="𫝩",
["嬧"]="",
["嬩"]="𱙄",
["嬪"]="嫔",
["嬭"]="奶",
["嬮"]="𰋽",
["嬰"]="婴",
["嬸"]="婶",
["嬻"]="𪥿",
["嬾"]="懒",
["孃"]="娘",
["孄"]="𫝮",
["孆"]="𫝭",
["孇"]="𪥫",
["孋"]="㛤",
["孌"]="娈",
["孍"]="𱙔",
["孎"]="𡠟",
["孫"]="孙",
["孭"]="𱙷",
["孲"]="𰌦",
["學"]="学",
["孻"]="𡥧",
["孾"]="𪧀",
["孿"]="孪",
["宂"]="冗",
["宮"]="宫",
["寀"]="采",
["寏"]="𡨡",
["寑"]="寝",
["寠"]="𪧘",
["寢"]="寝",
["實"]="实",
["寧"]="宁",
["審"]="审",
["寪"]="𰌷",
["寫"]="写",
["寬"]="宽",
["寳"]="宝",
["寴"]="𡩁",
["寵"]="宠",
["寶"]="宝",
["寷"]="𫲸",
["將"]="将",
["專"]="专",
["尋"]="寻",
["對"]="对",
["導"]="导",
["尠"]="鲜",
["尷"]="尴",
["屆"]="届",
["屍"]="尸",
["屓"]="屃",
["屜"]="屉",
["屢"]="屡",
["層"]="层",
["屨"]="屦",
["屩"]="𪨗",
["屬"]="属",
["屭"]="屃",
["岅"]="坂",
["岡"]="冈",
["峴"]="岘",
["島"]="岛",
["峽"]="峡",
["崍"]="崃",
["崐"]="昆",
["崑"]="昆",
["崗"]="岗",
["崘"]="仑",
["崙"]="仑",
["崠"]="𰎏",
["崢"]="峥",
["崬"]="岽",
["崱"]="𰎖",
["崵"]="𫵵",
["嵐"]="岚",
["嵒"]="岩",
["嵷"]="𰎌",
["嵸"]="𡵝",
["嵼"]="𡶴",
["嵽"]="𫶇",
["嵾"]="㟥",
["嶁"]="嵝",
["嶄"]="崭",
["嶇"]="岖",
["嶈"]="𡺃",
["嶔"]="嵚",
["嶗"]="崂",
["嶘"]="𡺄",
["嶠"]="峤",
["嶢"]="峣",
["嶤"]="𰎔",
["嶧"]="峄",
["嶨"]="峃",
["嶩"]="𰎞",
["嶪"]="𰎑",
["嶮"]="崄",
["嶴"]="岙",
["嶸"]="嵘",
["嶹"]="𫝵",
["嶺"]="岭",
["嶼"]="屿",
["嶽"]="岳",
["巃"]="𰎎",
["巄"]="𱛓",
["巆"]="𫶕",
["巊"]="𪩎",
["巋"]="岿",
["巑"]="𰏁",
["巒"]="峦",
["巔"]="巅",
["巖"]="岩",
["巗"]="岩",
["巘"]="𪩘",
["巠"]="𢀖",
["巰"]="巯",
["帥"]="帅",
["師"]="师",
["帳"]="帐",
["帴"]="𰏕",
["帶"]="带",
["幀"]="帧",
["幃"]="帏",
["幓"]="㡎",
["幗"]="帼",
["幘"]="帻",
["幝"]="𪩷",
["幟"]="帜",
["幠"]="𭘓",
["幣"]="币",
["幩"]="𪩸",
["幫"]="帮",
["幬"]="帱",
["幱"]="𰏟",
["幷"]="并",
["幹"]="干",
["幾"]="几",
["庫"]="库",
["庲"]="𫷬",
["庽"]="寓",
["廁"]="厕",
["廂"]="厢",
["廄"]="厩",
["廈"]="厦",
["廎"]="庼",
["廐"]="厩",
["廔"]="𫷹",
["廕"]="荫",
["廗"]="𰏼",
["廚"]="厨",
["廝"]="厮",
["廞"]="𫷷",
["廟"]="庙",
["廠"]="厂",
["廡"]="庑",
["廢"]="废",
["廣"]="广",
["廥"]="𰏶",
["廧"]="𪪞",
["廩"]="廪",
["廬"]="庐",
["廮"]="𫷾",
["廳"]="厅",
["弒"]="弑",
["弔"]="吊",
["弳"]="弪",
["張"]="张",
["強"]="强",
["彃"]="𪪼",
["彄"]="𫸩",
["彆"]="别",
["彈"]="弹",
["彊"]="强",
["彌"]="弥",
["彍"]="𭚦",
["彎"]="弯",
["彙"]="汇",
["彞"]="彝",
["彠"]="彟",
["彥"]="彦",
["彫"]="雕",
["彲"]="彨",
["彿"]="佛",
["後"]="后",
["徑"]="径",
["從"]="从",
["徠"]="徕",
["復"]="复",
["徵"]="征",
["徹"]="彻",
["徿"]="𪫌",
["恆"]="恒",
["恥"]="耻",
["悅"]="悦",
["悏"]="𫺂",
["悓"]="",
["悞"]="悮",
["悵"]="怅",
["悶"]="闷",
["悽"]="凄",
["惀"]="𰑄",
["惡"]="恶",
["惱"]="恼",
["惲"]="恽",
["惻"]="恻",
["愇"]="𫹴",
["愌"]="𢚾",
["愓"]="𰐿",
["愛"]="爱",
["愜"]="惬",
["愨"]="悫",
["愩"]="𫺌",
["愴"]="怆",
["愷"]="恺",
["愻"]="𢙏",
["愽"]="博",
["愾"]="忾",
["慄"]="栗",
["慇"]="殷",
["態"]="态",
["慍"]="愠",
["慐"]="𰑟",
["慖"]="",
["慘"]="惨",
["慙"]="惭",
["慚"]="惭",
["慟"]="恸",
["慣"]="惯",
["慤"]="悫",
["慪"]="怄",
["慫"]="怂",
["慮"]="虑",
["慯"]="𫹽",
["慱"]="𰑁",
["慲"]="𰒆",
["慳"]="悭",
["慴"]="慑",
["慶"]="庆",
["慸"]="𰑵",
["慹"]="𰑔",
["慺"]="㥪",
["慼"]="戚",
["慾"]="欲",
["憂"]="忧",
["憅"]="",
["憊"]="惫",
["憌"]="𱞲",
["憍"]="㤭",
["憐"]="怜",
["憑"]="凭",
["憒"]="愦",
["憖"]="慭",
["憚"]="惮",
["憢"]="𢙒",
["憤"]="愤",
["憦"]="𫺘",
["憪"]="𰑥",
["憫"]="悯",
["憮"]="怃",
["憲"]="宪",
["憳"]="𱞕",
["憴"]="𰑪",
["憶"]="忆",
["憸"]="𪫺",
["憹"]="𢙐",
["懀"]="𢙓",
["懃"]="勤",
["懇"]="恳",
["應"]="应",
["懌"]="怿",
["懍"]="懔",
["懓"]="𭞄",
["懕"]="𰑕",
["懘"]="𰒒",
["懙"]="𫹮",
["懞"]="蒙",
["懟"]="怼",
["懠"]="𫺊",
["懣"]="懑",
["懤"]="㤽",
["懧"]="㤖",
["懨"]="恹",
["懫"]="𰑬",
["懭"]="𰐾",
["懰"]="𰑙",
["懲"]="惩",
["懶"]="懒",
["懷"]="怀",
["懸"]="悬",
["懺"]="忏",
["懼"]="惧",
["懽"]="欢",
["懾"]="慑",
["戀"]="恋",
["戁"]="𫺷",
["戃"]="𰑿",
["戇"]="戆",
["戔"]="戋",
["戧"]="戗",
["戩"]="戬",
["戰"]="战",
["戲"]="戏",
["戶"]="户",
["拋"]="抛",
["拏"]="拿",
["拕"]="拖",
["挩"]="捝",
["挾"]="挟",
["捨"]="舍",
["捫"]="扪",
["捲"]="卷",
["掁"]="𰓄",
["掃"]="扫",
["掄"]="抡",
["掆"]="㧏",
["掗"]="挜",
["掙"]="挣",
["掚"]="𪭵",
["掛"]="挂",
["採"]="采",
["掽"]="碰",
["揀"]="拣",
["揁"]="𱟸",
["揚"]="扬",
["換"]="换",
["揫"]="揪",
["揮"]="挥",
["揹"]="背",
["搆"]="构",
["搇"]="揿",
["搊"]="𫼝",
["損"]="损",
["搎"]="𰓧",
["搖"]="摇",
["搗"]="捣",
["搥"]="捶",
["搨"]="拓",
["搵"]="揾",
["搶"]="抢",
["搾"]="榨",
["摀"]="𰓆",
["摃"]="𫼱",
["摋"]="𢫬",
["摌"]="𫼪",
["摐"]="𪭢",
["摑"]="掴",
["摕"]="𰔇",
["摙"]="𫽁",
["摜"]="掼",
["摟"]="搂",
["摥"]="𫼟",
["摪"]="𫽣",
["摫"]="𰓻",
["摯"]="挚",
["摲"]="𰓼",
["摳"]="抠",
["摶"]="抟",
["摺"]="折",
["摻"]="掺",
["摼"]="𰓱",
["撈"]="捞",
["撊"]="𪭾",
["撋"]="𰓷",
["撌"]="𰔋",
["撏"]="挦",
["撐"]="撑",
["撓"]="挠",
["撝"]="㧑",
["撟"]="挢",
["撡"]="操",
["撣"]="掸",
["撥"]="拨",
["撧"]="𪮖",
["撫"]="抚",
["撲"]="扑",
["撳"]="揿",
["撶"]="𫼧",
["撹"]="搅",
["撻"]="挞",
["撾"]="挝",
["撿"]="捡",
["擁"]="拥",
["擃"]="𫼮",
["擄"]="掳",
["擇"]="择",
["擊"]="击",
["擋"]="挡",
["擓"]="㧟",
["擔"]="担",
["據"]="据",
["擠"]="挤",
["擡"]="抬",
["擣"]="捣",
["擥"]="㧛",
["擧"]="举",
["擪"]="𰓙",
["擫"]="𢬍",
["擬"]="拟",
["擯"]="摈",
["擰"]="拧",
["擱"]="搁",
["擲"]="掷",
["擳"]="𰓜",
["擴"]="扩",
["擷"]="撷",
["擺"]="摆",
["擻"]="擞",
["擼"]="撸",
["擽"]="㧰",
["擾"]="扰",
["攄"]="摅",
["攆"]="撵",
["攋"]="𪮶",
["攎"]="𢫘",
["攏"]="拢",
["攑"]="𫽥",
["攔"]="拦",
["攖"]="撄",
["攙"]="搀",
["攛"]="撺",
["攜"]="携",
["攝"]="摄",
["攞"]="𫽋",
["攡"]="摛",
["攢"]="攒",
["攣"]="挛",
["攤"]="摊",
["攦"]="𰓬",
["攧"]="𭣇",
["攩"]="挡",
["攪"]="搅",
["攬"]="揽",
["攳"]="𰕁",
["敎"]="教",
["敗"]="败",
["敘"]="叙",
["敭"]="扬",
["敳"]="",
["敵"]="敌",
["數"]="数",
["敺"]="驱",
["敿"]="𰕈",
["斁"]="𭣧",
["斂"]="敛",
["斃"]="毙",
["斄"]="𭤎",
["斅"]="𢽾",
["斆"]="敩",
["斕"]="斓",
["斬"]="斩",
["斵"]="斫",
["斷"]="断",
["斸"]="𣃁",
["於"]="于",
["旂"]="旗",
["旝"]="𰕭",
["旟"]="𭤰",
["昇"]="升",
["昜"]="𠃓",
["時"]="时",
["晉"]="晋",
["晛"]="𬀪",
["晝"]="昼",
["晻"]="暗",
["暈"]="晕",
["暉"]="晖",
["暊"]="",
["暎"]="映",
["暐"]="𬀩",
["暘"]="旸",
["暟"]="𬀱",
["暢"]="畅",
["暣"]="𣅠",
["暫"]="暂",
["暱"]="昵",
["曄"]="晔",
["曆"]="历",
["曇"]="昙",
["曉"]="晓",
["曊"]="𪰶",
["曏"]="向",
["曖"]="暧",
["曠"]="旷",
["曥"]="𣆐",
["曨"]="昽",
["曫"]="𬁢",
["曬"]="晒",
["曭"]="𭧋",
["曮"]="𰖈",
["書"]="书",
["會"]="会",
["朢"]="望",
["朥"]="𦛨",
["朧"]="胧",
["朮"]="术",
["東"]="东",
["枒"]="丫",
["柵"]="栅",
["桱"]="𣐕",
["桿"]="杆",
["梔"]="栀",
["梖"]="𪱷",
["梘"]="枧",
["梜"]="𬂩",
["條"]="条",
["梟"]="枭",
["梲"]="棁",
["棄"]="弃",
["棆"]="𰗖",
["棖"]="枨",
["棗"]="枣",
["棟"]="栋",
["棡"]="㭎",
["棧"]="栈",
["棲"]="栖",
["棶"]="梾",
["椉"]="乘",
["椏"]="桠",
["椚"]="𭩛",
["椲"]="㭏",
["椶"]="棕",
["楇"]="𣒌",
["楊"]="杨",
["楎"]="𰗢",
["楓"]="枫",
["楨"]="桢",
["業"]="业",
["極"]="极",
["榝"]="𬂮",
["榦"]="干",
["榪"]="杩",
["榮"]="荣",
["榯"]="𰗨",
["榲"]="榅",
["榿"]="桤",
["構"]="构",
["槍"]="枪",
["槓"]="杠",
["槤"]="梿",
["槧"]="椠",
["槨"]="椁",
["槩"]="概",
["槫"]="𣏢",
["槮"]="椮",
["槳"]="桨",
["槶"]="椢",
["槻"]="𬃀",
["槼"]="规",
["樁"]="桩",
["樂"]="乐",
["樅"]="枞",
["樌"]="𱣱",
["樑"]="梁",
["樓"]="楼",
["標"]="标",
["樞"]="枢",
["樠"]="𣗊",
["樢"]="㭤",
["樣"]="样",
["樤"]="𣔌",
["樫"]="㭴",
["樲"]="𬃘",
["樳"]="桪",
["樴"]="枳",
["樸"]="朴",
["樹"]="树",
["樺"]="桦",
["樻"]="𭫀",
["樿"]="椫",
["橃"]="𭩰",
["橅"]="𬂠",
["橈"]="桡",
["橋"]="桥",
["橒"]="枟",
["橚"]="𰗹",
["機"]="机",
["橢"]="椭",
["橤"]="蕊",
["橨"]="𰗺",
["橫"]="横",
["橯"]="𣓿",
["橺"]="𱣤",
["檁"]="檩",
["檂"]="𬂰",
["檇"]="槜",
["檉"]="柽",
["檋"]="𰘈",
["檏"]="𱣇",
["檒"]="𮨴",
["檔"]="档",
["檛"]="𭪆",
["檜"]="桧",
["檝"]="楫",
["檟"]="槚",
["檡"]="𰗛",
["檢"]="检",
["檣"]="樯",
["檥"]="𭩚",
["檭"]="𣘴",
["檮"]="梼",
["檯"]="台",
["檰"]="𰘣",
["檳"]="槟",
["檷"]="𪱾",
["檸"]="柠",
["檻"]="槛",
["檾"]="𰘓",
["檿"]="𰗜",
["櫂"]="棹",
["櫃"]="柜",
["櫅"]="𪲎",
["櫍"]="𬃊",
["櫎"]="𰗓",
["櫏"]="𰗬",
["櫓"]="橹",
["櫚"]="榈",
["櫛"]="栉",
["櫝"]="椟",
["櫞"]="橼",
["櫟"]="栎",
["櫠"]="𪲮",
["櫢"]="𰘸",
["櫥"]="橱",
["櫧"]="槠",
["櫨"]="栌",
["櫩"]="𰘠",
["櫪"]="枥",
["櫫"]="橥",
["櫬"]="榇",
["櫯"]="𰘶",
["櫱"]="蘖",
["櫳"]="栊",
["櫴"]="𰘳",
["櫸"]="榉",
["櫹"]="𰘩",
["櫺"]="棂",
["櫻"]="樱",
["櫽"]="𬄩",
["欄"]="栏",
["欆"]="",
["欇"]="𪳍",
["權"]="权",
["欏"]="椤",
["欐"]="𪲔",
["欑"]="𪴙",
["欒"]="栾",
["欓"]="𣗋",
["欖"]="榄",
["欗"]="𬅉",
["欘"]="𣚚",
["欝"]="郁",
["欞"]="棂",
["欵"]="款",
["欽"]="钦",
["歄"]="𬅥",
["歍"]="𰙋",
["歎"]="叹",
["歐"]="欧",
["歕"]="𬅫",
["歗"]="𰙑",
["歛"]="敛",
["歟"]="欤",
["歡"]="欢",
["歲"]="岁",
["歴"]="历",
["歷"]="历",
["歸"]="归",
["歿"]="殁",
["殀"]="夭",
["殘"]="残",
["殞"]="殒",
["殢"]="𣨼",
["殤"]="殇",
["殨"]="㱮",
["殫"]="殚",
["殭"]="僵",
["殮"]="殓",
["殯"]="殡",
["殰"]="㱩",
["殲"]="歼",
["殺"]="杀",
["殻"]="壳",
["殼"]="壳",
["殽"]="淆",
["毀"]="毁",
["毄"]="𬆦",
["毆"]="殴",
["毊"]="𪵑",
["毘"]="毗",
["毬"]="球",
["毿"]="毵",
["氀"]="𰚦",
["氂"]="牦",
["氈"]="毡",
["氌"]="氇",
["氣"]="气",
["氫"]="氢",
["氬"]="氩",
["氭"]="𣱝",
["氳"]="氲",
["汎"]="泛",
["汙"]="污",
["汚"]="污",
["決"]="决",
["沒"]="没",
["沖"]="冲",
["況"]="况",
["泝"]="溯",
["泞"]="𰛑",
["洩"]="泄",
["洶"]="汹",
["浹"]="浃",
["浿"]="𬇙",
["涇"]="泾",
["涷"]="𰛒",
["涼"]="凉",
["淒"]="凄",
["淚"]="泪",
["淥"]="渌",
["淨"]="净",
["淩"]="凌",
["淪"]="沦",
["淵"]="渊",
["淶"]="涞",
["淺"]="浅",
["渙"]="涣",
["減"]="减",
["渢"]="沨",
["渦"]="涡",
["測"]="测",
["渾"]="浑",
["湊"]="凑",
["湋"]="𣲗",
["湞"]="浈",
["湧"]="涌",
["湯"]="汤",
["溈"]="沩",
["準"]="准",
["溝"]="沟",
["溡"]="𪶄",
["溤"]="𰛊",
["溫"]="温",
["溮"]="浉",
["溰"]="𰛥",
["溳"]="涢",
["溼"]="湿",
["滄"]="沧",
["滅"]="灭",
["滌"]="涤",
["滎"]="荥",
["滬"]="沪",
["滭"]="𰛡",
["滯"]="滞",
["滲"]="渗",
["滷"]="卤",
["滸"]="浒",
["滻"]="浐",
["滾"]="滚",
["滿"]="满",
["漁"]="渔",
["漊"]="溇",
["漍"]="𬇹",
["漎"]="𰛏",
["漐"]="𰛣",
["漙"]="𬇘",
["漚"]="沤",
["漢"]="汉",
["漣"]="涟",
["漬"]="渍",
["漲"]="涨",
["漸"]="渐",
["漿"]="浆",
["潁"]="颍",
["潑"]="泼",
["潔"]="洁",
["潕"]="𣲘",
["潙"]="沩",
["潚"]="㴋",
["潛"]="潜",
["潣"]="𫞗",
["潤"]="润",
["潬"]="𬈁",
["潯"]="浔",
["潰"]="溃",
["潷"]="滗",
["潿"]="涠",
["澀"]="涩",
["澅"]="𣶩",
["澆"]="浇",
["澇"]="涝",
["澐"]="沄",
["澒"]="𭱊",
["澕"]="",
["澖"]="𰛵",
["澗"]="涧",
["澠"]="渑",
["澢"]="𭰎",
["澤"]="泽",
["澦"]="滪",
["澩"]="泶",
["澫"]="𬇕",
["澬"]="𫞚",
["澮"]="浍",
["澰"]="𰛲",
["澱"]="淀",
["澾"]="㳠",
["濁"]="浊",
["濃"]="浓",
["濄"]="㳡",
["濆"]="𣸣",
["濇"]="涩",
["濊"]="𰛦",
["濔"]="沵",
["濕"]="湿",
["濘"]="泞",
["濙"]="𣸨",
["濚"]="溁",
["濛"]="蒙",
["濜"]="浕",
["濟"]="济",
["濤"]="涛",
["濧"]="㳔",
["濫"]="滥",
["濰"]="潍",
["濱"]="滨",
["濴"]="𬈜",
["濺"]="溅",
["濼"]="泺",
["濾"]="滤",
["濿"]="𪵱",
["瀂"]="澛",
["瀃"]="𣽷",
["瀄"]="𰛤",
["瀅"]="滢",
["瀆"]="渎",
["瀇"]="㲿",
["瀈"]="𰝍",
["瀉"]="泻",
["瀋"]="沈",
["瀏"]="浏",
["瀕"]="濒",
["瀘"]="泸",
["瀙"]="𰜜",
["瀝"]="沥",
["瀟"]="潇",
["瀠"]="潆",
["瀢"]="𬉋",
["瀦"]="潴",
["瀧"]="泷",
["瀨"]="濑",
["瀩"]="𬉏",
["瀭"]="",
["瀯"]="𰝅",
["瀰"]="弥",
["瀲"]="潋",
["瀳"]="𰜨",
["瀴"]="𰜳",
["瀾"]="澜",
["灃"]="沣",
["灄"]="滠",
["灆"]="𱩪",
["灍"]="𫞝",
["灑"]="洒",
["灒"]="𪷽",
["灓"]="𰛪",
["灕"]="漓",
["灘"]="滩",
["灙"]="𣺼",
["灝"]="灏",
["灟"]="𭲫",
["灠"]="𰜐",
["灡"]="𬉠",
["灣"]="湾",
["灤"]="滦",
["灧"]="滟",
["灩"]="滟",
["災"]="灾",
["炤"]="照",
["為"]="为",
["烏"]="乌",
["烖"]="灾",
["烱"]="炯",
["烴"]="烃",
["焛"]="𬮟",
["無"]="无",
["煇"]="辉",
["煈"]="",
["煉"]="炼",
["煑"]="煮",
["煒"]="炜",
["煖"]="暖",
["煗"]="暖",
["煙"]="烟",
["煢"]="茕",
["煥"]="焕",
["煩"]="烦",
["煬"]="炀",
["煱"]="㶽",
["煼"]="𬊂",
["熂"]="𪸕",
["熅"]="煴",
["熈"]="熙",
["熉"]="𤈶",
["熌"]="𤇄",
["熒"]="荧",
["熕"]="𬊎",
["熗"]="炝",
["熚"]="𤇹",
["熞"]="𰞤",
["熡"]="𤋏",
["熰"]="𬉼",
["熱"]="热",
["熲"]="颎",
["熾"]="炽",
["燀"]="𬊤",
["燁"]="烨",
["燄"]="焰",
["燆"]="",
["燈"]="灯",
["燉"]="炖",
["燌"]="𰞻",
["燐"]="磷",
["燒"]="烧",
["燖"]="𬊈",
["燘"]="𬊖",
["燙"]="烫",
["燜"]="焖",
["營"]="营",
["燡"]="𰞇",
["燦"]="灿",
["燬"]="毁",
["燭"]="烛",
["燰"]="𬊺",
["燴"]="烩",
["燵"]="𬊉",
["燶"]="㶶",
["燻"]="熏",
["燼"]="烬",
["燽"]="𬊍",
["燾"]="焘",
["燿"]="耀",
["爁"]="𬊶",
["爃"]="𫞡",
["爄"]="𤇃",
["爌"]="𤆓",
["爍"]="烁",
["爏"]="𱪪",
["爐"]="炉",
["爓"]="𰟘",
["爕"]="燮",
["爖"]="𤇭",
["爗"]="烨",
["爛"]="烂",
["爣"]="𬊵",
["爥"]="𪹳",
["爧"]="𫞠",
["爭"]="争",
["爲"]="为",
["爺"]="爷",
["爾"]="尔",
["牆"]="墙",
["牋"]="笺",
["牐"]="闸",
["牓"]="榜",
["牘"]="牍",
["牠"]="它",
["牴"]="抵",
["牼"]="𰠲",
["牽"]="牵",
["犅"]="𰠫",
["犇"]="奔",
["犓"]="𬌝",
["犖"]="荦",
["犛"]="牦",
["犞"]="𪺭",
["犢"]="犊",
["犤"]="𰠹",
["犧"]="牺",
["狀"]="状",
["狹"]="狭",
["狽"]="狈",
["猌"]="𪺽",
["猍"]="𰡎",
["猙"]="狰",
["猧"]="𰡏",
["猶"]="犹",
["猻"]="狲",
["獁"]="犸",
["獄"]="狱",
["獅"]="狮",
["獃"]="呆",
["獊"]="𪺷",
["獎"]="奖",
["獑"]="𰡔",
["獖"]="𰡞",
["獘"]="毙",
["獟"]="𬌮",
["獢"]="𰡊",
["獨"]="独",
["獩"]="𤞃",
["獪"]="狯",
["獫"]="猃",
["獮"]="狝",
["獰"]="狞",
["獱"]="㺍",
["獲"]="获",
["獵"]="猎",
["獷"]="犷",
["獸"]="兽",
["獹"]="𰡄",
["獺"]="獭",
["獻"]="献",
["獼"]="猕",
["玀"]="猡",
["玁"]="𤞤",
["玂"]="𰡩",
["珮"]="佩",
["珼"]="𫞥",
["現"]="现",
["琖"]="盏",
["琜"]="𱮾",
["琱"]="雕",
["琺"]="珐",
["琿"]="珲",
["瑋"]="玮",
["瑍"]="𤥺",
["瑒"]="玚",
["瑣"]="琐",
["瑤"]="瑶",
["瑩"]="莹",
["瑪"]="玛",
["瑯"]="琅",
["瑲"]="玱",
["瑻"]="𪻲",
["瑽"]="𪻐",
["璉"]="琏",
["璊"]="𫞩",
["璍"]="",
["璕"]="𬍤",
["璗"]="𬍡",
["璛"]="𰢄",
["璝"]="𪻺",
["璡"]="琎",
["璣"]="玑",
["璦"]="瑷",
["璫"]="珰",
["璯"]="㻅",
["環"]="环",
["璵"]="玙",
["璸"]="瑸",
["璹"]="𰡽",
["璼"]="𫞨",
["璽"]="玺",
["璾"]="𫞦",
["璿"]="璇",
["瓄"]="𪻨",
["瓅"]="𬍛",
["瓈"]="璃",
["瓊"]="琼",
["瓏"]="珑",
["瓐"]="𰡵",
["瓓"]="𬎑",
["瓔"]="璎",
["瓕"]="𤦀",
["瓚"]="瓒",
["瓛"]="𤩽",
["甊"]="𰢦",
["甌"]="瓯",
["甎"]="砖",
["甒"]="𰢢",
["甕"]="瓮",
["甖"]="罂",
["產"]="产",
["産"]="产",
["甦"]="苏",
["畝"]="亩",
["畢"]="毕",
["畫"]="画",
["異"]="异",
["當"]="当",
["畼"]="𪽈",
["疇"]="畴",
["疊"]="叠",
["痙"]="痉",
["痮"]="𪽪",
["痲"]="痳",
["痺"]="痹",
["痾"]="疴",
["瘂"]="痖",
["瘉"]="愈",
["瘋"]="疯",
["瘍"]="疡",
["瘑"]="𬏮",
["瘓"]="痪",
["瘞"]="瘗",
["瘡"]="疮",
["瘧"]="疟",
["瘮"]="瘆",
["瘱"]="𪽷",
["瘲"]="疭",
["瘺"]="瘘",
["瘻"]="瘘",
["療"]="疗",
["癆"]="痨",
["癇"]="痫",
["癈"]="废",
["癉"]="瘅",
["癎"]="𰣯",
["癐"]="𤶊",
["癒"]="愈",
["癘"]="疠",
["癟"]="瘪",
["癠"]="𰣬",
["癡"]="痴",
["癢"]="痒",
["癤"]="疖",
["癥"]="症",
["癧"]="疬",
["癩"]="癞",
["癬"]="癣",
["癭"]="瘿",
["癮"]="瘾",
["癰"]="痈",
["癱"]="瘫",
["癲"]="癫",
["癴"]="𰣽",
["發"]="发",
["皁"]="皂",
["皚"]="皑",
["皟"]="𤾀",
["皪"]="𰤕",
["皰"]="疱",
["皸"]="皲",
["皺"]="皱",
["皾"]="𰤬",
["盃"]="杯",
["盋"]="钵",
["盜"]="盗",
["盞"]="盏",
["盡"]="尽",
["監"]="监",
["盤"]="盘",
["盧"]="卢",
["盨"]="𪾔",
["盪"]="荡",
["眝"]="𪾣",
["眞"]="真",
["眡"]="视",
["眥"]="眦",
["眾"]="众",
["睍"]="𪾢",
["睏"]="困",
["睔"]="𬑆",
["睜"]="睁",
["睞"]="睐",
["睪"]="睾",
["睴"]="𬑕",
["瞇"]="眯",
["瞓"]="𰥛",
["瞘"]="眍",
["瞛"]="𰥒",
["瞜"]="䁖",
["瞞"]="瞒",
["瞡"]="𰥪",
["瞤"]="𥆧",
["瞭"]="了",
["瞯"]="𰥨",
["瞱"]="𬑓",
["瞴"]="𱲦",
["瞶"]="瞆",
["瞷"]="𬑗",
["瞼"]="睑",
["矃"]="眝",
["矇"]="蒙",
["矉"]="𪾸",
["矊"]="𬑧",
["矑"]="𪾦",
["矓"]="眬",
["矕"]="𰥠",
["矖"]="𰥢",
["矘"]="𰥹",
["矙"]="瞰",
["矚"]="瞩",
["矯"]="矫",
["矲"]="𰦜",
["砦"]="寨",
["砲"]="炮",
["硃"]="朱",
["硜"]="硁",
["硤"]="硖",
["硨"]="砗",
["硯"]="砚",
["碊"]="𥒎",
["碖"]="𱳯",
["碙"]="𥐻",
["碢"]="𰦿",
["碩"]="硕",
["碪"]="砧",
["碭"]="砀",
["碸"]="砜",
["確"]="确",
["碼"]="码",
["碽"]="䂵",
["磑"]="硙",
["磒"]="𬒍",
["磚"]="砖",
["磟"]="碌",
["磠"]="硵",
["磣"]="碜",
["磧"]="碛",
["磯"]="矶",
["磱"]="𮀤",
["磵"]="𰧃",
["磽"]="硗",
["磾"]="䃅",
["礄"]="硚",
["礆"]="硷",
["礋"]="𰦰",
["礎"]="础",
["礏"]="𬒆",
["礐"]="𬒈",
["礑"]="𱳹",
["礒"]="𥐟",
["礙"]="碍",
["礛"]="𰧔",
["礥"]="𰧇",
["礦"]="矿",
["礩"]="𰧉",
["礪"]="砺",
["礫"]="砾",
["礬"]="矾",
["礮"]="炮",
["礰"]="𰦦",
["礱"]="砻",
["礲"]="𰦭",
["礹"]="𰦾",
["祕"]="秘",
["祿"]="禄",
["禍"]="祸",
["禎"]="祯",
["禓"]="𰧰",
["禕"]="祎",
["禜"]="𰱈",
["禡"]="祃",
["禦"]="御",
["禨"]="𥘌",
["禪"]="禅",
["禬"]="𰧻",
["禮"]="礼",
["禰"]="祢",
["禱"]="祷",
["禵"]="𰨖",
["禿"]="秃",
["秈"]="籼",
["秌"]="秋",
["稅"]="税",
["稈"]="秆",
["稏"]="䅉",
["稜"]="棱",
["稟"]="禀",
["稦"]="",
["稭"]="秸",
["種"]="种",
["稱"]="称",
["穀"]="谷",
["穅"]="糠",
["穇"]="䅟",
["穌"]="稣",
["積"]="积",
["穎"]="颖",
["穖"]="𬓠",
["穠"]="秾",
["穡"]="穑",
["穢"]="秽",
["穧"]="𰨦",
["穨"]="颓",
["穩"]="稳",
["穫"]="获",
["穬"]="𰨜",
["穭"]="稆",
["穽"]="阱",
["窓"]="窗",
["窩"]="窝",
["窪"]="洼",
["窮"]="穷",
["窯"]="窑",
["窰"]="窑",
["窱"]="𰩏",
["窵"]="窎",
["窶"]="窭",
["窺"]="窥",
["窻"]="窗",
["竀"]="𰩓",
["竄"]="窜",
["竅"]="窍",
["竇"]="窦",
["竈"]="灶",
["竉"]="𰩅",
["竊"]="窃",
["竢"]="俟",
["竪"]="竖",
["竱"]="𫁟",
["競"]="竞",
["筆"]="笔",
["筍"]="笋",
["筧"]="笕",
["筩"]="筒",
["筯"]="箸",
["筴"]="策",
["箂"]="",
["箇"]="个",
["箋"]="笺",
["箏"]="筝",
["箒"]="帚",
["箠"]="棰",
["箹"]="𰩺",
["節"]="节",
["範"]="范",
["築"]="筑",
["篋"]="箧",
["篔"]="筼",
["篘"]="𥬠",
["篛"]="箬",
["篠"]="筱",
["篢"]="𬕂",
["篤"]="笃",
["篩"]="筛",
["篳"]="筚",
["篸"]="𥮾",
["篿"]="𰩮",
["簀"]="箦",
["簂"]="𫂆",
["簍"]="篓",
["簑"]="蓑",
["簒"]="篡",
["簜"]="𰩹",
["簞"]="箪",
["簡"]="简",
["簢"]="𫂃",
["簣"]="篑",
["簥"]="𰩸",
["簩"]="𱸇",
["簫"]="箫",
["簵"]="𰪏",
["簷"]="檐",
["簹"]="筜",
["簻"]="𰩻",
["簽"]="签",
["簾"]="帘",
["籃"]="篮",
["籅"]="𥫣",
["籋"]="𥬞",
["籌"]="筹",
["籐"]="藤",
["籑"]="馔",
["籔"]="䉤",
["籙"]="箓",
["籚"]="𰩲",
["籛"]="篯",
["籜"]="箨",
["籟"]="籁",
["籠"]="笼",
["籣"]="𮆏",
["籤"]="签",
["籩"]="笾",
["籪"]="簖",
["籫"]="𬖃",
["籬"]="篱",
["籭"]="𬕄",
["籮"]="箩",
["籯"]="𰪣",
["籲"]="吁",
["粃"]="秕",
["粦"]="磷",
["粧"]="妆",
["粯"]="𬖑",
["粵"]="粤",
["粺"]="稗",
["粻"]="𰪭",
["糉"]="粽",
["糝"]="糁",
["糞"]="粪",
["糧"]="粮",
["糮"]="𬖮",
["糰"]="团",
["糲"]="粝",
["糴"]="籴",
["糶"]="粜",
["糷"]="𰫖",
["糹"]="纟",
["糺"]="纠",
["糽"]="𰫼",
["糾"]="纠",
["紀"]="纪",
["紁"]="",
["紂"]="纣",
["紃"]="𬘓",
["約"]="约",
["紅"]="红",
["紆"]="纡",
["紇"]="纥",
["紈"]="纨",
["紉"]="纫",
["紋"]="纹",
["紌"]="𬘕",
["納"]="纳",
["紐"]="纽",
["紑"]="𰫽",
["紒"]="𰬀",
["紓"]="纾",
["純"]="纯",
["紕"]="纰",
["紖"]="纼",
["紗"]="纱",
["紘"]="纮",
["紙"]="纸",
["級"]="级",
["紛"]="纷",
["紜"]="纭",
["紝"]="纴",
["紞"]="𬘘",
["紟"]="𫄛",
["紡"]="纺",
["紨"]="𰬅",
["紩"]="𮉢",
["紬"]="绸",
["紭"]="𰬋",
["紮"]="扎",
["細"]="细",
["紱"]="绂",
["紲"]="绁",
["紳"]="绅",
["紵"]="纻",
["紶"]="𬘛",
["紸"]="𰬇",
["紹"]="绍",
["紺"]="绀",
["紼"]="绋",
["紽"]="𰬉",
["紾"]="𬘝",
["紿"]="绐",
["絀"]="绌",
["絁"]="𫄟",
["終"]="终",
["絃"]="弦",
["組"]="组",
["絅"]="䌹",
["絆"]="绊",
["絃"]="弦",
["絇"]="𰬆",
["絍"]="𫟃",
["絎"]="绗",
["絏"]="绁",
["結"]="结",
["絑"]="𰬏",
["絓"]="𮉤",
["絕"]="绝",
["絖"]="𬘢",
["絘"]="𰬒",
["絙"]="𫄠",
["絚"]="𰬌",
["絛"]="绦",
["絝"]="绔",
["絞"]="绞",
["絟"]="𬘥",
["絠"]="𬘠",
["絡"]="络",
["絢"]="绚",
["絣"]="𰬔",
["絤"]="𬘟",
["絥"]="𫄢",
["給"]="给",
["絧"]="𫄡",
["絨"]="绒",
["絪"]="𬘡",
["絯"]="𰬓",
["絰"]="绖",
["統"]="统",
["絲"]="丝",
["絳"]="绛",
["絶"]="绝",
["絸"]="𬘖",
["絹"]="绢",
["絺"]="𫄨",
["絻"]="𰬜",
["絼"]="𰬛",
["絽"]="𬘤",
["絾"]="𰬖",
["絿"]="𰬗",
["綀"]="𦈌",
["綁"]="绑",
["綃"]="绡",
["綄"]="𬘫",
["綅"]="𰬞",
["綆"]="绠",
["綈"]="绨",
["綉"]="绣",
["綊"]="𰬍",
["綋"]="𫟄",
["綌"]="绤",
["綍"]="𰬘",
["綎"]="𬘩",
["綏"]="绥",
["綐"]="䌼",
["綑"]="捆",
["經"]="经",
["綕"]="𬘨",
["綖"]="𫄧",
["綘"]="",
["綜"]="综",
["綝"]="𬘭",
["綞"]="缍",
["綟"]="𫄫",
["綠"]="绿",
["綡"]="𫟅",
["綢"]="绸",
["綣"]="绻",
["綧"]="𬘯",
["綪"]="𬘬",
["綫"]="线",
["綬"]="绶",
["維"]="维",
["綯"]="绹",
["綰"]="绾",
["綱"]="纲",
["網"]="网",
["綳"]="绷",
["綴"]="缀",
["綵"]="彩",
["綷"]="𮉬",
["綸"]="纶",
["綹"]="绺",
["綺"]="绮",
["綻"]="绽",
["綼"]="𰬤",
["綽"]="绰",
["綾"]="绫",
["綿"]="绵",
["緀"]="𰬢",
["緁"]="𰬡",
["緂"]="𰬧",
["緄"]="绲",
["緅"]="𮉪",
["緆"]="𰬣",
["緇"]="缁",
["緉"]="𮉧",
["緊"]="紧",
["緋"]="绯",
["緌"]="𮉫",
["緍"]="𦈏",
["緎"]="𰬟",
["総"]="𰬥",
["緐"]="繁",
["緑"]="绿",
["緒"]="绪",
["緓"]="绬",
["緔"]="绱",
["緗"]="缃",
["緘"]="缄",
["緙"]="缂",
["線"]="线",
["緛"]="𬘰",
["緜"]="绵",
["緝"]="缉",
["緞"]="缎",
["緟"]="𫟆",
["締"]="缔",
["緡"]="缗",
["緢"]="𰬬",
["緣"]="缘",
["緤"]="𫄬",
["緥"]="褓",
["緦"]="缌",
["緧"]="𬘶",
["編"]="编",
["緩"]="缓",
["緬"]="缅",
["緮"]="𫄭",
["緯"]="纬",
["緰"]="𦈕",
["緱"]="缑",
["緲"]="缈",
["練"]="练",
["緵"]="𰬯",
["緶"]="缏",
["緷"]="𦈉",
["緸"]="𦈑",
["緹"]="缇",
["緺"]="𮉨",
["緻"]="致",
["緼"]="缊",
["緾"]="𱺦",
["縆"]="𬘵",
["縈"]="萦",
["縉"]="缙",
["縊"]="缢",
["縋"]="缒",
["縌"]="𰬳",
["縍"]="𫄰",
["縎"]="𦈔",
["縐"]="绉",
["縑"]="缣",
["縒"]="𬘷",
["縓"]="𰬲",
["縕"]="缊",
["縖"]="𬘻",
["縗"]="缞",
["縚"]="绦",
["縛"]="缚",
["縜"]="𰬚",
["縝"]="缜",
["縞"]="缟",
["縟"]="缛",
["縡"]="𰬴",
["縣"]="县",
["縧"]="绦",
["縩"]="𮉯",
["縪"]="𰬎",
["縫"]="缝",
["縬"]="𦈚",
["縭"]="缡",
["縮"]="缩",
["縯"]="𬙂",
["縰"]="𫄳",
["縱"]="纵",
["縲"]="缧",
["縳"]="䌸",
["縴"]="纤",
["縵"]="缦",
["縶"]="絷",
["縷"]="缕",
["縸"]="𫄲",
["縹"]="缥",
["縺"]="𦈐",
["縼"]="𰬵",
["總"]="总",
["績"]="绩",
["縿"]="𰬪",
["繀"]="𮉮",
["繂"]="𫄴",
["繃"]="绷",
["繅"]="缫",
["繆"]="缪",
["繈"]="襁",
["繎"]="𬙇",
["繏"]="𦈝",
["繐"]="𰬸",
["繑"]="𰬐",
["繒"]="缯",
["繓"]="𦈛",
["織"]="织",
["繕"]="缮",
["繖"]="伞",
["繗"]="𬙈",
["繘"]="𰬻",
["繙"]="𬙆",
["繚"]="缭",
["繜"]="𰬺",
["繞"]="绕",
["繟"]="𦈎",
["繡"]="绣",
["繢"]="缋",
["繣"]="𰬠",
["繦"]="襁",
["繧"]="纭",
["繨"]="𫄤",
["繩"]="绳",
["繪"]="绘",
["繫"]="系",
["繬"]="𫄱",
["繭"]="茧",
["繮"]="缰",
["繯"]="缳",
["繰"]="缲",
["繲"]="𰬽",
["繳"]="缴",
["繵"]="𬙉",
["繶"]="𫄷",
["繷"]="𫄣",
["繸"]="䍁",
["繹"]="绎",
["繻"]="𦈡",
["繼"]="继",
["繽"]="缤",
["繾"]="缱",
["繿"]="䍀",
["纀"]="𰬿",
["纁"]="𫄸",
["纆"]="𬙊",
["纇"]="颣",
["纈"]="缬",
["纊"]="纩",
["纋"]="𰭀",
["續"]="续",
["纍"]="累",
["纏"]="缠",
["纑"]="𮉡",
["纓"]="缨",
["纔"]="才",
["纕"]="𬙋",
["纖"]="纤",
["纗"]="𫄹",
["纘"]="缵",
["纚"]="𫄥",
["纜"]="缆",
["缽"]="钵",
["缾"]="瓶",
["罃"]="䓨",
["罆"]="𰭄",
["罇"]="樽",
["罈"]="坛",
["罌"]="罂",
["罎"]="坛",
["罏"]="𬙎",
["罰"]="罚",
["罵"]="骂",
["罷"]="罢",
["罼"]="𬙝",
["羂"]="𰭔",
["羅"]="罗",
["羆"]="罴",
["羈"]="羁",
["羋"]="芈",
["羗"]="羌",
["羜"]="𬙯",
["羥"]="羟",
["羨"]="羡",
["義"]="义",
["羵"]="𫅗",
["翄"]="翅",
["習"]="习",
["翜"]="𰭢",
["翫"]="玩",
["翬"]="翚",
["翸"]="𱻞",
["翹"]="翘",
["翺"]="翱",
["翽"]="翙",
["翿"]="𰭣",
["耡"]="锄",
["耫"]="𱻴",
["耬"]="耧",
["耮"]="耢",
["聖"]="圣",
["聞"]="闻",
["聯"]="联",
["聰"]="聪",
["聲"]="声",
["聳"]="耸",
["聵"]="聩",
["聶"]="聂",
["職"]="职",
["聹"]="聍",
["聻"]="𫆏",
["聽"]="听",
["聾"]="聋",
["肅"]="肃",
["肧"]="胚",
["脃"]="脆",
["脅"]="胁",
["脇"]="胁",
["脈"]="脉",
["脗"]="吻",
["脛"]="胫",
["脣"]="唇",
["脥"]="𣍰",
["脫"]="脱",
["脹"]="胀",
["腎"]="肾",
["腖"]="胨",
["腡"]="脶",
["腦"]="脑",
["腪"]="𣍯",
["腫"]="肿",
["腳"]="脚",
["腸"]="肠",
["膃"]="腽",
["膋"]="䒿",
["膒"]="𬁵",
["膓"]="肠",
["膕"]="腘",
["膚"]="肤",
["膞"]="䏝",
["膠"]="胶",
["膢"]="𦝼",
["膩"]="腻",
["膭"]="𱼏",
["膮"]="𰮝",
["膱"]="胑",
["膴"]="𰮇",
["膶"]="𬂀",
["膷"]="𰮅",
["膹"]="𪱥",
["膽"]="胆",
["膾"]="脍",
["膿"]="脓",
["臈"]="腊",
["臉"]="脸",
["臍"]="脐",
["臏"]="膑",
["臓"]="脏",
["臕"]="膘",
["臗"]="𣎑",
["臘"]="腊",
["臙"]="胭",
["臚"]="胪",
["臝"]="裸",
["臟"]="脏",
["臠"]="脔",
["臡"]="𰯋",
["臢"]="臜",
["臥"]="卧",
["臨"]="临",
["臺"]="台",
["與"]="与",
["興"]="兴",
["舉"]="举",
["舊"]="旧",
["舖"]="铺",
["舩"]="船",
["艙"]="舱",
["艛"]="𰰑",
["艜"]="𰰏",
["艢"]="樯",
["艣"]="橹",
["艤"]="舣",
["艦"]="舰",
["艫"]="舻",
["艭"]="𰰋",
["艱"]="艰",
["艷"]="艳",
["芻"]="刍",
["苧"]="苎",
["茘"]="荔",
["茲"]="兹",
["荊"]="荆",
["荍"]="荞",
["荳"]="豆",
["莊"]="庄",
["莖"]="茎",
["莢"]="荚",
["莧"]="苋",
["菓"]="果",
["菕"]="𰰨",
["菣"]="𬜤",
["菫"]="堇",
["華"]="华",
["菴"]="庵",
["菸"]="烟",
["萇"]="苌",
["萊"]="莱",
["萬"]="万",
["萯"]="𰰷",
["萲"]="萱",
["萴"]="荝",
["萵"]="莴",
["葉"]="叶",
["葒"]="荭",
["葝"]="𫈎",
["葠"]="参",
["葤"]="荮",
["葦"]="苇",
["葯"]="药",
["葷"]="荤",
["葻"]="𬜥",
["蒍"]="𫇭",
["蒒"]="𰰳",
["蒓"]="莼",
["蒔"]="莳",
["蒕"]="蒀",
["蒞"]="莅",
["蒭"]="𫇴",
["蒳"]="𰱌",
["蒶"]="𰱍",
["蒼"]="苍",
["蓀"]="荪",
["蓆"]="席",
["蓋"]="盖",
["蓡"]="参",
["蓧"]="𦰏",
["蓮"]="莲",
["蓯"]="苁",
["蓲"]="𰰤",
["蓳"]="堇",
["蓴"]="莼",
["蓻"]="𱽜",
["蓽"]="荜",
["蔄"]="𬜬",
["蔆"]="菱",
["蔎"]="𰰺",
["蔔"]="卜",
["蔕"]="蒂",
["蔘"]="𦲞",
["蔞"]="蒌",
["蔠"]="𰱛",
["蔣"]="蒋",
["蔥"]="葱",
["蔦"]="茑",
["蔪"]="𰱑",
["蔭"]="荫",
["蔮"]="𬜿",
["蔯"]="𫈟",
["蔱"]="𰰵",
["蔴"]="麻",
["蔾"]="藜",
["蔿"]="𫇭",
["蕁"]="荨",
["蕄"]="𰱉",
["蕆"]="蒇",
["蕋"]="蕊",
["蕎"]="荞",
["蕑"]="𰱇",
["蕒"]="荬",
["蕓"]="芸",
["蕕"]="莸",
["蕘"]="荛",
["蕚"]="萼",
["蕝"]="𫈵",
["蕟"]="𬜧",
["蕡"]="𰱟",
["蕢"]="蒉",
["蕩"]="荡",
["蕪"]="芜",
["蕭"]="萧",
["蕳"]="𫈉",
["蕷"]="蓣",
["薀"]="蕰",
["薆"]="𫉁",
["薈"]="荟",
["薉"]="𬜨",
["薊"]="蓟",
["薋"]="𰱱",
["薌"]="芗",
["薑"]="姜",
["薔"]="蔷",
["薖"]="𰰾",
["薘"]="荙",
["薙"]="剃",
["薟"]="莶",
["薠"]="𮐚",
["薦"]="荐",
["薩"]="萨",
["薱"]="𰰱",
["薲"]="𬝯",
["薴"]="苧",
["薵"]="䓓",
["薺"]="荠",
["薾"]="𦬼",
["藇"]="𰰠",
["藉"]="借",
["藍"]="蓝",
["藎"]="荩",
["藖"]="𬜾",
["藘"]="𰱮",
["藚"]="𰱐",
["藝"]="艺",
["藣"]="𰱯",
["藥"]="药",
["藪"]="薮",
["藬"]="𬞘",
["藭"]="䓖",
["藰"]="𰰹",
["藴"]="蕴",
["藶"]="苈",
["藷"]="薯",
["藹"]="蔼",
["藺"]="蔺",
["藼"]="萱",
["藾"]="𰱾",
["蘀"]="萚",
["蘂"]="蕊",
["蘄"]="蕲",
["蘆"]="芦",
["蘇"]="苏",
["蘈"]="𰲁",
["蘊"]="蕴",
["蘋"]="苹",
["蘐"]="萱",
["蘓"]="苏",
["蘚"]="藓",
["蘞"]="蔹",
["蘟"]="𦻕",
["蘡"]="𮐨",
["蘢"]="茏",
["蘤"]="花",
["蘫"]="𬞫",
["蘬"]="𰰮",
["蘭"]="兰",
["蘱"]="𰲒",
["蘴"]="䒠",
["蘵"]="𰱲",
["蘺"]="蓠",
["蘿"]="萝",
["虅"]="𰲂",
["虉"]="𬟁",
["處"]="处",
["虖"]="呼",
["虛"]="虚",
["虜"]="虏",
["號"]="号",
["虦"]="𰲠",
["虧"]="亏",
["虯"]="虬",
["蛵"]="𰲶",
["蛺"]="蛱",
["蛻"]="蜕",
["蛼"]="𰲬",
["蜆"]="蚬",
["蜦"]="𰲰",
["蜸"]="𰲮",
["蜽"]="𮔊",
["蝀"]="𬟽",
["蝁"]="𰲸",
["蝕"]="蚀",
["蝜"]="𮔅",
["蝟"]="猬",
["蝡"]="蠕",
["蝦"]="虾",
["蝨"]="虱",
["蝱"]="虻",
["蝸"]="蜗",
["螄"]="蛳",
["螘"]="𰲹",
["螞"]="蚂",
["螢"]="萤",
["螮"]="䗖",
["螴"]="𰳄",
["螹"]="𰳂",
["螻"]="蝼",
["螿"]="螀",
["蟂"]="𫋇",
["蟄"]="蛰",
["蟈"]="蝈",
["蟎"]="螨",
["蟘"]="𫋌",
["蟙"]="𧊄",
["蟜"]="𫊸",
["蟡"]="𰲲",
["蟣"]="虮",
["蟦"]="𰳊",
["蟧"]="𮔚",
["蟬"]="蝉",
["蟯"]="蛲",
["蟲"]="虫",
["蟳"]="𫊻",
["蟶"]="蛏",
["蟷"]="𬠅",
["蟻"]="蚁",
["蠀"]="𧏗",
["蠁"]="蚃",
["蠅"]="蝇",
["蠆"]="虿",
["蠈"]="𬠠",
["蠌"]="𰲵",
["蠍"]="蝎",
["蠏"]="蟹",
["蠐"]="蛴",
["蠑"]="蝾",
["蠔"]="蚝",
["蠙"]="𧏖",
["蠟"]="蜡",
["蠣"]="蛎",
["蠦"]="𫊮",
["蠨"]="蟏",
["蠪"]="𰲴",
["蠭"]="蜂",
["蠱"]="蛊",
["蠳"]="𰳗",
["蠶"]="蚕",
["蠻"]="蛮",
["蠾"]="𧑏",
["衂"]="衄",
["衆"]="众",
["衊"]="蔑",
["術"]="术",
["衕"]="同",
["衚"]="胡",
["衛"]="卫",
["衞"]="卫",
["衝"]="冲",
["衹"]="只",
["袞"]="衮",
["袵"]="衽",
["裊"]="袅",
["裌"]="夹",
["裏"]="里",
["補"]="补",
["裝"]="装",
["裡"]="里",
["裲"]="𮖁",
["製"]="制",
["複"]="复",
["褌"]="裈",
["褘"]="袆",
["褭"]="袅",
["褲"]="裤",
["褳"]="裢",
["褸"]="褛",
["褺"]="𬡓",
["褻"]="亵",
["襀"]="𫌀",
["襂"]="𰴂",
["襆"]="幞",
["襇"]="裥",
["襌"]="褝",
["襏"]="袯",
["襓"]="𫋹",
["襖"]="袄",
["襗"]="𫋷",
["襘"]="𫋻",
["襛"]="𰳺",
["襝"]="裣",
["襠"]="裆",
["襤"]="褴",
["襪"]="袜",
["襬"]="摆",
["襭"]="𮖱",
["襯"]="衬",
["襰"]="𧝝",
["襱"]="𰳲",
["襲"]="袭",
["襴"]="襕",
["襵"]="𫌇",
["襸"]="𬡷",
["襹"]="𰳼",
["襼"]="𰳵",
["覇"]="霸",
["見"]="见",
["覎"]="觃",
["規"]="规",
["覒"]="𬆾",
["覓"]="觅",
["覔"]="觅",
["覕"]="𰴕",
["視"]="视",
["覗"]="𬢊",
["覘"]="觇",
["覙"]="𫌨",
["覚"]="觉",
["覛"]="𫌪",
["覟"]="𬢌",
["覠"]="𰴙",
["覡"]="觋",
["覢"]="𬊦",
["覤"]="𬟪",
["覥"]="觍",
["覦"]="觎",
["覩"]="睹",
["親"]="亲",
["覫"]="𲁙",
["覬"]="觊",
["覭"]="𬢒",
["覮"]="𲁖",
["覯"]="觏",
["覰"]="𰴜",
["覲"]="觐",
["覴"]="𬢔",
["覶"]="𰴝",
["覷"]="觑",
["覸"]="𰴘",
["覹"]="𫌭",
["覺"]="觉",
["覻"]="𰴞",
["覼"]="𫌨",
["覽"]="览",
["覿"]="觌",
["觀"]="观",
["觔"]="斤",
["觕"]="粗",
["觝"]="抵",
["觴"]="觞",
["觶"]="觯",
["觷"]="𰴣",
["觸"]="触",
["觻"]="𰴢",
["訁"]="讠",
["訂"]="订",
["訃"]="讣",
["訆"]="𰵊",
["計"]="计",
["訉"]="𲂂",
["訊"]="讯",
["訌"]="讧",
["訍"]="𲂃",
["討"]="讨",
["訏"]="𬣙",
["訐"]="讦",
["訑"]="𫍙",
["訒"]="讱",
["訓"]="训",
["訕"]="讪",
["訖"]="讫",
["託"]="托",
["記"]="记",
["訛"]="讹",
["訜"]="𫍛",
["訝"]="讶",
["訞"]="𫍚",
["訟"]="讼",
["訢"]="䜣",
["訣"]="诀",
["訥"]="讷",
["訦"]="𰵒",
["訧"]="𰵎",
["訨"]="𫟞",
["訩"]="讻",
["訪"]="访",
["訬"]="𰵏",
["設"]="设",
["訰"]="𰵍",
["許"]="许",
["訴"]="诉",
["訶"]="诃",
["訸"]="𰵝",
["訹"]="𰵓",
["診"]="诊",
["註"]="注",
["訽"]="𰵛",
["詀"]="𧮪",
["詁"]="诂",
["詃"]="𬣤",
["詄"]="𰵙",
["詅"]="𰵚",
["詆"]="诋",
["詇"]="𰵗",
["詉"]="𰵠",
["詊"]="𫟟",
["詌"]="𬣠",
["詍"]="𰵔",
["詎"]="讵",
["詏"]="𬣦",
["詐"]="诈",
["詑"]="𫍡",
["詒"]="诒",
["詓"]="𫍜",
["詔"]="诏",
["評"]="评",
["詖"]="诐",
["詗"]="诇",
["詘"]="诎",
["詛"]="诅",
["詜"]="𬣥",
["詝"]="𬣞",
["詞"]="词",
["詠"]="咏",
["詡"]="诩",
["詢"]="询",
["詣"]="诣",
["詥"]="𰵣",
["試"]="试",
["詨"]="𰵦",
["詩"]="诗",
["詪"]="𬣳",
["詫"]="诧",
["詬"]="诟",
["詭"]="诡",
["詮"]="诠",
["詯"]="𬣰",
["詰"]="诘",
["話"]="话",
["該"]="该",
["詳"]="详",
["詴"]="𬣩",
["詵"]="诜",
["詶"]="酬",
["詷"]="𫍣",
["詺"]="𬣮",
["詻"]="𰵤",
["詼"]="诙",
["詿"]="诖",
["誁"]="𬣲",
["誂"]="𫍥",
["誃"]="𰵥",
["誄"]="诔",
["誅"]="诛",
["誆"]="诓",
["誇"]="夸",
["誋"]="𫍪",
["誌"]="志",
["認"]="认",
["誎"]="𬣷",
["誏"]="𬣼",
["誐"]="𰵮",
["誑"]="诳",
["誒"]="诶",
["誔"]="𬣻",
["誕"]="诞",
["誗"]="𰵭",
["誘"]="诱",
["誙"]="𰵡",
["誚"]="诮",
["誜"]="𰵯",
["語"]="语",
["誠"]="诚",
["誡"]="诫",
["誣"]="诬",
["誤"]="误",
["誥"]="诰",
["誦"]="诵",
["誧"]="𰵩",
["誨"]="诲",
["誩"]="𲂍",
["說"]="说",
["誫"]="𫍨",
["説"]="说",
["誰"]="谁",
["課"]="课",
["誳"]="𫍮",
["誴"]="𫟡",
["誶"]="谇",
["誷"]="𫍬",
["誹"]="诽",
["誺"]="𫍧",
["誻"]="𰵸",
["誼"]="谊",
["誽"]="𰵵",
["誾"]="訚",
["調"]="调",
["諁"]="𰵷",
["諂"]="谄",
["諃"]="𰵱",
["諄"]="谆",
["諆"]="𰵲",
["談"]="谈",
["諈"]="𰵶",
["諉"]="诿",
["請"]="请",
["諌"]="",
["諍"]="诤",
["諎"]="𬣾",
["諏"]="诹",
["諑"]="诼",
["諒"]="谅",
["諓"]="𬣡",
["諔"]="𰵴",
["諕"]="𬤀",
["論"]="论",
["諗"]="谂",
["諘"]="𲂏",
["諛"]="谀",
["諜"]="谍",
["諝"]="谞",
["諞"]="谝",
["諟"]="𬤊",
["諠"]="喧",
["諡"]="谥",
["諢"]="诨",
["諣"]="𫍩",
["諤"]="谔",
["諥"]="𫍳",
["諦"]="谛",
["諧"]="谐",
["諫"]="谏",
["諭"]="谕",
["諮"]="谘",
["諯"]="𫍱",
["諰"]="𫍰",
["諱"]="讳",
["諲"]="𬤇",
["諳"]="谙",
["諴"]="𫍯",
["諵"]="𲂐",
["諶"]="谌",
["諷"]="讽",
["諸"]="诸",
["諹"]="𰵌",
["諺"]="谚",
["諻"]="𬤍",
["諼"]="谖",
["諾"]="诺",
["謀"]="谋",
["謁"]="谒",
["謂"]="谓",
["謄"]="誊",
["謅"]="诌",
["謆"]="𫍸",
["謉"]="𫍷",
["謊"]="谎",
["謋"]="𰵼",
["謌"]="歌",
["謍"]="𰴯",
["謎"]="谜",
["謏"]="𫍲",
["謐"]="谧",
["謑"]="𰵾",
["謔"]="谑",
["謖"]="谡",
["謗"]="谤",
["謙"]="谦",
["謚"]="谥",
["講"]="讲",
["謜"]="𰵺",
["謝"]="谢",
["謞"]="𰵿",
["謟"]="𰵽",
["謠"]="谣",
["謡"]="谣",
["謣"]="𰶀",
["謥"]="𰶂",
["謨"]="谟",
["謫"]="谪",
["謬"]="谬",
["謭"]="谫",
["謯"]="𫍹",
["謰"]="𬣽",
["謱"]="𫍴",
["謲"]="𬤄",
["謳"]="讴",
["謵"]="𰶃",
["謶"]="𲂔",
["謸"]="𫍵",
["謹"]="谨",
["謻"]="𰶁",
["謼"]="呼",
["謾"]="谩",
["譀"]="𰶆",
["譁"]="哗",
["譂"]="𫟠",
["譄"]="𬤤",
["譅"]="𰶎",
["譆"]="嘻",
["譇"]="𰶄",
["譈"]="𬤣",
["證"]="证",
["譊"]="𫍢",
["譌"]="𰵑",
["譎"]="谲",
["譏"]="讥",
["譐"]="𬤢",
["譑"]="𫍤",
["譒"]="",
["譓"]="𬤝",
["譔"]="撰",
["譖"]="谮",
["識"]="识",
["譙"]="谯",
["譚"]="谭",
["譜"]="谱",
["譞"]="𫍽",
["譟"]="噪",
["譠"]="𰶉",
["譡"]="𬣭",
["譢"]="𲂖",
["譧"]="𲂕",
["譨"]="𫍦",
["譩"]="𰶊",
["譫"]="谵",
["譭"]="毁",
["譯"]="译",
["議"]="议",
["譳"]="𰶌",
["譴"]="谴",
["護"]="护",
["譸"]="诪",
["譹"]="𬤫",
["譺"]="𬤩",
["譻"]="𬢯",
["譼"]="䛓",
["譽"]="誉",
["譾"]="谫",
["譿"]="𬤭",
["讀"]="读",
["讁"]="谪",
["讂"]="𰶍",
["讅"]="谉",
["讆"]="𬣀",
["讇"]="𬤛",
["讉"]="𬤦",
["變"]="变",
["讋"]="詟",
["讌"]="宴",
["讎"]="雠",
["讑"]="𰶏",
["讒"]="谗",
["讓"]="让",
["讔"]="𮙊",
["讕"]="谰",
["讖"]="谶",
["讘"]="𰵹",
["讙"]="欢",
["讚"]="赞",
["讛"]="𰵖",
["讜"]="谠",
["讝"]="𰵨",
["讞"]="谳",
["讟"]="𮙋",
["豄"]="𰶔",
["豅"]="𰶑",
["豈"]="岂",
["豎"]="竖",
["豐"]="丰",
["豔"]="艳",
["豬"]="猪",
["豵"]="𫎆",
["豶"]="豮",
["貍"]="狸",
["貓"]="猫",
["貗"]="𫎌",
["貙"]="䝙",
["貛"]="獾",
["貝"]="贝",
["貞"]="贞",
["貟"]="贠",
["負"]="负",
["財"]="财",
["貢"]="贡",
["貣"]="𰷞",
["貤"]="𰷠",
["貦"]="𰷡",
["貧"]="贫",
["貨"]="货",
["販"]="贩",
["貪"]="贪",
["貫"]="贯",
["責"]="责",
["貯"]="贮",
["貰"]="贳",
["貱"]="𬥶",
["貲"]="赀",
["貳"]="贰",
["貴"]="贵",
["貶"]="贬",
["買"]="买",
["貸"]="贷",
["貺"]="贶",
["費"]="费",
["貼"]="贴",
["貽"]="贻",
["貾"]="𰷢",
["貿"]="贸",
["賀"]="贺",
["賁"]="贲",
["賂"]="赂",
["賃"]="赁",
["賄"]="贿",
["賅"]="赅",
["資"]="资",
["賈"]="贾",
["賊"]="贼",
["賍"]="赃",
["賏"]="𲂻",
["賑"]="赈",
["賒"]="赊",
["賓"]="宾",
["賕"]="赇",
["賗"]="𬥸",
["賙"]="赒",
["賚"]="赉",
["賛"]="赞",
["賜"]="赐",
["賝"]="𫎩",
["賞"]="赏",
["賟"]="𧹖",
["賠"]="赔",
["賡"]="赓",
["賢"]="贤",
["賣"]="卖",
["賤"]="贱",
["賥"]="𰷤",
["賦"]="赋",
["賧"]="赕",
["賨"]="𰷥",
["質"]="质",
["賫"]="赍",
["賬"]="账",
["賭"]="赌",
["賮"]="𰷧",
["賰"]="䞐",
["賲"]="𲃄",
["賴"]="赖",
["賵"]="赗",
["賷"]="赍",
["賸"]="剩",
["賹"]="𰷪",
["賺"]="赚",
["賻"]="赙",
["購"]="购",
["賽"]="赛",
["賾"]="赜",
["贃"]="𧹗",
["贄"]="贽",
["贅"]="赘",
["贆"]="𰷫",
["贇"]="赟",
["贈"]="赠",
["贉"]="𫎫",
["贊"]="赞",
["贋"]="赝",
["贍"]="赡",
["贏"]="赢",
["贐"]="赆",
["贑"]="赣",
["贓"]="赃",
["贔"]="赑",
["贕"]="𫧿",
["贖"]="赎",
["贗"]="赝",
["贙"]="𰷮",
["贚"]="𫎦",
["贛"]="赣",
["贜"]="赃",
["赬"]="赪",
["趕"]="赶",
["趙"]="赵",
["趨"]="趋",
["趫"]="𰷶",
["趬"]="𰷵",
["趰"]="趂",
["趲"]="趱",
["跡"]="迹",
["踁"]="胫",
["踐"]="践",
["踚"]="𬦧",
["踰"]="逾",
["踴"]="踊",
["踼"]="𰸄",
["蹌"]="跄",
["蹏"]="蹄",
["蹔"]="暂",
["蹕"]="跸",
["蹛"]="𰸚",
["蹟"]="迹",
["蹡"]="𬧀",
["蹣"]="蹒",
["蹤"]="踪",
["蹥"]="𰸔",
["蹪"]="𰸞",
["蹳"]="𫏆",
["蹺"]="跷",
["蹻"]="跷",
["躀"]="𬦻",
["躂"]="跶",
["躉"]="趸",
["躊"]="踌",
["躋"]="跻",
["躍"]="跃",
["躎"]="䟢",
["躑"]="踯",
["躒"]="跞",
["躓"]="踬",
["躕"]="蹰",
["躘"]="𨀁",
["躚"]="跹",
["躝"]="𨅬",
["躡"]="蹑",
["躥"]="蹿",
["躦"]="躜",
["躧"]="𰸐",
["躪"]="躏",
["躭"]="耽",
["躳"]="躬",
["躶"]="裸",
["躼"]="𲄚",
["軀"]="躯",
["軁"]="𲄧",
["軂"]="𬧤",
["軃"]="𰹀",
["軇"]="𮜶",
["車"]="车",
["軋"]="轧",
["軌"]="轨",
["軍"]="军",
["軎"]="𰹲",
["軏"]="𫐄",
["軑"]="轪",
["軒"]="轩",
["軓"]="𰹴",
["軔"]="轫",
["軖"]="𰹶",
["軗"]="𨐅",
["軘"]="𰹸",
["軚"]="",
["軛"]="轭",
["軜"]="𫐇",
["軝"]="𬨂",
["軞"]="𬨁",
["軟"]="软",
["軤"]="轷",
["軥"]="𰺁",
["軧"]="𰺀",
["軨"]="𫐉",
["軫"]="轸",
["軬"]="𫐊",
["軮"]="𬨄",
["軯"]="𰹽",
["軱"]="𮝴",
["軲"]="轱",
["軳"]="𰺂",
["軵"]="𰹿",
["軷"]="𫐈",
["軸"]="轴",
["軹"]="轵",
["軺"]="轺",
["軻"]="轲",
["軼"]="轶",
["軾"]="轼",
["軿"]="𫐌",
["輀"]="𮝵",
["輁"]="𰺄",
["輂"]="𰺅",
["較"]="较",
["輄"]="𨐈",
["輅"]="辂",
["輆"]="𬨇",
["輇"]="辁",
["輈"]="辀",
["載"]="载",
["輊"]="轾",
["輋"]="𪨶",
["輐"]="𰺇",
["輑"]="𰺈",
["輒"]="辄",
["輓"]="挽",
["輔"]="辅",
["輕"]="轻",
["輖"]="𫐏",
["輗"]="𫐐",
["輘"]="𰺊",
["輙"]="辄",
["輚"]="𰹼",
["輛"]="辆",
["輜"]="辎",
["輝"]="辉",
["輞"]="辋",
["輟"]="辍",
["輠"]="𰺍",
["輡"]="𰺐",
["輢"]="𫐎",
["輣"]="𰺏",
["輤"]="𰺉",
["輥"]="辊",
["輦"]="辇",
["輨"]="𫐑",
["輩"]="辈",
["輪"]="轮",
["輫"]="𰺎",
["輬"]="辌",
["輭"]="软",
["輮"]="𫐓",
["輯"]="辑",
["輲"]="𰺒",
["輳"]="辏",
["輴"]="𮝸",
["輵"]="𬨍",
["輶"]="𬨎",
["輷"]="𫐒",
["輸"]="输",
["輹"]="𰺓",
["輻"]="辐",
["輼"]="辒",
["輾"]="辗",
["輿"]="舆",
["轀"]="辒",
["轁"]="",
["轂"]="毂",
["轃"]="𰺖",
["轄"]="辖",
["轅"]="辕",
["轆"]="辘",
["轇"]="𫐖",
["轈"]="𬨓",
["轉"]="转",
["轊"]="𫐕",
["轍"]="辙",
["轎"]="轿",
["轏"]="𰺞",
["轐"]="𫐗",
["轑"]="𰺛",
["轒"]="𮝷",
["轓"]="𰺜",
["轔"]="辚",
["轕"]="𮝺",
["轖"]="𰺙",
["轗"]="𫐘",
["轘"]="𮝹",
["轙"]="𰹵",
["轚"]="𰺟",
["轛"]="𰺃",
["轞"]="𰺗",
["轟"]="轰",
["轠"]="𫐙",
["轡"]="辔",
["轢"]="轹",
["轣"]="𫐆",
["轤"]="轳",
["轥"]="𰺣",
["辦"]="办",
["辭"]="辞",
["辮"]="辫",
["辯"]="辩",
["農"]="农",
["辳"]="农",
["迴"]="回",
["迻"]="移",
["逈"]="迥",
["逕"]="迳",
["這"]="这",
["連"]="连",
["逩"]="奔",
["週"]="周",
["進"]="进",
["逿"]="𰺲",
["遉"]="侦",
["遊"]="游",
["運"]="运",
["過"]="过",
["達"]="达",
["違"]="违",
["遙"]="遥",
["遜"]="逊",
["遞"]="递",
["遠"]="远",
["遡"]="溯",
["遤"]="𲅎",
["適"]="适",
["遯"]="遁",
["遰"]="𰻆",
["遱"]="𫐷",
["遲"]="迟",
["遶"]="绕",
["遷"]="迁",
["選"]="选",
["遺"]="遗",
["遼"]="辽",
["邁"]="迈",
["還"]="还",
["邇"]="迩",
["邊"]="边",
["邏"]="逻",
["邐"]="逦",
["郟"]="郏",
["郲"]="𬩾",
["郵"]="邮",
["鄆"]="郓",
["鄉"]="乡",
["鄒"]="邹",
["鄔"]="邬",
["鄖"]="郧",
["鄟"]="𫑘",
["鄡"]="𰻮",
["鄦"]="𰻡",
["鄧"]="邓",
["鄩"]="𬩽",
["鄪"]="𰻳",
["鄬"]="𰻦",
["鄭"]="郑",
["鄮"]="𬪍",
["鄰"]="邻",
["鄲"]="郸",
["鄳"]="𫑡",
["鄴"]="邺",
["鄶"]="郐",
["鄺"]="邝",
["酇"]="酂",
["酈"]="郦",
["酖"]="鸩",
["酧"]="酬",
["醃"]="腌",
["醆"]="盏",
["醖"]="酝",
["醜"]="丑",
["醞"]="酝",
["醟"]="蒏",
["醣"]="糖",
["醦"]="𮠳",
["醧"]="𬪧",
["醫"]="医",
["醬"]="酱",
["醱"]="酦",
["醲"]="𬪩",
["醳"]="𰼅",
["醶"]="𫑷",
["醻"]="酬",
["醼"]="宴",
["釀"]="酿",
["釁"]="衅",
["釃"]="酾",
["釅"]="酽",
["釋"]="释",
["釒"]="钅",
["釓"]="钆",
["釔"]="钇",
["釕"]="钌",
["釗"]="钊",
["釘"]="钉",
["釙"]="钋",
["釚"]="𫟲",
["針"]="针",
["釟"]="𫓥",
["釣"]="钓",
["釤"]="钐",
["釥"]="𰽛",
["釦"]="扣",
["釧"]="钏",
["釨"]="𫓦",
["釩"]="钒",
["釪"]="𰽗",
["釫"]="𬬨",
["釬"]="焊",
["釭"]="𮣲",
["釮"]="𲇭",
["釰"]="𲇰",
["釱"]="𰽘",
["釲"]="𫟳",
["釳"]="𨰿",
["釴"]="𬬩",
["釵"]="钗",
["釷"]="钍",
["釹"]="钕",
["釺"]="钎",
["釽"]="𬬲",
["釾"]="䥺",
["釿"]="𬬱",
["鈀"]="钯",
["鈁"]="钫",
["鈂"]="𬬵",
["鈃"]="钘",
["鈄"]="钭",
["鈅"]="钥",
["鈆"]="铅",
["鈇"]="𫓧",
["鈈"]="钚",
["鈉"]="钠",
["鈊"]="𲇴",
["鈋"]="𨱂",
["鈌"]="𰽤",
["鈍"]="钝",
["鈎"]="钩",
["鈏"]="𰽣",
["鈐"]="钤",
["鈑"]="钣",
["鈒"]="钑",
["鈓"]="𬬯",
["鈔"]="钞",
["鈕"]="钮",
["鈖"]="𫟴",
["鈗"]="𫟵",
["鈘"]="𲇱",
["鈚"]="𬬫",
["鈜"]="𮣳",
["鈞"]="钧",
["鈠"]="𨱁",
["鈡"]="钟",
["鈣"]="钙",
["鈤"]="𰽡",
["鈥"]="钬",
["鈦"]="钛",
["鈧"]="钪",
["鈨"]="",
["鈪"]="𰽞",
["鈮"]="铌",
["鈯"]="𨱄",
["鈰"]="铈",
["鈱"]="𲇸",
["鈲"]="𨱃",
["鈳"]="钶",
["鈴"]="铃",
["鈵"]="𰽥",
["鈶"]="𬭀",
["鈷"]="钴",
["鈸"]="钹",
["鈹"]="铍",
["鈺"]="钰",
["鈼"]="𬬽",
["鈽"]="钸",
["鈾"]="铀",
["鈿"]="钿",
["鉀"]="钾",
["鉁"]="𨱅",
["鉅"]="巨",
["鉆"]="钻",
["鉈"]="铊",
["鉉"]="铉",
["鉊"]="𬬿",
["鉋"]="刨",
["鉌"]="𰽬",
["鉍"]="铋",
["鉎"]="𰽫",
["鉏"]="锄",
["鉐"]="𬬷",
["鉑"]="铂",
["鉒"]="𰽯",
["鉔"]="𫓬",
["鉕"]="钷",
["鉗"]="钳",
["鉘"]="𰽱",
["鉚"]="铆",
["鉛"]="铅",
["鉜"]="𰽮",
["鉝"]="𫟷",
["鉞"]="钺",
["鉟"]="𰽧",
["鉠"]="𫓭",
["鉡"]="𰽰",
["鉢"]="钵",
["鉤"]="钩",
["鉥"]="𬬸",
["鉦"]="钲",
["鉧"]="𬭁",
["鉨"]="鿭",
["鉬"]="钼",
["鉭"]="钽",
["鉮"]="𬬹",
["鉲"]="𰽩",
["鉵"]="𰽶",
["鉶"]="铏",
["鉷"]="𫟹",
["鉸"]="铰",
["鉹"]="𰽹",
["鉺"]="铒",
["鉻"]="铬",
["鉼"]="𰽼",
["鉽"]="𫟸",
["鉾"]="𫓴",
["鉿"]="铪",
["銀"]="银",
["銁"]="𫓲",
["銂"]="𫟻",
["銃"]="铳",
["銅"]="铜",
["銈"]="𫓯",
["銊"]="𫓰",
["銋"]="𰽻",
["銌"]="𲇻",
["銍"]="铚",
["銏"]="𫟶",
["銑"]="铣",
["銓"]="铨",
["銔"]="𬭃",
["銖"]="铢",
["銗"]="𬭅",
["銘"]="铭",
["銙"]="𰽴",
["銚"]="铫",
["銛"]="铦",
["銜"]="衔",
["銠"]="铑",
["銡"]="𰽲",
["銣"]="铷",
["銥"]="铱",
["銦"]="铟",
["銧"]="𰽵",
["銨"]="铵",
["銩"]="铥",
["銪"]="铕",
["銫"]="铯",
["銬"]="铐",
["銱"]="铞",
["銲"]="焊",
["銳"]="锐",
["銶"]="𨱇",
["銷"]="销",
["銸"]="𰽿",
["銹"]="锈",
["銻"]="锑",
["銼"]="锉",
["銾"]="𰾁",
["鋁"]="铝",
["鋂"]="𰾄",
["鋃"]="锒",
["鋅"]="锌",
["鋇"]="钡",
["鋉"]="𨱈",
["鋊"]="𰾆",
["鋋"]="𮣴",
["鋌"]="铤",
["鋍"]="𰾀",
["鋏"]="铗",
["鋐"]="𬭎",
["鋑"]="",
["鋒"]="锋",
["鋓"]="",
["鋕"]="𲇽",
["鋗"]="𫓶",
["鋘"]="𬭌",
["鋙"]="铻",
["鋜"]="𰾃",
["鋝"]="锊",
["鋟"]="锓",
["鋠"]="𫓵",
["鋡"]="𰾅",
["鋣"]="铘",
["鋤"]="锄",
["鋥"]="锃",
["鋦"]="锔",
["鋧"]="𰽢",
["鋨"]="锇",
["鋩"]="铓",
["鋪"]="铺",
["鋭"]="锐",
["鋮"]="铖",
["鋯"]="锆",
["鋰"]="锂",
["鋱"]="铽",
["鋲"]="𲇿",
["鋶"]="锍",
["鋸"]="锯",
["鋹"]="𬬮",
["鋼"]="钢",
["鋾"]="𰾏",
["鋿"]="𲈆",
["錀"]="𬬭",
["錁"]="锞",
["錂"]="𨱋",
["錄"]="录",
["錆"]="锖",
["錇"]="锫",
["錈"]="锩",
["錋"]="𬭖",
["錍"]="𰾎",
["錏"]="铔",
["錐"]="锥",
["錑"]="𬭜",
["錒"]="锕",
["錔"]="𰾓",
["錕"]="锟",
["錗"]="𬭗",
["錘"]="锤",
["錙"]="锱",
["錚"]="铮",
["錛"]="锛",
["錜"]="𫓻",
["錝"]="𫓽",
["錞"]="𬭚",
["錟"]="锬",
["錠"]="锭",
["錡"]="锜",
["錢"]="钱",
["錣"]="𮣵",
["錤"]="𫓹",
["錥"]="𫓾",
["錦"]="锦",
["錧"]="𰾒",
["錨"]="锚",
["錩"]="锠",
["錪"]="𬭓",
["錫"]="锡",
["錬"]="𲇷",
["錭"]="𬭕",
["錮"]="锢",
["錯"]="错",
["録"]="录",
["錳"]="锰",
["錴"]="𲈁",
["錶"]="表",
["錸"]="铼",
["錺"]="",
["錽"]="𫓸",
["鍀"]="锝",
["鍁"]="锨",
["鍂"]="𰾑",
["鍃"]="锪",
["鍄"]="𨱉",
["鍆"]="钔",
["鍇"]="锴",
["鍈"]="锳",
["鍉"]="𫔂",
["鍊"]="炼",
["鍋"]="锅",
["鍍"]="镀",
["鍏"]="𬬬",
["鍐"]="𰾞",
["鍑"]="𰾟",
["鍒"]="𫔄",
["鍔"]="锷",
["鍕"]="",
["鍖"]="𰾘",
["鍘"]="铡",
["鍚"]="钖",
["鍛"]="锻",
["鍜"]="𰾤",
["鍝"]="𰾙",
["鍟"]="𰾝",
["鍠"]="锽",
["鍡"]="𰾚",
["鍢"]="",
["鍣"]="𬭡",
["鍤"]="锸",
["鍥"]="锲",
["鍦"]="𰾢",
["鍧"]="𰾡",
["鍨"]="𰾥",
["鍩"]="锘",
["鍫"]="锹",
["鍬"]="锹",
["鍭"]="𬭤",
["鍮"]="𨱎",
["鍰"]="锾",
["鍱"]="𰾕",
["鍳"]="鉴",
["鍴"]="𰾜",
["鍵"]="键",
["鍶"]="锶",
["鍷"]="𲈌",
["鍸"]="𲈋",
["鍹"]="𲈎",
["鍺"]="锗",
["鍼"]="针",
["鍾"]="钟",
["鎁"]="𲈍",
["鎂"]="镁",
["鎄"]="锿",
["鎅"]="𰾛",
["鎇"]="镅",
["鎈"]="𫟿",
["鎉"]="𰾬",
["鎊"]="镑",
["鎋"]="𬭪",
["鎌"]="镰",
["鎍"]="𫔅",
["鎑"]="𰾩",
["鎒"]="𬭦",
["鎓"]="𬭩",
["鎔"]="镕",
["鎕"]="𰾯",
["鎖"]="锁",
["鎗"]="枪",
["鎘"]="镉",
["鎙"]="𫔈",
["鎚"]="锤",
["鎛"]="镈",
["鎝"]="𨱏",
["鎞"]="𫔇",
["鎡"]="镃",
["鎢"]="钨",
["鎣"]="蓥",
["鎤"]="𲈒",
["鎦"]="镏",
["鎧"]="铠",
["鎩"]="铩",
["鎪"]="锼",
["鎬"]="镐",
["鎭"]="镇",
["鎮"]="镇",
["鎯"]="𨱍",
["鎰"]="镒",
["鎲"]="镋",
["鎳"]="镍",
["鎵"]="镓",
["鎶"]="鿔",
["鎷"]="𨰾",
["鎸"]="镌",
["鎻"]="锁",
["鎿"]="镎",
["鏁"]="𬭲",
["鏂"]="𰽜",
["鏃"]="镞",
["鏄"]="𲇲",
["鏆"]="𨱌",
["鏇"]="旋",
["鏈"]="链",
["鏉"]="𨱒",
["鏋"]="𬭮",
["鏌"]="镆",
["鏍"]="镙",
["鏏"]="𬭬",
["鏐"]="镠",
["鏑"]="镝",
["鏒"]="𬭝",
["鏓"]="𰾱",
["鏔"]="𬭰",
["鏕"]="𰾲",
["鏗"]="铿",
["鏘"]="锵",
["鏙"]="𰾰",
["鏚"]="𬭭",
["鏛"]="",
["鏜"]="镗",
["鏝"]="镘",
["鏞"]="镛",
["鏟"]="铲",
["鏡"]="镜",
["鏢"]="镖",
["鏤"]="镂",
["鏦"]="𫓩",
["鏨"]="錾",
["鏩"]="𰾌",
["鏰"]="镚",
["鏱"]="𲈗",
["鏳"]="𲈜",
["鏴"]="𲈝",
["鏵"]="铧",
["鏷"]="镤",
["鏸"]="𰾶",
["鏹"]="镪",
["鏺"]="䥽",
["鏻"]="𬭸",
["鏽"]="锈",
["鏾"]="𫔌",
["鐀"]="𬭢",
["鐁"]="𰾴",
["鐃"]="铙",
["鐄"]="𨱑",
["鐇"]="𫔍",
["鐈"]="𫓱",
["鐉"]="𰾼",
["鐋"]="铴",
["鐍"]="𫔎",
["鐎"]="𨱓",
["鐏"]="𨱔",
["鐐"]="镣",
["鐒"]="铹",
["鐓"]="镦",
["鐔"]="镡",
["鐕"]="𰾷",
["鐖"]="𰽕",
["鐘"]="钟",
["鐙"]="镫",
["鐛"]="𲈚",
["鐝"]="镢",
["鐠"]="镨",
["鐤"]="𰾸",
["鐥"]="䦅",
["鐦"]="锎",
["鐧"]="锏",
["鐨"]="镄",
["鐩"]="𬭼",
["鐪"]="𫓺",
["鐫"]="镌",
["鐬"]="𰽷",
["鐮"]="镰",
["鐯"]="䦃",
["鐰"]="𲈞",
["鐱"]="𲈀",
["鐲"]="镯",
["鐳"]="镭",
["鐴"]="𬭽",
["鐵"]="铁",
["鐶"]="镮",
["鐸"]="铎",
["鐹"]="𰽾",
["鐺"]="铛",
["鐻"]="𮣷",
["鐼"]="𫔁",
["鐽"]="𫟼",
["鐿"]="镱",
["鑀"]="𰾭",
["鑄"]="铸",
["鑇"]="𬭉",
["鑈"]="鿭",
["鑉"]="𫠁",
["鑊"]="镬",
["鑋"]="𰼻",
["鑌"]="镔",
["鑍"]="𲇑",
["鑏"]="𬬾",
["鑐"]="𰿂",
["鑑"]="鉴",
["鑒"]="鉴",
["鑔"]="镲",
["鑕"]="锧",
["鑖"]="𰿃",
["鑘"]="𰿄",
["鑛"]="矿",
["鑞"]="镴",
["鑠"]="铄",
["鑡"]="𬭔",
["鑢"]="𮣶",
["鑣"]="镳",
["鑤"]="刨",
["鑥"]="镥",
["鑧"]="",
["鑨"]="𰽦",
["鑪"]="𬬻",
["鑭"]="镧",
["鑮"]="𬮁",
["鑯"]="𰿈",
["鑰"]="钥",
["鑱"]="镵",
["鑲"]="镶",
["鑴"]="𫔔",
["鑵"]="罐",
["鑷"]="镊",
["鑸"]="𰿉",
["鑹"]="镩",
["鑼"]="锣",
["鑽"]="钻",
["鑾"]="銮",
["鑿"]="凿",
["钀"]="𰾾",
["钁"]="䦆",
["钂"]="镋",
["钃"]="𰾽",
["長"]="长",
["門"]="门",
["閂"]="闩",
["閃"]="闪",
["閅"]="𮤫",
["閆"]="闫",
["閈"]="闬",
["閉"]="闭",
["開"]="开",
["閌"]="闶",
["閍"]="𨸂",
["閎"]="闳",
["閏"]="闰",
["閐"]="𨸃",
["閑"]="闲",
["閒"]="闲",
["間"]="间",
["閔"]="闵",
["閕"]="𰿩",
["閖"]="𲈵",
["閗"]="𫔯",
["閘"]="闸",
["閙"]="闹",
["閛"]="𰿬",
["閜"]="𬮠",
["閝"]="𫠂",
["閞"]="𫔰",
["閟"]="𮤲",
["閡"]="阂",
["閣"]="阁",
["閤"]="合",
["閥"]="阀",
["閦"]="𬮥",
["閧"]="哄",
["閨"]="闺",
["閩"]="闽",
["閪"]="𲈹",
["閫"]="阃",
["閬"]="阆",
["閭"]="闾",
["閱"]="阅",
["閲"]="阅",
["閵"]="𫔴",
["閶"]="阊",
["閷"]="𰿳",
["閹"]="阉",
["閻"]="阎",
["閼"]="阏",
["閽"]="阍",
["閾"]="阈",
["閿"]="阌",
["闀"]="𲉁",
["闃"]="阒",
["闄"]="𬮲",
["闆"]="板",
["闇"]="暗",
["闈"]="闱",
["闉"]="𬮱",
["闊"]="阔",
["闋"]="阕",
["闌"]="阑",
["闍"]="阇",
["闐"]="阗",
["闑"]="𫔶",
["闒"]="阘",
["闓"]="闿",
["闔"]="阖",
["闕"]="阙",
["闖"]="闯",
["闚"]="窥",
["闛"]="𰿺",
["關"]="关",
["闞"]="阚",
["闟"]="𰿻",
["闠"]="阓",
["闡"]="阐",
["闢"]="辟",
["闤"]="阛",
["闥"]="闼",
["阬"]="坑",
["陘"]="陉",
["陝"]="陕",
["陞"]="升",
["陣"]="阵",
["陯"]="𲉉",
["陰"]="阴",
["陳"]="陈",
["陸"]="陆",
["陻"]="堙",
["陽"]="阳",
["隉"]="陧",
["隊"]="队",
["階"]="阶",
["隑"]="𬮿",
["隕"]="陨",
["隖"]="坞",
["際"]="际",
["隣"]="邻",
["隤"]="𬯎",
["隨"]="随",
["險"]="险",
["隫"]="𱀡",
["隮"]="𬯀",
["隯"]="陦",
["隱"]="隐",
["隴"]="陇",
["隷"]="隶",
["隸"]="隶",
["隻"]="只",
["雋"]="隽",
["雖"]="虽",
["雙"]="双",
["雛"]="雏",
["雜"]="杂",
["雝"]="雍",
["雞"]="鸡",
["離"]="离",
["難"]="难",
["雰"]="氛",
["雲"]="云",
["電"]="电",
["霑"]="沾",
["霢"]="霡",
["霣"]="𫕥",
["霧"]="雾",
["霼"]="𪵣",
["霽"]="霁",
["靂"]="雳",
["靄"]="霭",
["靅"]="𰷦",
["靆"]="叇",
["靈"]="灵",
["靉"]="叆",
["靑"]="青",
["靚"]="靓",
["靜"]="静",
["靝"]="靔",
["靦"]="䩄",
["靧"]="𫖃",
["靨"]="靥",
["靭"]="韧",
["鞀"]="鼗",
["鞏"]="巩",
["鞝"]="绱",
["鞦"]="秋",
["鞸"]="𱁴",
["鞻"]="𱁺",
["鞼"]="𱁹",
["鞽"]="鞒",
["鞾"]="靴",
["鞿"]="𩉜",
["韁"]="缰",
["韃"]="鞑",
["韆"]="千",
["韇"]="𱁷",
["韈"]="袜",
["韉"]="鞯",
["韊"]="𱁾",
["韋"]="韦",
["韌"]="韧",
["韍"]="韨",
["韏"]="𱂇",
["韐"]="𱂆",
["韒"]="𱂉",
["韓"]="韩",
["韔"]="𮧴",
["韗"]="𱂈",
["韘"]="𱂊",
["韙"]="韪",
["韚"]="𫠅",
["韛"]="𫖔",
["韜"]="韬",
["韝"]="𫖕",
["韞"]="韫",
["韠"]="𫖒",
["韡"]="𮧵",
["韢"]="𬰶",
["韣"]="𱂋",
["韮"]="韭",
["韻"]="韵",
["響"]="响",
["頁"]="页",
["頂"]="顶",
["頃"]="顷",
["頄"]="𬱓",
["項"]="项",
["順"]="顺",
["頇"]="顸",
["須"]="须",
["頊"]="顼",
["頌"]="颂",
["頍"]="𫠆",
["頎"]="颀",
["頏"]="颃",
["預"]="预",
["頑"]="顽",
["頒"]="颁",
["頓"]="顿",
["頔"]="𬱖",
["頕"]="𬱗",
["頖"]="𬱙",
["頗"]="颇",
["領"]="领",
["頙"]="𲊺",
["頛"]="𬱜",
["頜"]="颌",
["頞"]="𱂨",
["頟"]="额",
["頠"]="𬱟",
["頡"]="颉",
["頢"]="𬱠",
["頤"]="颐",
["頦"]="颏",
["頩"]="𱂦",
["頪"]="𱂧",
["頫"]="𫖯",
["頭"]="头",
["頮"]="颒",
["頯"]="𱂬",
["頰"]="颊",
["頲"]="颋",
["頳"]="𲊼",
["頴"]="颖",
["頵"]="𫖳",
["頷"]="颔",
["頸"]="颈",
["頹"]="颓",
["頻"]="频",
["頽"]="颓",
["顀"]="𱂭",
["顁"]="𬱫",
["顃"]="𩖖",
["顄"]="𱂰",
["顅"]="𫖶",
["顆"]="颗",
["顇"]="悴",
["顉"]="𰽳",
["顊"]="𬱪",
["顋"]="腮",
["題"]="题",
["額"]="额",
["顎"]="颚",
["顏"]="颜",
["顐"]="𬱢",
["顑"]="𱂱",
["顒"]="颙",
["顓"]="颛",
["顔"]="颜",
["顖"]="𱂶",
["顗"]="𫖮",
["願"]="愿",
["顙"]="颡",
["顛"]="颠",
["顜"]="𱂴",
["顝"]="𱂵",
["類"]="类",
["顠"]="𱂺",
["顢"]="颟",
["顣"]="𫖹",
["顤"]="𱂣",
["顥"]="颢",
["顦"]="憔",
["顧"]="顾",
["顩"]="𱂫",
["顪"]="𱂤",
["顫"]="颤",
["顬"]="颥",
["顮"]="𱂸",
["顯"]="显",
["顰"]="颦",
["顱"]="颅",
["顳"]="颞",
["顴"]="颧",
["風"]="风",
["颩"]="𱃔",
["颬"]="𱃕",
["颭"]="飐",
["颮"]="飑",
["颯"]="飒",
["颰"]="𩙥",
["颱"]="台",
["颲"]="𱃘",
["颳"]="刮",
["颴"]="𬱽",
["颶"]="飓",
["颷"]="𩙪",
["颸"]="飔",
["颹"]="𬱵",
["颺"]="飏",
["颻"]="飖",
["颼"]="飕",
["颽"]="𬱼",
["颾"]="𩙫",
["颿"]="帆",
["飀"]="飗",
["飁"]="𱃟",
["飂"]="𮨵",
["飃"]="飘",
["飄"]="飘",
["飆"]="飙",
["飇"]="𱃠",
["飈"]="飚",
["飉"]="𬲅",
["飊"]="",
["飋"]="𫗋",
["飍"]="𱃝",
["飛"]="飞",
["飠"]="饣",
["飢"]="饥",
["飣"]="饤",
["飥"]="饦",
["飦"]="𫗞",
["飩"]="饨",
["飪"]="饪",
["飫"]="饫",
["飭"]="饬",
["飯"]="饭",
["飱"]="飧",
["飲"]="饮",
["飴"]="饴",
["飵"]="𫗢",
["飶"]="𫗣",
["飷"]="𬲭",
["飼"]="饲",
["飽"]="饱",
["飾"]="饰",
["飿"]="饳",
["餀"]="𮩜",
["餂"]="𱃺",
["餃"]="饺",
["餄"]="饸",
["餅"]="饼",
["餈"]="糍",
["餉"]="饷",
["養"]="养",
["餌"]="饵",
["餎"]="饹",
["餏"]="饻",
["餑"]="饽",
["餒"]="馁",
["餓"]="饿",
["餔"]="𫗦",
["餕"]="馂",
["餖"]="饾",
["餗"]="𫗧",
["餘"]="余",
["餚"]="肴",
["餛"]="馄",
["餜"]="馃",
["餞"]="饯",
["餟"]="𬳂",
["餡"]="馅",
["餣"]="𬲼",
["餤"]="𱃿",
["餦"]="𫗠",
["餧"]="喂",
["館"]="馆",
["餩"]="𱃽",
["餪"]="𫗬",
["餫"]="𫗥",
["餬"]="糊",
["餭"]="𫗮",
["餯"]="𱄄",
["餰"]="𬳆",
["餱"]="糇",
["餲"]="𮩝",
["餳"]="饧",
["餴"]="𱃼",
["餵"]="喂",
["餶"]="馉",
["餷"]="馇",
["餸"]="𩠌",
["餹"]="糖",
["餺"]="馎",
["餻"]="糕",
["餼"]="饩",
["餽"]="馈",
["餾"]="馏",
["餿"]="馊",
["饀"]="𬳊",
["饁"]="馌",
["饃"]="馍",
["饅"]="馒",
["饆"]="𮩛",
["饇"]="𱃲",
["饈"]="馐",
["饉"]="馑",
["饊"]="馓",
["饋"]="馈",
["饌"]="馔",
["饍"]="膳",
["饎"]="𱄆",
["饐"]="𮩞",
["饑"]="饥",
["饒"]="饶",
["饗"]="飨",
["饘"]="𫗴",
["饙"]="𱄀",
["饛"]="𱄈",
["饜"]="餍",
["饝"]="馍",
["饞"]="馋",
["饟"]="饷",
["饠"]="𫗩",
["饡"]="𱄊",
["饢"]="馕",
["馩"]="𬳟",
["馪"]="",
["馬"]="马",
["馭"]="驭",
["馮"]="冯",
["馯"]="𫘛",
["馱"]="驮",
["馲"]="𱄽",
["馳"]="驰",
["馴"]="驯",
["馵"]="𱄼",
["馹"]="驲",
["馺"]="𱅂",
["馼"]="𫘜",
["馽"]="𱅁",
["駁"]="驳",
["駂"]="𱅀",
["駃"]="𫘝",
["駉"]="𬳶",
["駊"]="𫘟",
["駍"]="𬳴",
["駎"]="𩧨",
["駏"]="𱅃",
["駐"]="驻",
["駑"]="驽",
["駒"]="驹",
["駓"]="𬳵",
["駔"]="驵",
["駕"]="驾",
["駖"]="𲌅",
["駗"]="𱅇",
["駘"]="骀",
["駙"]="驸",
["駚"]="𩧫",
["駛"]="驶",
["駜"]="𱅈",
["駝"]="驼",
["駞"]="驼",
["駟"]="驷",
["駡"]="骂",
["駢"]="骈",
["駣"]="𱅏",
["駤"]="𫘠",
["駥"]="𱅉",
["駦"]="𱅑",
["駧"]="𩧲",
["駩"]="𩧴",
["駪"]="𬳽",
["駫"]="𫘡",
["駬"]="𱅋",
["駭"]="骇",
["駮"]="驳",
["駰"]="骃",
["駱"]="骆",
["駴"]="𮪢",
["駶"]="𩧺",
["駷"]="𱅔",
["駸"]="骎",
["駹"]="𮪡",
["駺"]="𬴀",
["駻"]="𫘣",
["駼"]="𬳿",
["駽"]="𱅖",
["駾"]="𱅙",
["駿"]="骏",
["騀"]="𱅗",
["騁"]="骋",
["騂"]="骍",
["騃"]="𫘤",
["騄"]="𫘧",
["騅"]="骓",
["騆"]="",
["騇"]="𱅚",
["騉"]="𫘥",
["騊"]="𫘦",
["騋"]="𱅕",
["騌"]="鬃",
["騍"]="骒",
["騎"]="骑",
["騏"]="骐",
["騐"]="验",
["騑"]="𬴂",
["騔"]="𩨀",
["騕"]="𱅜",
["騖"]="骛",
["騗"]="𱅝",
["騙"]="骗",
["騚"]="𩨊",
["騜"]="𫘩",
["騝"]="𩨃",
["騞"]="𬴃",
["騟"]="𩨈",
["騠"]="𫘨",
["騢"]="𱅞",
["騣"]="鬃",
["騤"]="骙",
["騥"]="𱅟",
["騧"]="䯄",
["騩"]="𱅡",
["騪"]="𩨄",
["騫"]="骞",
["騬"]="𱅢",
["騭"]="骘",
["騮"]="骝",
["騯"]="𬴅",
["騰"]="腾",
["騱"]="𫘬",
["騲"]="𮪤",
["騳"]="𱄿",
["騴"]="𫘫",
["騵"]="𫘪",
["騶"]="驺",
["騷"]="骚",
["騸"]="骟",
["騹"]="𬴆",
["騺"]="𱅊",
["騻"]="𫘭",
["騼"]="𫠋",
["騽"]="𱅩",
["騾"]="骡",
["驀"]="蓦",
["驁"]="骜",
["驂"]="骖",
["驃"]="骠",
["驄"]="骢",
["驅"]="驱",
["驈"]="𱅫",
["驉"]="𱅧",
["驊"]="骅",
["驋"]="𩧯",
["驌"]="骕",
["驍"]="骁",
["驎"]="𬴊",
["驏"]="骣",
["驐"]="𮪥",
["驒"]="𱅛",
["驓"]="𫘯",
["驔"]="𱅪",
["驕"]="骄",
["驖"]="𬴋",
["驗"]="验",
["驘"]="骡",
["驙"]="𫘰",
["驚"]="惊",
["驛"]="驿",
["驞"]="𱅤",
["驟"]="骤",
["驠"]="𱅬",
["驡"]="𱅅",
["驢"]="驴",
["驤"]="骧",
["驥"]="骥",
["驦"]="骦",
["驨"]="𫘱",
["驩"]="欢",
["驪"]="骊",
["驫"]="骉",
["骯"]="肮",
["骽"]="腿",
["骾"]="鲠",
["髈"]="膀",
["髏"]="髅",
["髐"]="𱅮",
["髒"]="脏",
["體"]="体",
["髕"]="髌",
["髖"]="髋",
["髪"]="发",
["髮"]="发",
["鬆"]="松",
["鬉"]="鬃",
["鬍"]="胡",
["鬖"]="𩭹",
["鬗"]="𱆆",
["鬚"]="须",
["鬜"]="𱆁",
["鬞"]="𬴩",
["鬠"]="𫘽",
["鬡"]="𮫂",
["鬢"]="鬓",
["鬥"]="斗",
["鬧"]="闹",
["鬨"]="哄",
["鬩"]="阋",
["鬭"]="斗",
["鬮"]="阄",
["鬱"]="郁",
["鬹"]="鬶",
["鬺"]="𱆌",
["魎"]="魉",
["魗"]="𱆛",
["魘"]="魇",
["魚"]="鱼",
["魛"]="鱽",
["魜"]="𬶁",
["魝"]="𬶀",
["魟"]="𫚉",
["魠"]="𱇏",
["魡"]="𬶄",
["魢"]="鱾",
["魣"]="𮬛",
["魥"]="𩽹",
["魦"]="𫚌",
["魧"]="𱇘",
["魨"]="鲀",
["魪"]="𬶇",
["魫"]="𱇙",
["魬"]="𱇖",
["魭"]="𱇐",
["魮"]="𱇒",
["魯"]="鲁",
["魱"]="𱇓",
["魴"]="鲂",
["魵"]="𫚍",
["魶"]="𱇔",
["魷"]="鱿",
["魺"]="鲄",
["魻"]="𱇟",
["魼"]="𱇜",
["魽"]="𫠐",
["魾"]="𱇝",
["鮀"]="𬶍",
["鮁"]="鲅",
["鮂"]="𱇠",
["鮃"]="鲆",
["鮄"]="𫚒",
["鮅"]="𫚑",
["鮆"]="𫚖",
["鮇"]="𱇛",
["鮈"]="𬶋",
["鮊"]="鲌",
["鮋"]="鲉",
["鮌"]="𱇢",
["鮍"]="鲏",
["鮎"]="鲇",
["鮏"]="𱇡",
["鮐"]="鲐",
["鮑"]="鲍",
["鮒"]="鲋",
["鮓"]="鲊",
["鮕"]="𲍌",
["鮗"]="鿴",
["鮘"]="𬶌",
["鮚"]="鲒",
["鮛"]="𱇨",
["鮜"]="鲘",
["鮝"]="鲞",
["鮞"]="鲕",
["鮟"]="𩽾",
["鮠"]="𬶏",
["鮡"]="𬶐",
["鮣"]="䲟",
["鮤"]="𫚓",
["鮥"]="𱇪",
["鮦"]="鲖",
["鮧"]="𱇧",
["鮨"]="𮬜",
["鮪"]="鲔",
["鮫"]="鲛",
["鮬"]="𱇦",
["鮭"]="鲑",
["鮮"]="鲜",
["鮯"]="𫚗",
["鮰"]="𫚔",
["鮳"]="鲓",
["鮵"]="𫚛",
["鮶"]="鲪",
["鮷"]="𬶕",
["鮸"]="𩾃",
["鮹"]="𱇯",
["鮺"]="鲝",
["鮿"]="𫚚",
["鯀"]="鲧",
["鯁"]="鲠",
["鯄"]="𩾁",
["鯅"]="𱈁",
["鯆"]="𫚙",
["鯇"]="鲩",
["鯈"]="𱇱",
["鯉"]="鲤",
["鯊"]="鲨",
["鯒"]="鲬",
["鯔"]="鲻",
["鯕"]="鲯",
["鯖"]="鲭",
["鯗"]="鲞",
["鯚"]="𱇺",
["鯛"]="鲷",
["鯝"]="鲴",
["鯞"]="𫚡",
["鯠"]="𱇭",
["鯡"]="鲱",
["鯢"]="鲵",
["鯤"]="鲲",
["鯥"]="𱇶",
["鯦"]="𱇼",
["鯧"]="鲳",
["鯨"]="鲸",
["鯩"]="𱇗",
["鯪"]="鲮",
["鯫"]="鲰",
["鯬"]="𫚞",
["鯮"]="𱇾",
["鯰"]="鲶",
["鯱"]="𩾇",
["鯴"]="鲺",
["鯶"]="𩽼",
["鯷"]="鳀",
["鯸"]="𱈄",
["鯻"]="𬶟",
["鯼"]="𱈅",
["鯽"]="鲫",
["鯾"]="𫚣",
["鯿"]="鳊",
["鰁"]="鳈",
["鰂"]="鲗",
["鰃"]="鳂",
["鰅"]="𱈂",
["鰆"]="䲠",
["鰇"]="𬶧",
["鰈"]="鲽",
["鰉"]="鳇",
["鰊"]="𬶠",
["鰋"]="𫚢",
["鰌"]="鳅",
["鰍"]="鳅",
["鰏"]="鲾",
["鰐"]="鳄",
["鰑"]="𫚊",
["鰒"]="鳆",
["鰓"]="鳃",
["鰕"]="𫚥",
["鰗"]="𬶞",
["鰛"]="鳁",
["鰜"]="鳒",
["鰝"]="𱈋",
["鰟"]="鳑",
["鰠"]="鳋",
["鰡"]="𱈊",
["鰣"]="鲥",
["鰤"]="𫚕",
["鰥"]="鳏",
["鰦"]="𫚤",
["鰧"]="䲢",
["鰨"]="鳎",
["鰩"]="鳐",
["鰫"]="𫚦",
["鰬"]="𱈉",
["鰭"]="鳍",
["鰮"]="鳁",
["鰯"]="𱈍",
["鰱"]="鲢",
["鰲"]="鳌",
["鰳"]="鳓",
["鰴"]="𱈑",
["鰵"]="鳘",
["鰶"]="𬶭",
["鰷"]="鲦",
["鰹"]="鲣",
["鰺"]="鲹",
["鰻"]="鳗",
["鰼"]="鳛",
["鰽"]="𫚧",
["鰾"]="鳔",
["鰿"]="𱇵",
["鱀"]="𬶨",
["鱁"]="𱈏",
["鱂"]="鳉",
["鱃"]="𱈌",
["鱄"]="𫚋",
["鱅"]="鳙",
["鱆"]="𫠒",
["鱇"]="𩾌",
["鱈"]="鳕",
["鱉"]="鳖",
["鱊"]="𫚪",
["鱋"]="𬶬",
["鱌"]="𬶲",
["鱍"]="𱇣",
["鱎"]="𱇩",
["鱏"]="𱈓",
["鱐"]="𱇿",
["鱑"]="𬶫",
["鱒"]="鳟",
["鱓"]="鳝",
["鱔"]="鳝",
["鱕"]="𱈕",
["鱖"]="鳜",
["鱗"]="鳞",
["鱘"]="鲟",
["鱙"]="𲍑",
["鱚"]="𬶮",
["鱝"]="鲼",
["鱞"]="𬶵",
["鱟"]="鲎",
["鱠"]="鲙",
["鱢"]="𫚫",
["鱣"]="鳣",
["鱤"]="鳡",
["鱥"]="𮬝",
["鱦"]="𱇸",
["鱧"]="鳢",
["鱨"]="鲿",
["鱬"]="𱈗",
["鱭"]="鲚",
["鱮"]="𫚈",
["鱯"]="鳠",
["鱲"]="𫚭",
["鱴"]="𱈙",
["鱵"]="𮬤",
["鱷"]="鳄",
["鱸"]="鲈",
["鱹"]="𬶺",
["鱺"]="鲡",
["鱻"]="鲜",
["鳥"]="鸟",
["鳦"]="𱉇",
["鳧"]="凫",
["鳩"]="鸠",
["鳬"]="凫",
["鳭"]="𱉈",
["鳱"]="𱉊",
["鳲"]="鸤",
["鳳"]="凤",
["鳴"]="鸣",
["鳶"]="鸢",
["鳷"]="𫛛",
["鳸"]="𱉓",
["鳺"]="𱉎",
["鳻"]="𱉑",
["鳼"]="𪉃",
["鳽"]="𫛚",
["鳾"]="䴓",
["鳿"]="𱉍",
["鴀"]="𫛜",
["鴁"]="𮭢",
["鴂"]="𱉔",
["鴃"]="𫛞",
["鴅"]="𫛝",
["鴆"]="鸩",
["鴇"]="鸨",
["鴉"]="鸦",
["鴋"]="𲍮",
["鴍"]="𬸀",
["鴐"]="𫛤",
["鴒"]="鸰",
["鴓"]="𮭤",
["鴔"]="𫛡",
["鴕"]="鸵",
["鴗"]="𫁡",
["鴘"]="𱉡",
["鴙"]="𱉛",
["鴚"]="𱉕",
["鴛"]="鸳",
["鴝"]="鸲",
["鴞"]="鸮",
["鴟"]="鸱",
["鴠"]="𱉗",
["鴡"]="𱉘",
["鴢"]="𱉢",
["鴣"]="鸪",
["鴥"]="𫛣",
["鴦"]="鸯",
["鴨"]="鸭",
["鴩"]="𱉚",
["鴫"]="",
["鴬"]="鸴",
["鴮"]="𫛦",
["鴯"]="鸸",
["鴰"]="鸹",
["鴱"]="𱉪",
["鴲"]="𪉆",
["鴳"]="𫛩",
["鴴"]="鸻",
["鴶"]="𱉥",
["鴷"]="䴕",
["鴸"]="𱉫",
["鴹"]="𱉯",
["鴺"]="𱉩",
["鴻"]="鸿",
["鴽"]="𫛪",
["鴾"]="𱉲",
["鴿"]="鸽",
["鵀"]="𬸊",
["鵁"]="䴔",
["鵂"]="鸺",
["鵃"]="鸼",
["鵄"]="𬸈",
["鵅"]="𱉮",
["鵉"]="鸾",
["鵊"]="𫛥",
["鵋"]="𱉽",
["鵌"]="𱉸",
["鵎"]="𱉻",
["鵏"]="𬷕",
["鵐"]="鹀",
["鵑"]="鹃",
["鵒"]="鹆",
["鵓"]="鹁",
["鵔"]="𱉿",
["鵕"]="𱉾",
["鵖"]="𱉝",
["鵗"]="𱉹",
["鵙"]="𱉐",
["鵚"]="𪉍",
["鵛"]="𱉠",
["鵜"]="鹈",
["鵝"]="鹅",
["鵞"]="鹅",
["鵟"]="𫛭",
["鵠"]="鹄",
["鵡"]="鹉",
["鵧"]="𫛨",
["鵩"]="𫛳",
["鵪"]="鹌",
["鵫"]="𫛱",
["鵬"]="鹏",
["鵮"]="鹐",
["鵯"]="鹎",
["鵰"]="雕",
["鵱"]="𱊀",
["鵲"]="鹊",
["鵳"]="𱊋",
["鵴"]="𱊇",
["鵵"]="𱊆",
["鵶"]="鸦",
["鵷"]="鹓",
["鵸"]="𱊁",
["鵹"]="𱊃",
["鵻"]="𱊅",
["鵼"]="𱊊",
["鵽"]="𱊍",
["鵾"]="鹍",
["鶀"]="𬸒",
["鶂"]="𱊈",
["鶃"]="𱊄",
["鶄"]="䴖",
["鶅"]="𱊎",
["鶆"]="𱉵",
["鶇"]="鸫",
["鶉"]="鹑",
["鶊"]="鹒",
["鶋"]="𱊌",
["鶌"]="𫛵",
["鶒"]="𫛶",
["鶓"]="鹋",
["鶔"]="𱊗",
["鶖"]="鹙",
["鶗"]="𫛸",
["鶘"]="鹕",
["鶙"]="𱊕",
["鶚"]="鹗",
["鶛"]="𱊐",
["鶝"]="𱊏",
["鶞"]="𱊑",
["鶟"]="𱊖",
["鶠"]="𬸘",
["鶡"]="鹖",
["鶢"]="𱊒",
["鶣"]="𬸜",
["鶤"]="𱉱",
["鶥"]="鹛",
["鶦"]="𫛷",
["鶧"]="𲎀",
["鶨"]="𱊘",
["鶩"]="鹜",
["鶪"]="䴗",
["鶬"]="鸧",
["鶭"]="𫛯",
["鶯"]="莺",
["鶰"]="𫛫",
["鶱"]="𬸣",
["鶲"]="鹟",
["鶴"]="鹤",
["鶵"]="𬸅",
["鶶"]="𱊝",
["鶷"]="𱊟",
["鶹"]="鹠",
["鶺"]="鹡",
["鶻"]="鹘",
["鶼"]="鹣",
["鶽"]="𱊛",
["鶿"]="鹚",
["鷀"]="鹚",
["鷁"]="鹢",
["鷂"]="鹞",
["鷃"]="𮭨",
["鷄"]="鸡",
["鷅"]="𫛽",
["鷇"]="𬆮",
["鷉"]="䴘",
["鷊"]="鹝",
["鷋"]="𱊠",
["鷌"]="𲍬",
["鷎"]="𬸢",
["鷏"]="𱊚",
["鷐"]="𫜀",
["鷑"]="𱊢",
["鷒"]="𱉏",
["鷓"]="鹧",
["鷔"]="𪉑",
["鷕"]="𱊡",
["鷖"]="鹥",
["鷗"]="鸥",
["鷙"]="鸷",
["鷚"]="鹨",
["鷛"]="𱊤",
["鷜"]="𬸞",
["鷝"]="𲍴",
["鷞"]="𮭪",
["鷟"]="𬸦",
["鷢"]="𱊧",
["鷣"]="𫜃",
["鷤"]="𫛴",
["鷥"]="鸶",
["鷦"]="鹪",
["鷨"]="𪉊",
["鷩"]="𫜁",
["鷫"]="鹔",
["鷭"]="𬸪",
["鷮"]="𱉬",
["鷯"]="鹩",
["鷰"]="燕",
["鷲"]="鹫",
["鷳"]="鹇",
["鷴"]="鹇",
["鷵"]="𱊩",
["鷶"]="𱉳",
["鷷"]="𫜄",
["鷸"]="鹬",
["鷹"]="鹰",
["鷺"]="鹭",
["鷼"]="𲍻",
["鷽"]="鸴",
["鷾"]="𱊰",
["鷿"]="䴙",
["鸀"]="𱊬",
["鸁"]="𱊮",
["鸂"]="㶉",
["鸃"]="𱉌",
["鸄"]="𱊯",
["鸅"]="𱉟",
["鸆"]="𱊫",
["鸇"]="鹯",
["鸉"]="𱉴",
["鸊"]="䴙",
["鸋"]="𫛢",
["鸌"]="鹱",
["鸍"]="𲍰",
["鸎"]="莺",
["鸏"]="鹲",
["鸐"]="𱊱",
["鸑"]="𬸚",
["鸓"]="𱊳",
["鸕"]="鸬",
["鸗"]="𫛟",
["鸘"]="鹴",
["鸙"]="𱊵",
["鸚"]="鹦",
["鸛"]="鹳",
["鸜"]="𬸱",
["鸝"]="鹂",
["鸞"]="鸾",
["鹵"]="卤",
["鹹"]="咸",
["鹺"]="鹾",
["鹼"]="碱",
["鹽"]="盐",
["麐"]="麟",
["麗"]="丽",
["麞"]="獐",
["麡"]="𬸾",
["麥"]="麦",
["麧"]="𱋇",
["麨"]="𪎊",
["麩"]="麸",
["麪"]="面",
["麫"]="面",
["麬"]="𤿲",
["麭"]="𮮆",
["麮"]="𱋋",
["麯"]="曲",
["麰"]="𮮇",
["麱"]="𱋖",
["麳"]="𪎌",
["麴"]="曲",
["麵"]="面",
["麷"]="𫜑",
["麼"]="么",
["麽"]="么",
["黂"]="𱋱",
["黃"]="黄",
["黌"]="黉",
["點"]="点",
["黨"]="党",
["黲"]="黪",
["黴"]="霉",
["黶"]="黡",
["黷"]="黩",
["黸"]="𱋶",
["黽"]="黾",
["黿"]="鼋",
["鼀"]="𱋾",
["鼁"]="𱋿",
["鼂"]="鼌",
["鼄"]="𬹣",
["鼅"]="𱌄",
["鼆"]="𱌆",
["鼇"]="鳌",
["鼈"]="鳖",
["鼉"]="鼍",
["鼊"]="𱌉",
["鼕"]="冬",
["鼚"]="𱌊",
["鼲"]="𱌏",
["鼴"]="鼹",
["齈"]="𱌖",
["齊"]="齐",
["齋"]="斋",
["齌"]="𱌗",
["齍"]="𱌘",
["齎"]="赍",
["齏"]="齑",
["齒"]="齿",
["齔"]="龀",
["齕"]="龁",
["齖"]="𬹺",
["齗"]="龂",
["齘"]="𬹼",
["齙"]="龅",
["齚"]="𱌬",
["齜"]="龇",
["齝"]="𱌯",
["齞"]="𱌫",
["齟"]="龃",
["齠"]="龆",
["齡"]="龄",
["齣"]="出",
["齤"]="𱌲",
["齥"]="𱌱",
["齦"]="龈",
["齧"]="啮",
["齩"]="咬",
["齪"]="龊",
["齬"]="龉",
["齭"]="𫜭",
["齮"]="𬺈",
["齯"]="𫠜",
["齰"]="𫜬",
["齱"]="𱌶",
["齲"]="龋",
["齳"]="𱌳",
["齴"]="𫜮",
["齵"]="𱌹",
["齶"]="腭",
["齷"]="龌",
["齸"]="𱌽",
["齹"]="𬺎",
["齺"]="𱌭",
["齻"]="𱌺",
["齼"]="𬺓",
["齽"]="𬺔",
["齾"]="𫜰",
["龍"]="龙",
["龎"]="厐",
["龏"]="𱍁",
["龐"]="庞",
["龑"]="䶮",
["龓"]="𫜲",
["龔"]="龚",
["龕"]="龛",
["龖"]="𱍂",
["龘"]="",
["龜"]="龟",
["龝"]="秋",
["龞"]="𱍈",
["龥"]="𬱳",
["龭"]="𩨎",
["龯"]="𨱆",
["龲"]="𰾋",
["龻"]="𰁜",
["龽"]="𰞳",
["鿁"]="䜤",
["鿂"]="",
["鿐"]="䲤",
["鿓"]="鿒",
["鿠"]="鿟",
["鿳"]="鿸",
["𠁞"]="𠀾",
["𠅀"]="",
["𠌥"]="𠆿",
["𠏄"]="",
["𠐊"]="𫝋",
["𠐮"]="𬾣",
["𠖥"]="",
["𠙦"]="䒮",
["𠠜"]="𫦕",
["𠠫"]="𰄭",
["𠼤"]="𫪄",
["𠼮"]="𫩳",
["𡂿"]="𫪘",
["𡃈"]="𰈮",
["𡃤"]="𪢐",
["𡅘"]="𭊸",
["𡑍"]="𫭼",
["𡑑"]="",
["𡔖"]="𡍣",
["𡞵"]="㛟",
["𡟫"]="𫝪",
["𡠪"]="",
["𡠹"]="㛿",
["𡡤"]="𡚫",
["𡢃"]="㛠",
["𡢄"]="",
["𡢅"]="妘",
["𡢿"]="𭑸",
["𡣙"]="𱙑",
["𡤅"]="媇",
["𡤢"]="",
["𡤶"]="",
["𡷨"]="𫵸",
["𡷹"]="𱛊",
["𡺨"]="𫵶",
["𡽳"]="𫶊",
["𢄋"]="𦭬",
["𢅡"]="𫷌",
["𢍰"]="𪪴",
["𢊃"]="𰏽",
["𢐟"]="",
["𢜟"]="𰑂",
["𢞁"]="",
["𢡠"]="怾",
["𢯩"]="𫼤",
["𢰸"]="𱟽",
["𢲩"]="𫼾",
["𢲸"]="𫼵",
["𢳂"]="𫼣",
["𢷮"]="𢫊",
["𢺳"]="𪮳",
["𣂈"]="𦮜",
["𣋪"]="",
["𣍐"]="𫧃",
["𣎟"]="𫞅",
["𣞁"]="㮠",
["𣠩"]="𣞎",
["𣫒"]="𫶲",
["𣯩"]="𣯣",
["𣵾"]="",
["𣷣"]="𱥵",
["𣼼"]="",
["𣾷"]="㳢",
["𣿭"]="",
["𤁐"]="",
["𤃡"]="𱩂",
["𤄙"]="𰝞",
["𤅊"]="",
["𤅶"]="𣷷",
["𤅷"]="𰛻",
["𤆼"]="",
["𤇾"]="𫇦",
["𤋮"]="熙",
["𤎤"]="𬝃",
["𤎽"]="𱫜",
["𤏩"]="",
["𤏪"]="𱫊",
["𤏳"]="",
["𤑚"]="",
["𤑳"]="𤎻",
["𤒎"]="𤊀",
["𤒨"]="",
["𤓓"]="𬊜",
["𤓩"]="𤊰",
["𤚴"]="",
["𤛮"]="𤙯",
["𤛱"]="𫞢",
["𤜆"]="𪺪",
["𤢟"]="𤝢",
["𤥵"]="",
["𤦎"]="",
["𤦩"]="",
["𤦹"]="𱮺",
["𤧑"]="",
["𤧸"]="",
["𤩂"]="𫞧",
["𤩊"]="",
["𤩑"]="",
["𤩝"]="",
["𤪤"]="𪛞",
["𤪥"]="𬍜",
["𤪺"]="㻘",
["𤫎"]="",
["𤫟"]="",
["𤫩"]="㻏",
["𤬏"]="𱰆",
["𤸫"]="𤶧",
["𤾉"]="𰤓",
["𥀬"]="𪠏",
["𥂸"]="𬐠",
["𥉸"]="𰥣",
["𥋟"]="",
["𥔬"]="",
["𥕥"]="𥐰",
["𥖏"]="𮀪",
["𥗽"]="𬒗",
["𥚗"]="",
["𥢶"]="𫞷",
["𥣻"]="𦼖",
["𥯤"]="𫁳",
["𥲻"]="纂",
["𥵃"]="𥱔",
["𥺼"]="𮇔",
["𥼶"]="𬖘",
["𥼽"]="𥹥",
["𥿑"]="",
["𥿡"]="𱺙",
["𦆭"]="𱺖",
["𦆲"]="𫟇",
["𦜖"]="𬁺",
["𦝛"]="",
["𦠅"]="𫞅",
["𦠜"]="𱼇",
["𦡶"]="𰯂",
["𦢈"]="𣍨",
["𦣇"]="𬂂",
["𦥯"]="𰃮",
["𦦗"]="栄",
["𦧺"]="𫇘",
["𦳝"]="𰰢",
["𦻖"]="𱽾",
["𦾉"]="莺",
["𦾵"]="𦴇",
["𦿭"]="",
["𧀀"]="",
["𧂂"]="",
["𧐱"]="𬟺",
["𧒄"]="𱿧",
["𧖦"]="𬠱",
["𧜘"]="",
["𧜵"]="䙊",
["𧜶"]="𮖃",
["𧝞"]="䘛",
["𧞅"]="𰳻",
["𧞫"]="𫌋",
["𧟌"]="𬡠",
["𧠳"]="",
["𧢝"]="𲁔",
["𧥺"]="𬣝",
["𧦵"]="",
["𧧝"]="𬣨",
["𧧸"]="𰵬",
["𧨊"]="𬣶",
["𧨾"]="𬤂",
["𧩎"]="",
["𧩙"]="䜥",
["𧭈"]="𲂇",
["𧭥"]="",
["𧰎"]="鿲",
["𧵳"]="䞌",
["𧶄"]="𬥷",
["𧶽"]="𰷟",
["𧸦"]="𬥾",
["𧼮"]="𬦅",
["𨂐"]="𫏌",
["𨆅"]="𬦫",
["𨆉"]="𮛗",
["𨆪"]="𫏕",
["𨇗"]="𬦣",
["𨈆"]="𬧛",
["𨈇"]="𬦾",
["𨈊"]="𨂺",
["𨈌"]="𨄄",
["𨉖"]="𰿰",
["𨊛"]="𲄙",
["𨊸"]="䢁",
["𨋢"]="䢂",
["𨎮"]="𨐉",
["𨌄"]="𬨋",
["𨍶"]="荤",
["𨏊"]="𰹾",
["𨘀"]="",
["𨞪"]="𫜷",
["𨞺"]="𫟫",
["𨟊"]="𫟬",
["𨟑"]="",
["𨣃"]="𰼋",
["𨣨"]="𰼏",
["𨤋"]="𬪯",
["𨤡"]="𬪺",
["𨥈"]="",
["𨥉"]="𲇯",
["𨥕"]="",
["𨥤"]="",
["𨥭"]="",
["𨥮"]="",
["𨦍"]="",
["𨦡"]="𰽽",
["𨦫"]="䦀",
["𨧀"]="𬭊",
["𨧜"]="䦁",
["𨧰"]="𫟽",
["𨨏"]="𬭛",
["𨨩"]="𲈅",
["𨩃"]="",
["𨩎"]="",
["𨩰"]="𫟾",
["𨪃"]="𲈏",
["𨪜"]="",
["𨪦"]="",
["𨫀"]="𬭫",
["𨫋"]="",
["𨫼"]="𰾧",
["𨬫"]="",
["𨭆"]="𬭶",
["𨭌"]="𬭵",
["𨭎"]="𬭳",
["𨭐"]="𬭙",
["𨭥"]="𬬼",
["𨮪"]="",
["𨯂"]="",
["𨯅"]="䥿",
["𨯗"]="",
["𨯵"]="𬮀",
["𨰃"]="𫔉",
["𨰘"]="",
["𨰲"]="𫔃",
["𨰹"]="𰿀",
["𨳒"]="𮤭",
["𨽻"]="隶",
["𩉍"]="𬰣",
["𩋬"]="𱁱",
["𩍜"]="𱁳",
["𩏪"]="𩏽",
["𩐳"]="",
["𩓐"]="脖",
["𩓥"]="𫖵",
["𩔐"]="",
["𩖰"]="𫠇",
["𩗗"]="飓",
["𩗩"]="",
["𩗴"]="𫗉",
["𩗺"]="",
["𩛩"]="𩠃",
["𩛲"]="𬲹",
["𩜠"]="𬲿",
["𩞃"]="𬲰",
["𩞘"]="𬳏",
["𩟗"]="𫗚",
["𩢀"]="",
["𩢖"]="",
["𩣑"]="䯃",
["𩣺"]="𩧼",
["𩤅"]="𲌉",
["𩥅"]="𱅣",
["𩥇"]="𩨍",
["𩥈"]="",
["𩥉"]="𩧱",
["𩦠"]="𫠌",
["𩧉"]="𱄾",
["𩭙"]="𩬣",
["𩰹"]="𩰰",
["𩴵"]="𩴌",
["𩵚"]="𬶂",
["𩵦"]="𫠏",
["𩵩"]="𩽺",
["𩵳"]="",
["𩶘"]="䲞",
["𩷓"]="鿵",
["𩷕"]="鿶",
["𩷶"]="𱇮",
["𩸆"]="𬶖",
["𩹎"]="鿷",
["𩿅"]="𫠖",
["𩿞"]="𲍱",
["𪀦"]="𪉅",
["𪁎"]="𲍸",
["𪁜"]="𬸏",
["𪂇"]="𲍽",
["𪄳"]="鿺",
["𪆫"]="𱊨",
["𪆰"]="𬸭",
["𪆴"]="𬸮",
["𪇖"]="𬸡",
["𪈔"]="𱊉",
["𪋿"]="𫧮",
["𪍑"]="𱋢",
["𪕣"]="𬹭",
["𪗋"]="𱌙",
["𪗪"]="𬹿",
["𪗳"]="𬹾",
["𪗽"]="𬺄",
["𪘁"]="𲎨",
["𪘥"]="𱌸",
["𪘨"]="𱌴",
["𪘬"]="𱌷",
["𪘯"]="𪚐",
["𪘲"]="𬺌",
["𪙉"]="𱌼",
["𪚅"]="𬺖",
["𪝼"]="𱏆",
["𪣷"]="",
["𪦯"]="",
["𪳷"]="𬂱",
["𪼑"]="",
["𪼞"]="",
["𪾳"]="",
["𫃑"]="𰪿",
["𫃻"]="",
["𫒊"]="",
["𫒋"]="",
["𫒟"]="",
["𫓔"]="",
["𫘋"]="",
["𫝑"]="势",
["𫟰"]="铛",
["𫣴"]="𫢲",
["𫦸"]="𫦰",
["𫶦"]="𫶄",
["𫺤"]="",
["𬅁"]="",
["𬉧"]="鿰",
["𬊿"]="",
["𬎟"]="",
["𬕜"]="",
["𬗈"]="",
["𬞼"]="",
["𬠰"]="蛍",
["𬣘"]="𬤗",
["𬫉"]="",
["𬫍"]="",
["𬮍"]="𮤷",
["𬵨"]="鿹",
["𬷈"]="",
["𭃶"]="𰄝",
["𭜼"]="",
["𭶙"]="𤇻",
["𮌲"]="𭨶",
["𮚫"]="",
["𮢅"]="",
["𮢆"]="",
["𮢽"]="",
[""]="𪣑",
[""]="𱙋",
[""]="𪨇",
[""]="𲋢",
["𰯲"]="𰀢",
["𰻞"]="𰻝",
["𱆥"]="鿕",
["𱇋"]="𬶥",
["𱵭"]="",
["吿"]="告",
["𩒺"]="𱂩",
["𥍉"]="𱳅",
["轝"]="𬛼",
["𫙱"]="𲍘",
["壗"]="𡋤",
["𰔫"]="𫽫",
}
idcrp1g5ryqtbwuy0ncqibbst1e4sfl
मॉड्यूल:zh/data/st
828
306747
487888
487138
2026-09-03T10:36:15Z
SM7
6218
updating...
487888
Scribunto
text/plain
return {
["㐷"]="傌",
["㐽"]="偑",
["㑇"]="㑳",
["㑈"]="倲",
["㑔"]="㑯",
["㑩"]="儸",
["㓥"]="劏",
["㔉"]="劚",
["㖊"]="噚",
["㖞"]="喎",
["㘎"]="㘚",
["㚯"]="㜄",
["㛀"]="媰",
["㛟"]="𡞵",
["㛠"]="𡢃",
["㛣"]="㜏",
["㛤"]="孋",
["㛿"]="𡠹",
["㟆"]="㠏",
["㟥"]="嵾",
["㡎"]="幓",
["㤖"]="懧",
["㤘"]="㥮",
["㤭"]="憍",
["㤽"]="懤",
["㥪"]="慺",
["㧏"]="掆",
["㧐"]="㩳",
["㧑"]="撝",
["㧛"]="擥",
["㧟"]="擓",
["㧰"]="擽",
["㨫"]="㩜",
["㭎"]="棡",
["㭏"]="椲",
["㭤"]="樢",
["㭴"]="樫",
["㮠"]="𣞁",
["㱩"]="殰",
["㱮"]="殨",
["㲿"]="瀇",
["㳔"]="濧",
["㳠"]="澾",
["㳡"]="濄",
["㳢"]="𣾷",
["㴋"]="潚",
["㶉"]="鸂",
["㶶"]="燶",
["㶽"]="煱",
["㺍"]="獱",
["㻅"]="璯",
["㻏"]="𤫩",
["㻘"]="𤪺",
["䀥"]="䁻",
["䁖"]="瞜",
["䂵"]="碽",
["䃅"]="磾",
["䅉"]="稏",
["䅟"]="穇",
["䇲"]="筴",
["䉤"]="籔",
["䌶"]="䊷",
["䌷"]="紬",
["䌸"]="縳",
["䌹"]="絅",
["䌺"]="䋙",
["䌻"]="䋚",
["䌼"]="綐",
["䌽"]="綵",
["䌾"]="䋻",
["䌿"]="䋹",
["䍀"]="繿",
["䍁"]="繸",
["䎬"]="䎱",
["䏝"]="膞",
["䒠"]="蘴",
["䒮"]="𠙦",
["䒿"]="膋",
["䓓"]="薵",
["䓖"]="藭",
["䓨"]="罃",
["䗖"]="螮",
["䘛"]="𧝞",
["䙊"]="𧜵",
["䙌"]="䙡",
["䙓"]="襬",
["䛓"]="譼",
["䜣"]="訢",
["䜤"]="鿁",
["䜥"]="𧩙",
["䜧"]="䜀",
["䜩"]="讌",
["䝙"]="貙",
["䞌"]="𧵳",
["䞍"]="䝼",
["䞐"]="賰",
["䟢"]="躎",
["䢁"]="𨊸",
["䢂"]="𨋢",
["䥺"]="釾",
["䥽"]="鏺",
["䥾"]="䥱",
["䥿"]="𨯅",
["䦀"]="𨦫",
["䦁"]="𨧜",
["䦂"]="䥇",
["䦃"]="鐯",
["䦅"]="鐥",
["䦆"]="钁",
["䦶"]="䦛",
["䦷"]="䦟",
["䯃"]="𩣑",
["䯄"]="騧",
["䯅"]="䯀",
["䲝"]="䱽",
["䲞"]="𩶘",
["䲟"]="鮣",
["䲠"]="鰆",
["䲡"]="鰌",
["䲢"]="鰧",
["䲣"]="䱷",
["䲤"]="鿐",
["䴓"]="鳾",
["䴔"]="鵁",
["䴕"]="鴷",
["䴖"]="鶄",
["䴗"]="鶪",
["䴘"]="鷉",
["䴙"]="鷿",
["䶮"]="龑",
["万"]="萬",
["与"]="與",
["专"]="專",
["业"]="業",
["丛"]="叢",
["东"]="東",
["丝"]="絲",
["丢"]="丟",
["两"]="兩",
["严"]="嚴",
["丧"]="喪",
["个"]="個",
["丰"]="豐",
["临"]="臨",
["为"]="為",
["丽"]="麗",
["举"]="舉",
["么"]="麼",
["义"]="義",
["乌"]="烏",
["乐"]="樂",
["乔"]="喬",
["习"]="習",
["乡"]="鄉",
["书"]="書",
["买"]="買",
["乱"]="亂",
["争"]="爭",
["于"]="於",
["亏"]="虧",
["云"]="雲",
["亘"]="亙",
["亚"]="亞",
["产"]="產",
["亩"]="畝",
["亲"]="親",
["亵"]="褻",
["亸"]="嚲",
["亿"]="億",
["仅"]="僅",
["仆"]="僕",
["仉"]="僟",
["从"]="從",
["仑"]="侖",
["仓"]="倉",
["仪"]="儀",
["们"]="們",
["价"]="價",
["众"]="眾",
["优"]="優",
["伙"]="夥",
["会"]="會",
["伛"]="傴",
["伞"]="傘",
["伟"]="偉",
["传"]="傳",
["伡"]="俥",
["伣"]="俔",
["伤"]="傷",
["伥"]="倀",
["伦"]="倫",
["伧"]="傖",
["伪"]="偽",
["伫"]="佇",
["佇"]="儜",
["体"]="體",
["余"]="餘",
["佣"]="傭",
["佥"]="僉",
["侄"]="姪",
["侠"]="俠",
["侣"]="侶",
["侥"]="僥",
["侦"]="偵",
["侧"]="側",
["侨"]="僑",
["侩"]="儈",
["侪"]="儕",
["侬"]="儂",
["侭"]="儘",
["俣"]="俁",
["俦"]="儔",
["俨"]="儼",
["俩"]="倆",
["俪"]="儷",
["俫"]="倈",
["俭"]="儉",
["债"]="債",
["倾"]="傾",
["偬"]="傯",
["偻"]="僂",
["偾"]="僨",
["偿"]="償",
["傤"]="儎",
["傥"]="儻",
["傧"]="儐",
["储"]="儲",
["傩"]="儺",
["儿"]="兒",
["兑"]="兌",
["兖"]="兗",
["党"]="黨",
["兰"]="蘭",
["关"]="關",
["兴"]="興",
["兹"]="茲",
["养"]="養",
["兽"]="獸",
["冁"]="囅",
["内"]="內",
["冈"]="岡",
["册"]="冊",
["写"]="寫",
["军"]="軍",
["农"]="農",
["冯"]="馮",
["冲"]="沖",
["决"]="決",
["况"]="況",
["冻"]="凍",
["净"]="淨",
["凄"]="淒",
["准"]="準",
["凉"]="涼",
["凌"]="淩",
["减"]="減",
["凑"]="湊",
["凛"]="凜",
["几"]="幾",
["凤"]="鳳",
["凫"]="鳧",
["凭"]="憑",
["凯"]="凱",
["凶"]="兇",
["击"]="擊",
["凿"]="鑿",
["刍"]="芻",
["划"]="劃",
["刘"]="劉",
["则"]="則",
["刚"]="剛",
["创"]="創",
["删"]="刪",
["别"]="別",
["刬"]="剗",
["刭"]="剄",
["刹"]="剎",
["刽"]="劊",
["刾"]="㓨",
["刿"]="劌",
["剀"]="剴",
["剂"]="劑",
["剐"]="剮",
["剑"]="劍",
["剥"]="剝",
["剧"]="劇",
["剿"]="勦",
["劝"]="勸",
["办"]="辦",
["务"]="務",
["劢"]="勱",
["动"]="動",
["励"]="勵",
["劲"]="勁",
["劳"]="勞",
["势"]="勢",
["勋"]="勛",
["勚"]="勩",
["匀"]="勻",
["匦"]="匭",
["匮"]="匱",
["区"]="區",
["医"]="醫",
["华"]="華",
["协"]="協",
["单"]="單",
["卖"]="賣",
["占"]="佔",
["卢"]="盧",
["卤"]="鹵",
["卧"]="臥",
["卫"]="衛",
["却"]="卻",
["厂"]="廠",
["厅"]="廳",
["历"]="歷",
["厉"]="厲",
["压"]="壓",
["厌"]="厭",
["厍"]="厙",
["厐"]="龎",
["厕"]="廁",
["厢"]="廂",
["厣"]="厴",
["厦"]="廈",
["厨"]="廚",
["厩"]="廄",
["厮"]="廝",
["县"]="縣",
["参"]="參",
["叆"]="靉",
["叇"]="靆",
["双"]="雙",
["发"]="發",
["变"]="變",
["叙"]="敘",
["叠"]="疊",
["台"]="臺",
["叶"]="葉",
["号"]="號",
["叹"]="嘆",
["叽"]="嘰",
["吁"]="籲",
["后"]="後",
["吓"]="嚇",
["吕"]="呂",
["吗"]="嗎",
["吣"]="唚",
["吨"]="噸",
["听"]="聽",
["启"]="啟",
["吴"]="吳",
["呐"]="吶",
["呒"]="嘸",
["呓"]="囈",
["呕"]="嘔",
["呖"]="嚦",
["呗"]="唄",
["员"]="員",
["呙"]="咼",
["呛"]="嗆",
["呜"]="嗚",
["咏"]="詠",
["咙"]="嚨",
["咛"]="嚀",
["咝"]="噝",
["咸"]="鹹",
["响"]="響",
["哑"]="啞",
["哒"]="噠",
["哓"]="嘵",
["哔"]="嗶",
["哕"]="噦",
["哗"]="嘩",
["哙"]="噲",
["哜"]="嚌",
["哝"]="噥",
["哟"]="喲",
["唛"]="嘜",
["唝"]="嗊",
["唠"]="嘮",
["唡"]="啢",
["唢"]="嗩",
["唤"]="喚",
["啧"]="嘖",
["啬"]="嗇",
["啭"]="囀",
["啮"]="嚙",
["啯"]="嘓",
["啰"]="囉",
["啴"]="嘽",
["啸"]="嘯",
["喂"]="餵",
["喧"]="諠",
["喷"]="噴",
["喽"]="嘍",
["喾"]="嚳",
["嗫"]="囁",
["嗳"]="噯",
["嘘"]="噓",
["嘤"]="嚶",
["嘱"]="囑",
["嘻"]="譆",
["噜"]="嚕",
["嚣"]="囂",
["团"]="團",
["园"]="園",
["囱"]="囪",
["围"]="圍",
["囵"]="圇",
["国"]="國",
["图"]="圖",
["圆"]="圓",
["圣"]="聖",
["圹"]="壙",
["场"]="場",
["坏"]="壞",
["块"]="塊",
["坚"]="堅",
["坛"]="壇",
["坜"]="壢",
["坝"]="壩",
["坞"]="塢",
["坟"]="墳",
["坠"]="墜",
["垄"]="壟",
["垅"]="壠",
["垆"]="壚",
["垒"]="壘",
["垦"]="墾",
["垩"]="堊",
["垫"]="墊",
["垭"]="埡",
["垯"]="墶",
["垱"]="壋",
["垲"]="塏",
["垴"]="堖",
["埘"]="塒",
["埙"]="塤",
["埚"]="堝",
["堑"]="塹",
["堕"]="墮",
["塆"]="壪",
["墙"]="牆",
["壮"]="壯",
["声"]="聲",
["壳"]="殼",
["壶"]="壺",
["壸"]="壼",
["处"]="處",
["备"]="備",
["复"]="復",
["够"]="夠",
["头"]="頭",
["夸"]="誇",
["夹"]="夾",
["夺"]="奪",
["奁"]="奩",
["奂"]="奐",
["奋"]="奮",
["奖"]="獎",
["奥"]="奧",
["奸"]="姦",
["妆"]="妝",
["妇"]="婦",
["妈"]="媽",
["妩"]="嫵",
["妪"]="嫗",
["妫"]="媯",
["姗"]="姍",
["姹"]="奼",
["娄"]="婁",
["娅"]="婭",
["娆"]="嬈",
["娇"]="嬌",
["娈"]="孌",
["娱"]="娛",
["娲"]="媧",
["娴"]="嫻",
["婳"]="嫿",
["婴"]="嬰",
["婵"]="嬋",
["婶"]="嬸",
["媪"]="媼",
["媭"]="嬃",
["嫒"]="嬡",
["嫔"]="嬪",
["嫱"]="嬙",
["嬷"]="嬤",
["孙"]="孫",
["学"]="學",
["孪"]="孿",
["宁"]="寧",
["宝"]="寶",
["实"]="實",
["宠"]="寵",
["审"]="審",
["宪"]="憲",
["宫"]="宮",
["宽"]="寬",
["宾"]="賓",
["寝"]="寢",
["对"]="對",
["寻"]="尋",
["导"]="導",
["寿"]="壽",
["将"]="將",
["尔"]="爾",
["尘"]="塵",
["尝"]="嘗",
["尧"]="堯",
["尴"]="尷",
["尸"]="屍",
["尽"]="盡",
["层"]="層",
["屃"]="屭",
["屉"]="屜",
["届"]="屆",
["属"]="屬",
["屡"]="屢",
["屦"]="屨",
["屿"]="嶼",
["岁"]="歲",
["岂"]="豈",
["岖"]="嶇",
["岗"]="崗",
["岘"]="峴",
["岙"]="嶴",
["岚"]="嵐",
["岛"]="島",
["岭"]="嶺",
["岽"]="崬",
["岿"]="巋",
["峃"]="嶨",
["峄"]="嶧",
["峡"]="峽",
["峣"]="嶢",
["峤"]="嶠",
["峥"]="崢",
["峦"]="巒",
["崂"]="嶗",
["崃"]="崍",
["崄"]="嶮",
["崭"]="嶄",
["嵘"]="嶸",
["嵚"]="嶔",
["嵝"]="嶁",
["巅"]="巔",
["巩"]="鞏",
["巯"]="巰",
["币"]="幣",
["帅"]="帥",
["师"]="師",
["帏"]="幃",
["帐"]="帳",
["帘"]="簾",
["帜"]="幟",
["带"]="帶",
["帧"]="幀",
["帮"]="幫",
["帱"]="幬",
["帻"]="幘",
["帼"]="幗",
["幂"]="冪",
["幞"]="襆",
["干"]="乾",
["并"]="並",
["广"]="廣",
["庄"]="莊",
["庆"]="慶",
["庐"]="廬",
["庑"]="廡",
["库"]="庫",
["应"]="應",
["庙"]="廟",
["庞"]="龐",
["废"]="廢",
["庼"]="廎",
["廪"]="廩",
["开"]="開",
["异"]="異",
["弃"]="棄",
["弑"]="弒",
["张"]="張",
["弥"]="彌",
["弪"]="弳",
["弯"]="彎",
["弹"]="彈",
["强"]="強",
["归"]="歸",
["当"]="當",
["录"]="錄",
["彝"]="彞",
["彟"]="彠",
["彦"]="彥",
["彨"]="彲",
["彻"]="徹",
["征"]="徵",
["径"]="徑",
["徕"]="徠",
["忆"]="憶",
["忏"]="懺",
["忧"]="憂",
["忾"]="愾",
["怀"]="懷",
["态"]="態",
["怂"]="慫",
["怃"]="憮",
["怄"]="慪",
["怅"]="悵",
["怆"]="愴",
["怜"]="憐",
["总"]="總",
["怼"]="懟",
["怿"]="懌",
["恋"]="戀",
["恒"]="恆",
["恳"]="懇",
["恶"]="惡",
["恸"]="慟",
["恹"]="懨",
["恺"]="愷",
["恻"]="惻",
["恼"]="惱",
["恽"]="惲",
["悦"]="悅",
["悫"]="愨",
["悬"]="懸",
["悭"]="慳",
["悮"]="悞",
["悯"]="憫",
["惊"]="驚",
["惧"]="懼",
["惨"]="慘",
["惩"]="懲",
["惫"]="憊",
["惬"]="愜",
["惭"]="慚",
["惮"]="憚",
["惯"]="慣",
["愠"]="慍",
["愤"]="憤",
["愦"]="憒",
["愿"]="願",
["慑"]="懾",
["慭"]="憖",
["懑"]="懣",
["懒"]="懶",
["懔"]="懍",
["戆"]="戇",
["戋"]="戔",
["戏"]="戲",
["戗"]="戧",
["战"]="戰",
["戬"]="戩",
["户"]="戶",
["扎"]="紮",
["扑"]="撲",
["执"]="執",
["扩"]="擴",
["扪"]="捫",
["扫"]="掃",
["扬"]="揚",
["扰"]="擾",
["抚"]="撫",
["抛"]="拋",
["抟"]="摶",
["抠"]="摳",
["抡"]="掄",
["抢"]="搶",
["护"]="護",
["报"]="報",
["担"]="擔",
["拟"]="擬",
["拢"]="攏",
["拣"]="揀",
["拥"]="擁",
["拦"]="攔",
["拧"]="擰",
["拨"]="撥",
["择"]="擇",
["挂"]="掛",
["挚"]="摯",
["挛"]="攣",
["挜"]="掗",
["挝"]="撾",
["挞"]="撻",
["挟"]="挾",
["挠"]="撓",
["挡"]="擋",
["挢"]="撟",
["挣"]="掙",
["挤"]="擠",
["挥"]="揮",
["挦"]="撏",
["捆"]="綑",
["捝"]="挩",
["捞"]="撈",
["损"]="損",
["捡"]="撿",
["换"]="換",
["捣"]="搗",
["据"]="據",
["掳"]="擄",
["掴"]="摑",
["掷"]="擲",
["掸"]="撣",
["掺"]="摻",
["掼"]="摜",
["揽"]="攬",
["揾"]="搵",
["揿"]="撳",
["搀"]="攙",
["搁"]="擱",
["搂"]="摟",
["搅"]="攪",
["携"]="攜",
["摄"]="攝",
["摅"]="攄",
["摆"]="擺",
["摇"]="搖",
["摈"]="擯",
["摊"]="攤",
["撄"]="攖",
["撑"]="撐",
["撰"]="譔",
["撵"]="攆",
["撷"]="擷",
["撸"]="擼",
["撺"]="攛",
["擜"]="㩵",
["擞"]="擻",
["攒"]="攢",
["敌"]="敵",
["敛"]="斂",
["敩"]="斆",
["数"]="數",
["斋"]="齋",
["斓"]="斕",
["斩"]="斬",
["断"]="斷",
["无"]="無",
["旧"]="舊",
["时"]="時",
["旷"]="曠",
["旸"]="暘",
["昙"]="曇",
["昵"]="暱",
["昼"]="晝",
["昽"]="曨",
["显"]="顯",
["晋"]="晉",
["晒"]="曬",
["晓"]="曉",
["晔"]="曄",
["晕"]="暈",
["晖"]="暉",
["暂"]="暫",
["暧"]="曖",
["术"]="術",
["朴"]="樸",
["机"]="機",
["杀"]="殺",
["杂"]="雜",
["权"]="權",
["杆"]="桿",
["杠"]="槓",
["条"]="條",
["来"]="來",
["杨"]="楊",
["杩"]="榪",
["杰"]="傑",
["极"]="極",
["构"]="構",
["枞"]="樅",
["枢"]="樞",
["枣"]="棗",
["枥"]="櫪",
["枧"]="梘",
["枨"]="棖",
["枪"]="槍",
["枫"]="楓",
["枭"]="梟",
["柜"]="櫃",
["柠"]="檸",
["柽"]="檉",
["栀"]="梔",
["栄"]="𦦗",
["栅"]="柵",
["标"]="標",
["栈"]="棧",
["栉"]="櫛",
["栊"]="櫳",
["栋"]="棟",
["栌"]="櫨",
["栎"]="櫟",
["栏"]="欄",
["树"]="樹",
["栖"]="棲",
["样"]="樣",
["栾"]="欒",
["桠"]="椏",
["桡"]="橈",
["桢"]="楨",
["档"]="檔",
["桤"]="榿",
["桥"]="橋",
["桦"]="樺",
["桧"]="檜",
["桨"]="槳",
["桩"]="樁",
["桪"]="樳",
["梦"]="夢",
["梼"]="檮",
["梾"]="棶",
["梿"]="槤",
["检"]="檢",
["棁"]="梲",
["棂"]="櫺",
["棹"]="櫂",
["椁"]="槨",
["椝"]="槼",
["椟"]="櫝",
["椠"]="槧",
["椢"]="槶",
["椤"]="欏",
["椫"]="樿",
["椭"]="橢",
["椮"]="槮",
["楼"]="樓",
["榄"]="欖",
["榅"]="榲",
["榇"]="櫬",
["榈"]="櫚",
["榉"]="櫸",
["榨"]="搾",
["槚"]="檟",
["槛"]="檻",
["槜"]="檇",
["槟"]="檳",
["槠"]="櫧",
["横"]="橫",
["樯"]="檣",
["樱"]="櫻",
["橥"]="櫫",
["橱"]="櫥",
["橹"]="櫓",
["橼"]="櫞",
["檩"]="檁",
["欢"]="歡",
["欤"]="歟",
["欧"]="歐",
["歼"]="殲",
["殁"]="歿",
["殇"]="殤",
["残"]="殘",
["殒"]="殞",
["殓"]="殮",
["殚"]="殫",
["殡"]="殯",
["殴"]="毆",
["殷"]="慇",
["毁"]="毀",
["毂"]="轂",
["毕"]="畢",
["毙"]="斃",
["毡"]="氈",
["毵"]="毿",
["氇"]="氌",
["气"]="氣",
["氢"]="氫",
["氩"]="氬",
["氲"]="氳",
["汇"]="匯",
["汉"]="漢",
["汤"]="湯",
["汹"]="洶",
["沄"]="澐",
["沈"]="瀋",
["沟"]="溝",
["没"]="沒",
["沣"]="灃",
["沤"]="漚",
["沥"]="瀝",
["沦"]="淪",
["沧"]="滄",
["沨"]="渢",
["沩"]="溈",
["沪"]="滬",
["沵"]="濔",
["泄"]="洩",
["泞"]="濘",
["泪"]="淚",
["泶"]="澩",
["泷"]="瀧",
["泸"]="瀘",
["泺"]="濼",
["泻"]="瀉",
["泼"]="潑",
["泽"]="澤",
["泾"]="涇",
["洁"]="潔",
["洒"]="灑",
["洼"]="窪",
["浃"]="浹",
["浄"]="淨",
["浅"]="淺",
["浆"]="漿",
["浇"]="澆",
["浈"]="湞",
["浉"]="溮",
["浊"]="濁",
["测"]="測",
["浍"]="澮",
["济"]="濟",
["浏"]="瀏",
["浐"]="滻",
["浑"]="渾",
["浒"]="滸",
["浓"]="濃",
["浔"]="潯",
["浕"]="濜",
["涂"]="塗",
["涌"]="湧",
["涛"]="濤",
["涝"]="澇",
["涞"]="淶",
["涟"]="漣",
["涠"]="潿",
["涡"]="渦",
["涢"]="溳",
["涣"]="渙",
["涤"]="滌",
["润"]="潤",
["涧"]="澗",
["涨"]="漲",
["涩"]="澀",
["淀"]="澱",
["渊"]="淵",
["渌"]="淥",
["渍"]="漬",
["渎"]="瀆",
["渐"]="漸",
["渑"]="澠",
["渔"]="漁",
["渖"]="瀋",
["渗"]="滲",
["温"]="溫",
["湾"]="灣",
["湿"]="濕",
["溁"]="濚",
["溃"]="潰",
["溅"]="濺",
["溇"]="漊",
["滗"]="潷",
["滚"]="滾",
["滞"]="滯",
["滟"]="灩",
["滠"]="灄",
["满"]="滿",
["滢"]="瀅",
["滤"]="濾",
["滥"]="濫",
["滦"]="灤",
["滨"]="濱",
["滩"]="灘",
["滪"]="澦",
["潆"]="瀠",
["潇"]="瀟",
["潋"]="瀲",
["潍"]="濰",
["潜"]="潛",
["潴"]="瀦",
["澛"]="瀂",
["澜"]="瀾",
["濑"]="瀨",
["濒"]="瀕",
["灏"]="灝",
["灭"]="滅",
["灯"]="燈",
["灵"]="靈",
["灾"]="災",
["灿"]="燦",
["炀"]="煬",
["炉"]="爐",
["炖"]="燉",
["炜"]="煒",
["炝"]="熗",
["点"]="點",
["炼"]="煉",
["炽"]="熾",
["烁"]="爍",
["烂"]="爛",
["烃"]="烴",
["烛"]="燭",
["烟"]="煙",
["烦"]="煩",
["烧"]="燒",
["烨"]="燁",
["烩"]="燴",
["烫"]="燙",
["烬"]="燼",
["热"]="熱",
["焕"]="煥",
["焖"]="燜",
["焘"]="燾",
["煴"]="熅",
["熏"]="燻",
["爱"]="愛",
["爷"]="爺",
["牍"]="牘",
["牦"]="氂",
["牵"]="牽",
["牺"]="犧",
["犊"]="犢",
["状"]="狀",
["犷"]="獷",
["犸"]="獁",
["犹"]="猶",
["狈"]="狽",
["狝"]="獮",
["狞"]="獰",
["独"]="獨",
["狭"]="狹",
["狮"]="獅",
["狯"]="獪",
["狰"]="猙",
["狱"]="獄",
["狲"]="猻",
["猃"]="獫",
["猎"]="獵",
["猕"]="獼",
["猡"]="玀",
["猪"]="豬",
["猫"]="貓",
["猬"]="蝟",
["献"]="獻",
["獭"]="獺",
["玑"]="璣",
["玙"]="璵",
["玚"]="瑒",
["玛"]="瑪",
["玮"]="瑋",
["环"]="環",
["现"]="現",
["玱"]="瑲",
["玺"]="璽",
["珐"]="琺",
["珑"]="瓏",
["珰"]="璫",
["珲"]="琿",
["琎"]="璡",
["琏"]="璉",
["琐"]="瑣",
["琼"]="瓊",
["瑶"]="瑤",
["瑷"]="璦",
["瑸"]="璸",
["璎"]="瓔",
["瓒"]="瓚",
["瓮"]="甕",
["瓯"]="甌",
["电"]="電",
["画"]="畫",
["畅"]="暢",
["畴"]="疇",
["疖"]="癤",
["疗"]="療",
["疟"]="瘧",
["疠"]="癘",
["疡"]="瘍",
["疬"]="癧",
["疭"]="瘲",
["疮"]="瘡",
["疯"]="瘋",
["疱"]="皰",
["痈"]="癰",
["痉"]="痙",
["痒"]="癢",
["痖"]="瘂",
["痨"]="癆",
["痪"]="瘓",
["痫"]="癇",
["痹"]="痺",
["瘅"]="癉",
["瘆"]="瘮",
["瘗"]="瘞",
["瘘"]="瘺",
["瘪"]="癟",
["瘫"]="癱",
["瘾"]="癮",
["瘿"]="癭",
["癞"]="癩",
["癣"]="癬",
["癫"]="癲",
["皑"]="皚",
["皱"]="皺",
["皲"]="皸",
["盏"]="盞",
["盐"]="鹽",
["监"]="監",
["盖"]="蓋",
["盗"]="盜",
["盘"]="盤",
["眍"]="瞘",
["眝"]="矃",
["眦"]="眥",
["眬"]="矓",
["眯"]="瞇",
["着"]="著",
["睁"]="睜",
["睐"]="睞",
["睑"]="瞼",
["睾"]="睪",
["睿"]="叡",
["瞆"]="瞶",
["瞒"]="瞞",
["瞩"]="矚",
["矫"]="矯",
["矶"]="磯",
["矾"]="礬",
["矿"]="礦",
["砀"]="碭",
["码"]="碼",
["砖"]="磚",
["砗"]="硨",
["砚"]="硯",
["砜"]="碸",
["砺"]="礪",
["砻"]="礱",
["砾"]="礫",
["础"]="礎",
["硁"]="硜",
["硕"]="碩",
["硖"]="硤",
["硗"]="磽",
["硙"]="磑",
["硚"]="礄",
["确"]="確",
["硵"]="磠",
["硷"]="鹼",
["碍"]="礙",
["碛"]="磧",
["碜"]="磣",
["碱"]="鹼",
["礼"]="禮",
["祃"]="禡",
["祎"]="禕",
["祢"]="禰",
["祯"]="禎",
["祷"]="禱",
["祸"]="禍",
["禀"]="稟",
["禄"]="祿",
["禅"]="禪",
["离"]="離",
["秃"]="禿",
["秆"]="稈",
["种"]="種",
["积"]="積",
["称"]="稱",
["秽"]="穢",
["秾"]="穠",
["稆"]="穭",
["税"]="稅",
["稣"]="穌",
["稳"]="穩",
["穑"]="穡",
["穞"]="穭",
["穷"]="窮",
["窃"]="竊",
["窍"]="竅",
["窎"]="窵",
["窑"]="窯",
["窜"]="竄",
["窝"]="窩",
["窥"]="窺",
["窦"]="竇",
["窭"]="窶",
["竖"]="豎",
["竞"]="競",
["笃"]="篤",
["笋"]="筍",
["笔"]="筆",
["笕"]="筧",
["笺"]="箋",
["笼"]="籠",
["笾"]="籩",
["筚"]="篳",
["筛"]="篩",
["筜"]="簹",
["筝"]="箏",
["筹"]="籌",
["筼"]="篔",
["签"]="簽",
["筿"]="篠",
["简"]="簡",
["箓"]="籙",
["箦"]="簀",
["箧"]="篋",
["箨"]="籜",
["箩"]="籮",
["箪"]="簞",
["箫"]="簫",
["篑"]="簣",
["篓"]="簍",
["篮"]="籃",
["篯"]="籛",
["篱"]="籬",
["簖"]="籪",
["籁"]="籟",
["籴"]="糴",
["类"]="類",
["籼"]="秈",
["粜"]="糶",
["粝"]="糲",
["粤"]="粵",
["粪"]="糞",
["粮"]="糧",
["糁"]="糝",
["糇"]="餱",
["紧"]="緊",
["絷"]="縶",
["纟"]="糹",
["纠"]="糾",
["纡"]="紆",
["红"]="紅",
["纣"]="紂",
["纤"]="纖",
["纥"]="紇",
["约"]="約",
["级"]="級",
["纨"]="紈",
["纩"]="纊",
["纪"]="紀",
["纫"]="紉",
["纬"]="緯",
["纭"]="紜",
["纮"]="紘",
["纯"]="純",
["纰"]="紕",
["纱"]="紗",
["纲"]="綱",
["纳"]="納",
["纴"]="紝",
["纵"]="縱",
["纶"]="綸",
["纷"]="紛",
["纸"]="紙",
["纹"]="紋",
["纺"]="紡",
["纻"]="紵",
["纼"]="紖",
["纽"]="紐",
["纾"]="紓",
["线"]="線",
["绀"]="紺",
["绁"]="紲",
["绂"]="紱",
["练"]="練",
["组"]="組",
["绅"]="紳",
["细"]="細",
["织"]="織",
["终"]="終",
["绉"]="縐",
["绊"]="絆",
["绋"]="紼",
["绌"]="絀",
["绍"]="紹",
["绎"]="繹",
["经"]="經",
["绐"]="紿",
["绑"]="綁",
["绒"]="絨",
["结"]="結",
["绔"]="絝",
["绕"]="繞",
["绖"]="絰",
["绗"]="絎",
["绘"]="繪",
["给"]="給",
["绚"]="絢",
["绛"]="絳",
["络"]="絡",
["绝"]="絕",
["绞"]="絞",
["统"]="統",
["绠"]="綆",
["绡"]="綃",
["绢"]="絹",
["绣"]="繡",
["绤"]="綌",
["绥"]="綏",
["绦"]="絛",
["继"]="繼",
["绨"]="綈",
["绩"]="績",
["绪"]="緒",
["绫"]="綾",
["绬"]="緓",
["续"]="續",
["绮"]="綺",
["绯"]="緋",
["绰"]="綽",
["绱"]="鞝",
["绲"]="緄",
["绳"]="繩",
["维"]="維",
["绵"]="綿",
["绶"]="綬",
["绷"]="繃",
["绸"]="綢",
["绹"]="綯",
["绺"]="綹",
["绻"]="綣",
["综"]="綜",
["绽"]="綻",
["绾"]="綰",
["绿"]="綠",
["缀"]="綴",
["缁"]="緇",
["缂"]="緙",
["缃"]="緗",
["缄"]="緘",
["缅"]="緬",
["缆"]="纜",
["缇"]="緹",
["缈"]="緲",
["缉"]="緝",
["缊"]="縕",
["缋"]="繢",
["缌"]="緦",
["缍"]="綞",
["缎"]="緞",
["缏"]="緶",
["缐"]="線",
["缑"]="緱",
["缒"]="縋",
["缓"]="緩",
["缔"]="締",
["缕"]="縷",
["编"]="編",
["缗"]="緡",
["缘"]="緣",
["缙"]="縉",
["缚"]="縛",
["缛"]="縟",
["缜"]="縝",
["缝"]="縫",
["缞"]="縗",
["缟"]="縞",
["缠"]="纏",
["缡"]="縭",
["缢"]="縊",
["缣"]="縑",
["缤"]="繽",
["缥"]="縹",
["缦"]="縵",
["缧"]="縲",
["缨"]="纓",
["缩"]="縮",
["缪"]="繆",
["缫"]="繅",
["缬"]="纈",
["缭"]="繚",
["缮"]="繕",
["缯"]="繒",
["缰"]="韁",
["缱"]="繾",
["缲"]="繰",
["缳"]="繯",
["缴"]="繳",
["缵"]="纘",
["罂"]="罌",
["网"]="網",
["罗"]="羅",
["罚"]="罰",
["罢"]="罷",
["罴"]="羆",
["羁"]="羈",
["羟"]="羥",
["羡"]="羨",
["翘"]="翹",
["翙"]="翽",
["翚"]="翬",
["耢"]="耮",
["耧"]="耬",
["耸"]="聳",
["耻"]="恥",
["聂"]="聶",
["聋"]="聾",
["职"]="職",
["聍"]="聹",
["联"]="聯",
["聩"]="聵",
["聪"]="聰",
["肃"]="肅",
["肠"]="腸",
["肤"]="膚",
["肮"]="骯",
["肴"]="餚",
["肾"]="腎",
["肿"]="腫",
["胀"]="脹",
["胁"]="脅",
["胆"]="膽",
["胑"]="膱",
["胜"]="勝",
["胧"]="朧",
["胨"]="腖",
["胪"]="臚",
["胫"]="脛",
["胶"]="膠",
["脉"]="脈",
["脍"]="膾",
["脏"]="髒",
["脐"]="臍",
["脑"]="腦",
["脓"]="膿",
["脔"]="臠",
["脚"]="腳",
["脱"]="脫",
["脶"]="腡",
["脸"]="臉",
["腊"]="臘",
["腌"]="醃",
["腘"]="膕",
["腭"]="齶",
["腻"]="膩",
["腼"]="靦",
["腽"]="膃",
["腾"]="騰",
["膑"]="臏",
["臜"]="臢",
["舆"]="輿",
["舣"]="艤",
["舰"]="艦",
["舱"]="艙",
["舻"]="艫",
["艰"]="艱",
["艳"]="豔",
["艺"]="藝",
["节"]="節",
["芈"]="羋",
["芗"]="薌",
["芜"]="蕪",
["芦"]="蘆",
["苁"]="蓯",
["苇"]="葦",
["苈"]="藶",
["苋"]="莧",
["苌"]="萇",
["苍"]="蒼",
["苎"]="苧",
["苏"]="蘇",
["苧"]="薴",
["苹"]="蘋",
["范"]="範",
["茎"]="莖",
["茏"]="蘢",
["茑"]="蔦",
["茔"]="塋",
["茕"]="煢",
["茧"]="繭",
["荆"]="荊",
["荐"]="薦",
["荙"]="薘",
["荚"]="莢",
["荛"]="蕘",
["荜"]="蓽",
["荝"]="萴",
["荞"]="蕎",
["荟"]="薈",
["荠"]="薺",
["荡"]="蕩",
["荣"]="榮",
["荤"]="葷",
["荥"]="滎",
["荦"]="犖",
["荧"]="熒",
["荨"]="蕁",
["荩"]="藎",
["荪"]="蓀",
["荫"]="蔭",
["荬"]="蕒",
["荭"]="葒",
["荮"]="葤",
["药"]="藥",
["莅"]="蒞",
["莱"]="萊",
["莲"]="蓮",
["莳"]="蒔",
["莴"]="萵",
["莶"]="薟",
["获"]="獲",
["莸"]="蕕",
["莹"]="瑩",
["莺"]="鶯",
["莼"]="蓴",
["萚"]="蘀",
["萝"]="蘿",
["萤"]="螢",
["营"]="營",
["萦"]="縈",
["萧"]="蕭",
["萨"]="薩",
["葱"]="蔥",
["蒀"]="蒕",
["蒇"]="蕆",
["蒉"]="蕢",
["蒋"]="蔣",
["蒌"]="蔞",
["蒏"]="醟",
["蓝"]="藍",
["蓟"]="薊",
["蓠"]="蘺",
["蓣"]="蕷",
["蓥"]="鎣",
["蓦"]="驀",
["蔷"]="薔",
["蔹"]="蘞",
["蔺"]="藺",
["蔼"]="藹",
["蕰"]="薀",
["蕲"]="蘄",
["蕴"]="蘊",
["薮"]="藪",
["藓"]="蘚",
["蘖"]="櫱",
["虏"]="虜",
["虑"]="慮",
["虚"]="虛",
["虫"]="蟲",
["虬"]="虯",
["虮"]="蟣",
["虱"]="蝨",
["虽"]="雖",
["虾"]="蝦",
["虿"]="蠆",
["蚀"]="蝕",
["蚁"]="蟻",
["蚂"]="螞",
["蚃"]="蠁",
["蚕"]="蠶",
["蚝"]="蠔",
["蚬"]="蜆",
["蛊"]="蠱",
["蛍"]="𬠰",
["蛎"]="蠣",
["蛏"]="蟶",
["蛮"]="蠻",
["蛰"]="蟄",
["蛱"]="蛺",
["蛲"]="蟯",
["蛳"]="螄",
["蛴"]="蠐",
["蜕"]="蛻",
["蜗"]="蝸",
["蜡"]="蠟",
["蝇"]="蠅",
["蝈"]="蟈",
["蝉"]="蟬",
["蝎"]="蠍",
["蝼"]="螻",
["蝾"]="蠑",
["螀"]="螿",
["螨"]="蟎",
["蟏"]="蠨",
["衅"]="釁",
["衔"]="銜",
["补"]="補",
["衬"]="襯",
["衮"]="袞",
["袄"]="襖",
["袅"]="裊",
["袆"]="褘",
["袜"]="襪",
["袭"]="襲",
["袯"]="襏",
["装"]="裝",
["裆"]="襠",
["裈"]="褌",
["裢"]="褳",
["裣"]="襝",
["裤"]="褲",
["裥"]="襇",
["褛"]="褸",
["褝"]="襌",
["褴"]="襤",
["襕"]="襴",
["见"]="見",
["观"]="觀",
["觃"]="覎",
["规"]="規",
["觅"]="覓",
["视"]="視",
["觇"]="覘",
["览"]="覽",
["觉"]="覺",
["觊"]="覬",
["觋"]="覡",
["觌"]="覿",
["觍"]="覥",
["觎"]="覦",
["觏"]="覯",
["觐"]="覲",
["觑"]="覷",
["觞"]="觴",
["触"]="觸",
["觯"]="觶",
["訚"]="誾",
["詟"]="讋",
["誉"]="譽",
["誊"]="謄",
["讠"]="訁",
["计"]="計",
["订"]="訂",
["讣"]="訃",
["认"]="認",
["讥"]="譏",
["讦"]="訐",
["讧"]="訌",
["讨"]="討",
["让"]="讓",
["讪"]="訕",
["讫"]="訖",
["讬"]="託",
["训"]="訓",
["议"]="議",
["讯"]="訊",
["记"]="記",
["讱"]="訒",
["讲"]="講",
["讳"]="諱",
["讴"]="謳",
["讵"]="詎",
["讶"]="訝",
["讷"]="訥",
["许"]="許",
["讹"]="訛",
["论"]="論",
["讻"]="訩",
["讼"]="訟",
["讽"]="諷",
["设"]="設",
["访"]="訪",
["诀"]="訣",
["证"]="證",
["诂"]="詁",
["诃"]="訶",
["评"]="評",
["诅"]="詛",
["识"]="識",
["诇"]="詗",
["诈"]="詐",
["诉"]="訴",
["诊"]="診",
["诋"]="詆",
["诌"]="謅",
["词"]="詞",
["诎"]="詘",
["诏"]="詔",
["诐"]="詖",
["译"]="譯",
["诒"]="詒",
["诓"]="誆",
["诔"]="誄",
["试"]="試",
["诖"]="詿",
["诗"]="詩",
["诘"]="詰",
["诙"]="詼",
["诚"]="誠",
["诛"]="誅",
["诜"]="詵",
["话"]="話",
["诞"]="誕",
["诟"]="詬",
["诠"]="詮",
["诡"]="詭",
["询"]="詢",
["诣"]="詣",
["诤"]="諍",
["该"]="該",
["详"]="詳",
["诧"]="詫",
["诨"]="諢",
["诩"]="詡",
["诪"]="譸",
["诫"]="誡",
["诬"]="誣",
["语"]="語",
["诮"]="誚",
["误"]="誤",
["诰"]="誥",
["诱"]="誘",
["诲"]="誨",
["诳"]="誑",
["说"]="說",
["诵"]="誦",
["诶"]="誒",
["请"]="請",
["诸"]="諸",
["诹"]="諏",
["诺"]="諾",
["读"]="讀",
["诼"]="諑",
["诽"]="誹",
["课"]="課",
["诿"]="諉",
["谀"]="諛",
["谁"]="誰",
["谂"]="諗",
["调"]="調",
["谄"]="諂",
["谅"]="諒",
["谆"]="諄",
["谇"]="誶",
["谈"]="談",
["谉"]="讅",
["谊"]="誼",
["谋"]="謀",
["谌"]="諶",
["谍"]="諜",
["谎"]="謊",
["谏"]="諫",
["谐"]="諧",
["谑"]="謔",
["谒"]="謁",
["谓"]="謂",
["谔"]="諤",
["谕"]="諭",
["谖"]="諼",
["谗"]="讒",
["谘"]="諮",
["谙"]="諳",
["谚"]="諺",
["谛"]="諦",
["谜"]="謎",
["谝"]="諞",
["谞"]="諝",
["谟"]="謨",
["谠"]="讜",
["谡"]="謖",
["谢"]="謝",
["谣"]="謠",
["谤"]="謗",
["谥"]="謚",
["谦"]="謙",
["谧"]="謐",
["谨"]="謹",
["谩"]="謾",
["谪"]="謫",
["谫"]="譾",
["谬"]="謬",
["谭"]="譚",
["谮"]="譖",
["谯"]="譙",
["谰"]="讕",
["谱"]="譜",
["谲"]="譎",
["谳"]="讞",
["谴"]="譴",
["谵"]="譫",
["谶"]="讖",
["豮"]="豶",
["贝"]="貝",
["贞"]="貞",
["负"]="負",
["贠"]="貟",
["贡"]="貢",
["财"]="財",
["责"]="責",
["贤"]="賢",
["败"]="敗",
["账"]="賬",
["货"]="貨",
["质"]="質",
["贩"]="販",
["贪"]="貪",
["贫"]="貧",
["贬"]="貶",
["购"]="購",
["贮"]="貯",
["贯"]="貫",
["贰"]="貳",
["贱"]="賤",
["贲"]="賁",
["贳"]="貰",
["贴"]="貼",
["贵"]="貴",
["贶"]="貺",
["贷"]="貸",
["贸"]="貿",
["费"]="費",
["贺"]="賀",
["贻"]="貽",
["贼"]="賊",
["贽"]="贄",
["贾"]="賈",
["贿"]="賄",
["赀"]="貲",
["赁"]="賃",
["赂"]="賂",
["赃"]="贓",
["资"]="資",
["赅"]="賅",
["赆"]="贐",
["赇"]="賕",
["赈"]="賑",
["赉"]="賚",
["赊"]="賒",
["赋"]="賦",
["赌"]="賭",
["赍"]="齎",
["赎"]="贖",
["赏"]="賞",
["赐"]="賜",
["赑"]="贔",
["赒"]="賙",
["赓"]="賡",
["赔"]="賠",
["赕"]="賧",
["赖"]="賴",
["赗"]="賵",
["赘"]="贅",
["赙"]="賻",
["赚"]="賺",
["赛"]="賽",
["赜"]="賾",
["赝"]="贗",
["赞"]="贊",
["赟"]="贇",
["赠"]="贈",
["赡"]="贍",
["赢"]="贏",
["赣"]="贛",
["赪"]="赬",
["赵"]="趙",
["赶"]="趕",
["趋"]="趨",
["趱"]="趲",
["趸"]="躉",
["跃"]="躍",
["跄"]="蹌",
["跞"]="躒",
["践"]="踐",
["跶"]="躂",
["跷"]="蹺",
["跸"]="蹕",
["跹"]="躚",
["跻"]="躋",
["踊"]="踴",
["踌"]="躊",
["踪"]="蹤",
["踬"]="躓",
["踯"]="躑",
["蹑"]="躡",
["蹒"]="蹣",
["蹰"]="躕",
["蹿"]="躥",
["躏"]="躪",
["躜"]="躦",
["躯"]="軀",
["车"]="車",
["轧"]="軋",
["轨"]="軌",
["轩"]="軒",
["轪"]="軑",
["轫"]="軔",
["转"]="轉",
["轭"]="軛",
["轮"]="輪",
["软"]="軟",
["轰"]="轟",
["轱"]="軲",
["轲"]="軻",
["轳"]="轤",
["轴"]="軸",
["轵"]="軹",
["轶"]="軼",
["轷"]="軤",
["轸"]="軫",
["轹"]="轢",
["轺"]="軺",
["轻"]="輕",
["轼"]="軾",
["载"]="載",
["轾"]="輊",
["轿"]="轎",
["辀"]="輈",
["辁"]="輇",
["辂"]="輅",
["较"]="較",
["辄"]="輒",
["辅"]="輔",
["辆"]="輛",
["辇"]="輦",
["辈"]="輩",
["辉"]="輝",
["辊"]="輥",
["辋"]="輞",
["辌"]="輬",
["辍"]="輟",
["辎"]="輜",
["辏"]="輳",
["辐"]="輻",
["辑"]="輯",
["辒"]="轀",
["输"]="輸",
["辔"]="轡",
["辕"]="轅",
["辖"]="轄",
["辗"]="輾",
["辘"]="轆",
["辙"]="轍",
["辚"]="轔",
["辞"]="辭",
["辟"]="闢",
["辩"]="辯",
["辫"]="辮",
["边"]="邊",
["辽"]="遼",
["达"]="達",
["迁"]="遷",
["过"]="過",
["迈"]="邁",
["运"]="運",
["还"]="還",
["这"]="這",
["进"]="進",
["远"]="遠",
["违"]="違",
["连"]="連",
["迟"]="遲",
["迩"]="邇",
["迳"]="逕",
["迹"]="跡",
["适"]="適",
["选"]="選",
["逊"]="遜",
["递"]="遞",
["逦"]="邐",
["逻"]="邏",
["遗"]="遺",
["遥"]="遙",
["邓"]="鄧",
["邝"]="鄺",
["邬"]="鄔",
["邮"]="郵",
["邹"]="鄒",
["邺"]="鄴",
["邻"]="鄰",
["郁"]="鬱",
["郏"]="郟",
["郐"]="鄶",
["郑"]="鄭",
["郓"]="鄆",
["郦"]="酈",
["郧"]="鄖",
["郸"]="鄲",
["酂"]="酇",
["酝"]="醞",
["酦"]="醱",
["酱"]="醬",
["酽"]="釅",
["酾"]="釃",
["酿"]="釀",
["释"]="釋",
["里"]="裡",
["鉴"]="鑒",
["銮"]="鑾",
["錾"]="鏨",
["钅"]="釒",
["钆"]="釓",
["钇"]="釔",
["针"]="針",
["钉"]="釘",
["钊"]="釗",
["钋"]="釙",
["钌"]="釕",
["钍"]="釷",
["钎"]="釺",
["钏"]="釧",
["钐"]="釤",
["钑"]="鈒",
["钒"]="釩",
["钓"]="釣",
["钔"]="鍆",
["钕"]="釹",
["钖"]="鍚",
["钗"]="釵",
["钘"]="鈃",
["钙"]="鈣",
["钚"]="鈈",
["钛"]="鈦",
["钜"]="鉅",
["钝"]="鈍",
["钞"]="鈔",
["钟"]="鐘",
["钠"]="鈉",
["钡"]="鋇",
["钢"]="鋼",
["钣"]="鈑",
["钤"]="鈐",
["钥"]="鑰",
["钦"]="欽",
["钧"]="鈞",
["钨"]="鎢",
["钩"]="鉤",
["钪"]="鈧",
["钫"]="鈁",
["钬"]="鈥",
["钭"]="鈄",
["钮"]="鈕",
["钯"]="鈀",
["钰"]="鈺",
["钱"]="錢",
["钲"]="鉦",
["钳"]="鉗",
["钴"]="鈷",
["钵"]="缽",
["钶"]="鈳",
["钷"]="鉕",
["钸"]="鈽",
["钹"]="鈸",
["钺"]="鉞",
["钻"]="鑽",
["钼"]="鉬",
["钽"]="鉭",
["钾"]="鉀",
["钿"]="鈿",
["铀"]="鈾",
["铁"]="鐵",
["铂"]="鉑",
["铃"]="鈴",
["铄"]="鑠",
["铅"]="鉛",
["铆"]="鉚",
["铇"]="鉋",
["铈"]="鈰",
["铉"]="鉉",
["铊"]="鉈",
["铋"]="鉍",
["铌"]="鈮",
["铍"]="鈹",
["铎"]="鐸",
["铏"]="鉶",
["铐"]="銬",
["铑"]="銠",
["铒"]="鉺",
["铓"]="鋩",
["铔"]="錏",
["铕"]="銪",
["铖"]="鋮",
["铗"]="鋏",
["铘"]="鋣",
["铙"]="鐃",
["铚"]="銍",
["铛"]="鐺",
["铜"]="銅",
["铝"]="鋁",
["铞"]="銱",
["铟"]="銦",
["铠"]="鎧",
["铡"]="鍘",
["铢"]="銖",
["铣"]="銑",
["铤"]="鋌",
["铥"]="銩",
["铦"]="銛",
["铧"]="鏵",
["铨"]="銓",
["铩"]="鎩",
["铪"]="鉿",
["铫"]="銚",
["铬"]="鉻",
["铭"]="銘",
["铮"]="錚",
["铯"]="銫",
["铰"]="鉸",
["铱"]="銥",
["铲"]="鏟",
["铳"]="銃",
["铴"]="鐋",
["铵"]="銨",
["银"]="銀",
["铷"]="銣",
["铸"]="鑄",
["铹"]="鐒",
["铺"]="鋪",
["铻"]="鋙",
["铼"]="錸",
["铽"]="鋱",
["链"]="鏈",
["铿"]="鏗",
["销"]="銷",
["锁"]="鎖",
["锂"]="鋰",
["锃"]="鋥",
["锄"]="鋤",
["锅"]="鍋",
["锆"]="鋯",
["锇"]="鋨",
["锈"]="鏽",
["锉"]="銼",
["锊"]="鋝",
["锋"]="鋒",
["锌"]="鋅",
["锍"]="鋶",
["锎"]="鐦",
["锏"]="鐧",
["锐"]="銳",
["锑"]="銻",
["锒"]="鋃",
["锓"]="鋟",
["锔"]="鋦",
["锕"]="錒",
["锖"]="錆",
["锗"]="鍺",
["锘"]="鍩",
["错"]="錯",
["锚"]="錨",
["锛"]="錛",
["锜"]="錡",
["锝"]="鍀",
["锞"]="錁",
["锟"]="錕",
["锠"]="錩",
["锡"]="錫",
["锢"]="錮",
["锣"]="鑼",
["锤"]="錘",
["锥"]="錐",
["锦"]="錦",
["锧"]="鑕",
["锨"]="鍁",
["锩"]="錈",
["锪"]="鍃",
["锫"]="錇",
["锬"]="錟",
["锭"]="錠",
["键"]="鍵",
["锯"]="鋸",
["锰"]="錳",
["锱"]="錙",
["锲"]="鍥",
["锳"]="鍈",
["锴"]="鍇",
["锵"]="鏘",
["锶"]="鍶",
["锷"]="鍔",
["锸"]="鍤",
["锹"]="鍬",
["锺"]="鍾",
["锻"]="鍛",
["锼"]="鎪",
["锽"]="鍠",
["锾"]="鍰",
["锿"]="鎄",
["镀"]="鍍",
["镁"]="鎂",
["镂"]="鏤",
["镃"]="鎡",
["镄"]="鐨",
["镅"]="鎇",
["镆"]="鏌",
["镇"]="鎮",
["镈"]="鎛",
["镉"]="鎘",
["镊"]="鑷",
["镋"]="钂",
["镌"]="鐫",
["镍"]="鎳",
["镎"]="鎿",
["镏"]="鎦",
["镐"]="鎬",
["镑"]="鎊",
["镒"]="鎰",
["镓"]="鎵",
["镔"]="鑌",
["镕"]="鎔",
["镖"]="鏢",
["镗"]="鏜",
["镘"]="鏝",
["镙"]="鏍",
["镚"]="鏰",
["镛"]="鏞",
["镜"]="鏡",
["镝"]="鏑",
["镞"]="鏃",
["镟"]="鏇",
["镠"]="鏐",
["镡"]="鐔",
["镢"]="鐝",
["镣"]="鐐",
["镤"]="鏷",
["镥"]="鑥",
["镦"]="鐓",
["镧"]="鑭",
["镨"]="鐠",
["镩"]="鑹",
["镪"]="鏹",
["镫"]="鐙",
["镬"]="鑊",
["镭"]="鐳",
["镮"]="鐶",
["镯"]="鐲",
["镰"]="鐮",
["镱"]="鐿",
["镲"]="鑔",
["镳"]="鑣",
["镴"]="鑞",
["镵"]="鑱",
["镶"]="鑲",
["长"]="長",
["门"]="門",
["闩"]="閂",
["闪"]="閃",
["闫"]="閆",
["闬"]="閈",
["闭"]="閉",
["问"]="問",
["闯"]="闖",
["闰"]="閏",
["闱"]="闈",
["闲"]="閒",
["闳"]="閎",
["间"]="間",
["闵"]="閔",
["闶"]="閌",
["闷"]="悶",
["闸"]="閘",
["闹"]="鬧",
["闺"]="閨",
["闻"]="聞",
["闼"]="闥",
["闽"]="閩",
["闾"]="閭",
["闿"]="闓",
["阀"]="閥",
["阁"]="閣",
["阂"]="閡",
["阃"]="閫",
["阄"]="鬮",
["阅"]="閱",
["阆"]="閬",
["阇"]="闍",
["阈"]="閾",
["阉"]="閹",
["阊"]="閶",
["阋"]="鬩",
["阌"]="閿",
["阍"]="閽",
["阎"]="閻",
["阏"]="閼",
["阐"]="闡",
["阑"]="闌",
["阒"]="闃",
["阓"]="闠",
["阔"]="闊",
["阕"]="闋",
["阖"]="闔",
["阗"]="闐",
["阘"]="闒",
["阙"]="闕",
["阚"]="闞",
["阛"]="闤",
["队"]="隊",
["阳"]="陽",
["阴"]="陰",
["阵"]="陣",
["阶"]="階",
["际"]="際",
["陆"]="陸",
["陇"]="隴",
["陈"]="陳",
["陉"]="陘",
["陕"]="陝",
["陦"]="隯",
["陧"]="隉",
["陨"]="隕",
["险"]="險",
["随"]="隨",
["隐"]="隱",
["隶"]="隸",
["隽"]="雋",
["难"]="難",
["雇"]="僱",
["雍"]="雝",
["雏"]="雛",
["雠"]="讎",
["雳"]="靂",
["雾"]="霧",
["霁"]="霽",
["霉"]="黴",
["霡"]="霢",
["霭"]="靄",
["靓"]="靚",
["靔"]="靝",
["静"]="靜",
["靥"]="靨",
["鞑"]="韃",
["鞒"]="鞽",
["鞯"]="韉",
["韦"]="韋",
["韧"]="韌",
["韨"]="韍",
["韩"]="韓",
["韪"]="韙",
["韫"]="韞",
["韬"]="韜",
["韵"]="韻",
["页"]="頁",
["顶"]="頂",
["顷"]="頃",
["顸"]="頇",
["项"]="項",
["顺"]="順",
["须"]="須",
["顼"]="頊",
["顽"]="頑",
["顾"]="顧",
["顿"]="頓",
["颀"]="頎",
["颁"]="頒",
["颂"]="頌",
["颃"]="頏",
["预"]="預",
["颅"]="顱",
["领"]="領",
["颇"]="頗",
["颈"]="頸",
["颉"]="頡",
["颊"]="頰",
["颋"]="頲",
["颌"]="頜",
["颍"]="潁",
["颎"]="熲",
["颏"]="頦",
["颐"]="頤",
["频"]="頻",
["颒"]="頮",
["颓"]="頹",
["颔"]="頷",
["颕"]="頴",
["颖"]="穎",
["颗"]="顆",
["题"]="題",
["颙"]="顒",
["颚"]="顎",
["颛"]="顓",
["颜"]="顏",
["额"]="額",
["颞"]="顳",
["颟"]="顢",
["颠"]="顛",
["颡"]="顙",
["颢"]="顥",
["颣"]="纇",
["颤"]="顫",
["颥"]="顬",
["颦"]="顰",
["颧"]="顴",
["风"]="風",
["飏"]="颺",
["飐"]="颭",
["飑"]="颮",
["飒"]="颯",
["飓"]="颶",
["飔"]="颸",
["飕"]="颼",
["飖"]="颻",
["飗"]="飀",
["飘"]="飄",
["飙"]="飆",
["飚"]="飈",
["飞"]="飛",
["飨"]="饗",
["餍"]="饜",
["饣"]="飠",
["饤"]="飣",
["饥"]="飢",
["饦"]="飥",
["饧"]="餳",
["饨"]="飩",
["饩"]="餼",
["饪"]="飪",
["饫"]="飫",
["饬"]="飭",
["饭"]="飯",
["饮"]="飲",
["饯"]="餞",
["饰"]="飾",
["饱"]="飽",
["饲"]="飼",
["饳"]="飿",
["饴"]="飴",
["饵"]="餌",
["饶"]="饒",
["饷"]="餉",
["饸"]="餄",
["饹"]="餎",
["饺"]="餃",
["饻"]="餏",
["饼"]="餅",
["饽"]="餑",
["饾"]="餖",
["饿"]="餓",
["馁"]="餒",
["馂"]="餕",
["馃"]="餜",
["馄"]="餛",
["馅"]="餡",
["馆"]="館",
["馇"]="餷",
["馈"]="饋",
["馉"]="餶",
["馊"]="餿",
["馋"]="饞",
["馌"]="饁",
["馍"]="饃",
["馎"]="餺",
["馏"]="餾",
["馐"]="饈",
["馑"]="饉",
["馒"]="饅",
["馓"]="饊",
["馔"]="饌",
["馕"]="饢",
["马"]="馬",
["驭"]="馭",
["驮"]="馱",
["驯"]="馴",
["驰"]="馳",
["驱"]="驅",
["驲"]="馹",
["驳"]="駁",
["驴"]="驢",
["驵"]="駔",
["驶"]="駛",
["驷"]="駟",
["驸"]="駙",
["驹"]="駒",
["驺"]="騶",
["驻"]="駐",
["驼"]="駝",
["驽"]="駑",
["驾"]="駕",
["驿"]="驛",
["骀"]="駘",
["骁"]="驍",
["骂"]="罵",
["骃"]="駰",
["骄"]="驕",
["骅"]="驊",
["骆"]="駱",
["骇"]="駭",
["骈"]="駢",
["骉"]="驫",
["骊"]="驪",
["骋"]="騁",
["验"]="驗",
["骍"]="騂",
["骎"]="駸",
["骏"]="駿",
["骐"]="騏",
["骑"]="騎",
["骒"]="騍",
["骓"]="騅",
["骔"]="騌",
["骕"]="驌",
["骖"]="驂",
["骗"]="騙",
["骘"]="騭",
["骙"]="騤",
["骚"]="騷",
["骛"]="騖",
["骜"]="驁",
["骝"]="騮",
["骞"]="騫",
["骟"]="騸",
["骠"]="驃",
["骡"]="騾",
["骢"]="驄",
["骣"]="驏",
["骤"]="驟",
["骥"]="驥",
["骦"]="驦",
["骧"]="驤",
["髅"]="髏",
["髋"]="髖",
["髌"]="髕",
["鬓"]="鬢",
["鬶"]="鬹",
["魇"]="魘",
["魉"]="魎",
["鱼"]="魚",
["鱽"]="魛",
["鱾"]="魢",
["鱿"]="魷",
["鲀"]="魨",
["鲁"]="魯",
["鲂"]="魴",
["鲃"]="䰾",
["鲄"]="魺",
["鲅"]="鮁",
["鲆"]="鮃",
["鲇"]="鮎",
["鲈"]="鱸",
["鲉"]="鮋",
["鲊"]="鮓",
["鲋"]="鮒",
["鲌"]="鮊",
["鲍"]="鮑",
["鲎"]="鱟",
["鲏"]="鮍",
["鲐"]="鮐",
["鲑"]="鮭",
["鲒"]="鮚",
["鲓"]="鮳",
["鲔"]="鮪",
["鲕"]="鮞",
["鲖"]="鮦",
["鲗"]="鰂",
["鲘"]="鮜",
["鲙"]="鱠",
["鲚"]="鱭",
["鲛"]="鮫",
["鲜"]="鮮",
["鲝"]="鮺",
["鲞"]="鯗",
["鲟"]="鱘",
["鲠"]="鯁",
["鲡"]="鱺",
["鲢"]="鰱",
["鲣"]="鰹",
["鲤"]="鯉",
["鲥"]="鰣",
["鲦"]="鰷",
["鲧"]="鯀",
["鲨"]="鯊",
["鲩"]="鯇",
["鲪"]="鮶",
["鲫"]="鯽",
["鲬"]="鯒",
["鲭"]="鯖",
["鲮"]="鯪",
["鲯"]="鯕",
["鲰"]="鯫",
["鲱"]="鯡",
["鲲"]="鯤",
["鲳"]="鯧",
["鲴"]="鯝",
["鲵"]="鯢",
["鲶"]="鯰",
["鲷"]="鯛",
["鲸"]="鯨",
["鲹"]="鰺",
["鲺"]="鯴",
["鲻"]="鯔",
["鲼"]="鱝",
["鲽"]="鰈",
["鲾"]="鰏",
["鲿"]="鱨",
["鳀"]="鯷",
["鳁"]="鰮",
["鳂"]="鰃",
["鳃"]="鰓",
["鳄"]="鱷",
["鳅"]="鰍",
["鳆"]="鰒",
["鳇"]="鰉",
["鳈"]="鰁",
["鳉"]="鱂",
["鳊"]="鯿",
["鳋"]="鰠",
["鳌"]="鰲",
["鳍"]="鰭",
["鳎"]="鰨",
["鳏"]="鰥",
["鳐"]="鰩",
["鳑"]="鰟",
["鳒"]="鰜",
["鳓"]="鰳",
["鳔"]="鰾",
["鳕"]="鱈",
["鳖"]="鱉",
["鳗"]="鰻",
["鳘"]="鰵",
["鳙"]="鱅",
["鳚"]="䲁",
["鳛"]="鰼",
["鳜"]="鱖",
["鳝"]="鱔",
["鳞"]="鱗",
["鳟"]="鱒",
["鳠"]="鱯",
["鳡"]="鱤",
["鳢"]="鱧",
["鳣"]="鱣",
["鳤"]="䲘",
["鸟"]="鳥",
["鸠"]="鳩",
["鸡"]="雞",
["鸢"]="鳶",
["鸣"]="鳴",
["鸤"]="鳲",
["鸥"]="鷗",
["鸦"]="鴉",
["鸧"]="鶬",
["鸨"]="鴇",
["鸩"]="鴆",
["鸪"]="鴣",
["鸫"]="鶇",
["鸬"]="鸕",
["鸭"]="鴨",
["鸮"]="鴞",
["鸯"]="鴦",
["鸰"]="鴒",
["鸱"]="鴟",
["鸲"]="鴝",
["鸳"]="鴛",
["鸴"]="鷽",
["鸵"]="鴕",
["鸶"]="鷥",
["鸷"]="鷙",
["鸸"]="鴯",
["鸹"]="鴰",
["鸺"]="鵂",
["鸻"]="鴴",
["鸼"]="鵃",
["鸽"]="鴿",
["鸾"]="鸞",
["鸿"]="鴻",
["鹀"]="鵐",
["鹁"]="鵓",
["鹂"]="鸝",
["鹃"]="鵑",
["鹄"]="鵠",
["鹅"]="鵝",
["鹆"]="鵒",
["鹇"]="鷳",
["鹈"]="鵜",
["鹉"]="鵡",
["鹊"]="鵲",
["鹋"]="鶓",
["鹌"]="鵪",
["鹍"]="鵾",
["鹎"]="鵯",
["鹏"]="鵬",
["鹐"]="鵮",
["鹑"]="鶉",
["鹒"]="鶊",
["鹓"]="鵷",
["鹔"]="鷫",
["鹕"]="鶘",
["鹖"]="鶡",
["鹗"]="鶚",
["鹘"]="鶻",
["鹙"]="鶖",
["鹚"]="鶿",
["鹛"]="鶥",
["鹜"]="鶩",
["鹝"]="鷊",
["鹞"]="鷂",
["鹟"]="鶲",
["鹠"]="鶹",
["鹡"]="鶺",
["鹢"]="鷁",
["鹣"]="鶼",
["鹤"]="鶴",
["鹥"]="鷖",
["鹦"]="鸚",
["鹧"]="鷓",
["鹨"]="鷚",
["鹩"]="鷯",
["鹪"]="鷦",
["鹫"]="鷲",
["鹬"]="鷸",
["鹭"]="鷺",
["鹮"]="䴉",
["鹯"]="鸇",
["鹰"]="鷹",
["鹱"]="鸌",
["鹲"]="鸏",
["鹳"]="鸛",
["鹴"]="鸘",
["鹾"]="鹺",
["麦"]="麥",
["麸"]="麩",
["麹"]="麴",
["黄"]="黃",
["黉"]="黌",
["黡"]="黶",
["黩"]="黷",
["黪"]="黲",
["黾"]="黽",
["鼋"]="黿",
["鼌"]="鼂",
["鼍"]="鼉",
["鼗"]="鞀",
["鼹"]="鼴",
["齐"]="齊",
["齑"]="齏",
["齿"]="齒",
["龀"]="齔",
["龁"]="齕",
["龂"]="齗",
["龃"]="齟",
["龄"]="齡",
["龅"]="齙",
["龆"]="齠",
["龇"]="齜",
["龈"]="齦",
["龉"]="齬",
["龊"]="齪",
["龋"]="齲",
["龌"]="齷",
["龙"]="龍",
["龚"]="龔",
["龛"]="龕",
["龟"]="龜",
["鿎"]="䃮",
["鿏"]="䥑",
["鿒"]="鿓",
["鿔"]="鎶",
["鿕"]="𱆥",
["鿟"]="鿠",
["鿭"]="鉨",
["鿰"]="𬉧",
["鿲"]="𧰎",
["鿴"]="鮗",
["鿵"]="𩷓",
["鿶"]="𩷕",
["鿷"]="𩹎",
["鿸"]="鿳",
["鿹"]="𬵨",
["鿺"]="𪄳",
["𠀾"]="𠁞",
["𠃓"]="昜",
["𠆲"]="儣",
["𠆿"]="𠌥",
["𠇐"]="㒜",
["𠇹"]="俓",
["𠈙"]="俴",
["𠉂"]="㒓",
["𠊟"]="僶",
["𠋆"]="儭",
["𠛅"]="剾",
["𠡠"]="勑",
["𠬤"]="睪",
["𠯟"]="哯",
["𠯠"]="噅",
["𠰱"]="㘉",
["𠰷"]="嚧",
["𠵾"]="㗲",
["𡍣"]="𡔖",
["𡒄"]="壈",
["𡛰"]="嬂",
["𡝠"]="㜷",
["𡞋"]="㜗",
["𡞱"]="㜢",
["𡠟"]="孎",
["𡥧"]="孻",
["𡨡"]="寏",
["𡩁"]="寴",
["𡵝"]="嵸",
["𡶴"]="嵼",
["𡺃"]="嶈",
["𡺄"]="嶘",
["𢀖"]="巠",
["𢋈"]="㢝",
["𢗓"]="㦛",
["𢙏"]="愻",
["𢙐"]="憹",
["𢙒"]="憢",
["𢙓"]="懀",
["𢚾"]="愌",
["𢛯"]="㦎",
["𢧐"]="戰",
["𢪓"]="擧",
["𢫊"]="𢷮",
["𢫘"]="攎",
["𢫬"]="摋",
["𢬍"]="擫",
["𢭏"]="擣",
["𢽾"]="斅",
["𣃁"]="斸",
["𣆐"]="曥",
["𣍨"]="𦢈",
["𣍯"]="腪",
["𣍰"]="脥",
["𣎑"]="臗",
["𣏢"]="槫",
["𣐕"]="桱",
["𣒌"]="楇",
["𣓿"]="橯",
["𣔌"]="樤",
["𣗊"]="樠",
["𣗋"]="欓",
["𣗙"]="㰙",
["𣘐"]="㯤",
["𣘴"]="檭",
["𣚚"]="欘",
["𣞎"]="𣠩",
["𣨼"]="殢",
["𣯣"]="𣯩",
["𣱝"]="氭",
["𣲗"]="湋",
["𣲘"]="潕",
["𣳆"]="㵗",
["𣶇"]="灑",
["𣶩"]="澅",
["𣷷"]="𤅶",
["𣸣"]="濆",
["𣸨"]="濙",
["𣺼"]="灙",
["𣽷"]="瀃",
["𤆓"]="爌",
["𤆢"]="㷍",
["𤇃"]="爄",
["𤇄"]="熌",
["𤇭"]="爖",
["𤇹"]="熚",
["𤇻"]="𭶙",
["𤈶"]="熉",
["𤈷"]="㷿",
["𤊀"]="𤒎",
["𤊰"]="𤓩",
["𤋏"]="熡",
["𤎺"]="㸇",
["𤎻"]="𤑳",
["𤙯"]="𤛮",
["𤝢"]="𤢟",
["𤞃"]="獩",
["𤞤"]="玁",
["𤠋"]="㺏",
["𤥺"]="瑍",
["𤦀"]="瓕",
["𤩽"]="瓛",
["𤶊"]="癐",
["𤶧"]="𤸫",
["𤻊"]="㿗",
["𤽯"]="㿧",
["𤾀"]="皟",
["𤿲"]="麬",
["𥁢"]="䀉",
["𥅴"]="䀹",
["𥆧"]="瞤",
["𥇢"]="䁪",
["𥎝"]="䂎",
["𥐟"]="礒",
["𥐰"]="𥕥",
["𥐻"]="碙",
["𥒎"]="碊",
["𥘌"]="禨",
["𥟂"]="䅘",
["𥫣"]="籅",
["𥬞"]="籋",
["𥬠"]="篘",
["𥮜"]="䉲",
["𥮾"]="篸",
["𥱔"]="𥵃",
["𥸯"]="䊪",
["𥹥"]="𥼽",
["𥺅"]="䊭",
["𦈉"]="緷",
["𦈌"]="綀",
["𦈎"]="繟",
["𦈏"]="緍",
["𦈐"]="縺",
["𦈑"]="緸",
["𦈓"]="䋿",
["𦈔"]="縎",
["𦈕"]="緰",
["𦈖"]="䌈",
["𦈘"]="䌋",
["𦈙"]="䌰",
["𦈚"]="縬",
["𦈛"]="繓",
["𦈜"]="䌖",
["𦈝"]="繏",
["𦈞"]="䌟",
["𦈟"]="䌝",
["𦈠"]="䌥",
["𦈡"]="繻",
["𦍠"]="䍽",
["𦛨"]="朥",
["𦝼"]="膢",
["𦬼"]="薾",
["𦭬"]="𢄋",
["𦮜"]="𣂈",
["𦰏"]="蓧",
["𦰴"]="䕳",
["𦲞"]="蔘",
["𦴇"]="𦾵",
["𦻕"]="蘟",
["𦼖"]="𥣻",
["𧉞"]="䗿",
["𧊄"]="蟙",
["𧏖"]="蠙",
["𧏗"]="蠀",
["𧑏"]="蠾",
["𧜭"]="䙱",
["𧝝"]="襰",
["𧮪"]="詀",
["𧹑"]="䞈",
["𧹒"]="買",
["𧹕"]="䝻",
["𧹖"]="賟",
["𧹗"]="贃",
["𨀁"]="躘",
["𨂺"]="𨈊",
["𨄄"]="𨈌",
["𨅛"]="䠱",
["𨅬"]="躝",
["𨐅"]="軗",
["𨐈"]="輄",
["𨐉"]="𨎮",
["𨑹"]="䢨",
["𨧮"]="䥸",
["𨰾"]="鎷",
["𨰿"]="釳",
["𨱁"]="鈠",
["𨱂"]="鈋",
["𨱃"]="鈲",
["𨱄"]="鈯",
["𨱅"]="鉁",
["𨱆"]="龯",
["𨱇"]="銶",
["𨱈"]="鋉",
["𨱉"]="鍄",
["𨱋"]="錂",
["𨱌"]="鏆",
["𨱍"]="鎯",
["𨱎"]="鍮",
["𨱏"]="鎝",
["𨱑"]="鐄",
["𨱒"]="鏉",
["𨱓"]="鐎",
["𨱔"]="鐏",
["𨱖"]="䥩",
["𨷿"]="䦳",
["𨸂"]="閍",
["𨸃"]="閐",
["𨸄"]="䦘",
["𨸟"]="䧢",
["𩉜"]="鞿",
["𩏼"]="䪏",
["𩏽"]="𩏪",
["𩏿"]="䪘",
["𩐀"]="䪗",
["𩖖"]="顃",
["𩖗"]="䫴",
["𩙥"]="颰",
["𩙧"]="䬞",
["𩙪"]="颷",
["𩙫"]="颾",
["𩙮"]="䬘",
["𩙯"]="䬝",
["𩠃"]="𩛩",
["𩠇"]="䭀",
["𩠈"]="䭃",
["𩠌"]="餸",
["𩧨"]="駎",
["𩧪"]="䮾",
["𩧫"]="駚",
["𩧭"]="䭿",
["𩧯"]="驋",
["𩧰"]="䮝",
["𩧱"]="𩥉",
["𩧲"]="駧",
["𩧴"]="駩",
["𩧺"]="駶",
["𩧼"]="𩣺",
["𩧿"]="䮠",
["𩨀"]="騔",
["𩨁"]="䮞",
["𩨃"]="騝",
["𩨄"]="騪",
["𩨇"]="䮫",
["𩨈"]="騟",
["𩨊"]="騚",
["𩨍"]="𩥇",
["𩨎"]="龭",
["𩨏"]="䮳",
["𩩈"]="䯤",
["𩬣"]="𩭙",
["𩭹"]="鬖",
["𩰰"]="𩰹",
["𩴌"]="𩴵",
["𩽹"]="魥",
["𩽺"]="𩵩",
["𩽼"]="鯶",
["𩽾"]="鮟",
["𩾁"]="鯄",
["𩾂"]="䲖",
["𩾃"]="鮸",
["𩾇"]="鯱",
["𩾈"]="䱙",
["𩾊"]="䱬",
["𩾋"]="䱰",
["𩾌"]="鱇",
["𪉂"]="䲰",
["𪉃"]="鳼",
["𪉅"]="𪀦",
["𪉆"]="鴲",
["𪉊"]="鷨",
["𪉍"]="鵚",
["𪉑"]="鷔",
["𪎈"]="䴬",
["𪎊"]="麨",
["𪎋"]="䴴",
["𪎌"]="麳",
["𪑅"]="䵳",
["𪚐"]="𪘯",
["𪛞"]="𤪤",
["𪞝"]="凙",
["𪟎"]="㔋",
["𪟝"]="勣",
["𪠏"]="𥀬",
["𪠟"]="㓄",
["𪠳"]="唓",
["𪠵"]="㖮",
["𪠸"]="嚛",
["𪠽"]="噹",
["𪡀"]="嘺",
["𪡃"]="嘪",
["𪡋"]="噞",
["𪡏"]="嗹",
["𪡛"]="㗿",
["𪡞"]="嘳",
["𪢌"]="㘓",
["𪢐"]="𡃤",
["𪢕"]="嚽",
["𪢠"]="囒",
["𪢮"]="圞",
["𪢸"]="墲",
["𪣆"]="埬",
["𪣑"]="",
["𪣒"]="堚",
["𪣻"]="塿",
["𪥫"]="孇",
["𪥰"]="嬣",
["𪥿"]="嬻",
["𪧀"]="孾",
["𪧘"]="寠",
["𪨇"]="",
["𪨊"]="㞞",
["𪨗"]="屩",
["𪨧"]="崙",
["𪨶"]="輋",
["𪨷"]="巗",
["𪩇"]="㟺",
["𪩎"]="巊",
["𪩘"]="巘",
["𪩷"]="幝",
["𪩸"]="幩",
["𪪏"]="廬",
["𪪑"]="㢗",
["𪪞"]="廧",
["𪪴"]="𢍰",
["𪪼"]="彃",
["𪫌"]="徿",
["𪫷"]="㦞",
["𪫺"]="憸",
["𪭢"]="摐",
["𪭵"]="掚",
["𪭾"]="撊",
["𪮃"]="㨻",
["𪮋"]="㩋",
["𪮖"]="撧",
["𪮳"]="𢺳",
["𪮶"]="攋",
["𪯋"]="㪎",
["𪰶"]="曊",
["𪱥"]="膹",
["𪱷"]="梖",
["𪱾"]="檷",
["𪲎"]="櫅",
["𪲔"]="欐",
["𪲮"]="櫠",
["𪳍"]="欇",
["𪵑"]="毊",
["𪵣"]="霼",
["𪵱"]="濿",
["𪶄"]="溡",
["𪷍"]="㵾",
["𪷽"]="灒",
["𪸕"]="熂",
["𪸩"]="煇",
["𪹳"]="爥",
["𪺪"]="𤜆",
["𪺭"]="犞",
["𪺴"]="㹙",
["𪺷"]="獊",
["𪺻"]="㺜",
["𪺽"]="猌",
["𪻐"]="瑽",
["𪻨"]="瓄",
["𪻲"]="瑻",
["𪻺"]="璝",
["𪼋"]="㻶",
["𪽈"]="畼",
["𪽪"]="痮",
["𪽮"]="㿖",
["𪽷"]="瘱",
["𪾔"]="盨",
["𪾢"]="睍",
["𪾣"]="眝",
["𪾦"]="矑",
["𪾸"]="矉",
["𪿫"]="礮",
["𫀨"]="䅐",
["𫀬"]="䅳",
["𫁂"]="䆉",
["𫁟"]="竱",
["𫁡"]="鴗",
["𫁲"]="䉑",
["𫁳"]="𥯤",
["𫁷"]="䉶",
["𫂃"]="簢",
["𫂆"]="簂",
["𫂈"]="䉬",
["𫄚"]="䊺",
["𫄛"]="紟",
["𫄜"]="䋃",
["𫄞"]="䋔",
["𫄟"]="絁",
["𫄠"]="絙",
["𫄡"]="絧",
["𫄢"]="絥",
["𫄣"]="繷",
["𫄤"]="繨",
["𫄥"]="纚",
["𫄧"]="綖",
["𫄨"]="絺",
["𫄩"]="䋦",
["𫄫"]="綟",
["𫄬"]="緤",
["𫄭"]="緮",
["𫄮"]="䋼",
["𫄰"]="縍",
["𫄱"]="繬",
["𫄲"]="縸",
["𫄳"]="縰",
["𫄴"]="繂",
["𫄶"]="繈",
["𫄷"]="繶",
["𫄸"]="纁",
["𫄹"]="纗",
["𫅅"]="䍤",
["𫅗"]="羵",
["𫅭"]="䎙",
["𫆏"]="聻",
["𫇘"]="𦧺",
["𫇦"]="𤇾",
["𫇭"]="蒍",
["𫇴"]="蒭",
["𫈉"]="蕳",
["𫈎"]="葝",
["𫈟"]="蔯",
["𫈵"]="蕝",
["𫉁"]="薆",
["𫉄"]="藷",
["𫊪"]="䗅",
["𫊮"]="蠦",
["𫊸"]="蟜",
["𫊻"]="蟳",
["𫋇"]="蟂",
["𫋌"]="蟘",
["𫋲"]="䙔",
["𫋷"]="襗",
["𫋹"]="襓",
["𫋻"]="襘",
["𫌀"]="襀",
["𫌇"]="襵",
["𫌋"]="𧞫",
["𫌨"]="覼",
["𫌪"]="覛",
["𫌭"]="覹",
["𫌯"]="䚩",
["𫍙"]="訑",
["𫍚"]="訞",
["𫍛"]="訜",
["𫍜"]="詓",
["𫍠"]="䛄",
["𫍡"]="詑",
["𫍢"]="譊",
["𫍣"]="詷",
["𫍤"]="譑",
["𫍥"]="誂",
["𫍦"]="譨",
["𫍧"]="誺",
["𫍨"]="誫",
["𫍩"]="諣",
["𫍪"]="誋",
["𫍫"]="䛳",
["𫍬"]="誷",
["𫍮"]="誳",
["𫍯"]="諴",
["𫍰"]="諰",
["𫍱"]="諯",
["𫍲"]="謏",
["𫍳"]="諥",
["𫍴"]="謱",
["𫍵"]="謸",
["𫍷"]="謉",
["𫍸"]="謆",
["𫍹"]="謯",
["𫍻"]="譆",
["𫍽"]="譞",
["𫍿"]="譾",
["𫎆"]="豵",
["𫎌"]="貗",
["𫎦"]="贚",
["𫎧"]="䝭",
["𫎩"]="賝",
["𫎪"]="䞋",
["𫎫"]="贉",
["𫎬"]="贑",
["𫎭"]="䞓",
["𫎱"]="䟐",
["𫎳"]="䟆",
["𫎺"]="䟃",
["𫏃"]="䠆",
["𫏆"]="蹳",
["𫏋"]="蹻",
["𫏌"]="𨂐",
["𫏐"]="蹔",
["𫏕"]="𨆪",
["𫐄"]="軏",
["𫐆"]="轣",
["𫐇"]="軜",
["𫐈"]="軷",
["𫐉"]="軨",
["𫐊"]="軬",
["𫐌"]="軿",
["𫐎"]="輢",
["𫐏"]="輖",
["𫐐"]="輗",
["𫐑"]="輨",
["𫐒"]="輷",
["𫐓"]="輮",
["𫐕"]="轊",
["𫐖"]="轇",
["𫐗"]="轐",
["𫐘"]="轗",
["𫐙"]="轠",
["𫐷"]="遱",
["𫑘"]="鄟",
["𫑡"]="鄳",
["𫑷"]="醶",
["𫓥"]="釟",
["𫓦"]="釨",
["𫓧"]="鈇",
["𫓩"]="鏦",
["𫓪"]="鈆",
["𫓬"]="鉔",
["𫓭"]="鉠",
["𫓯"]="銈",
["𫓰"]="銊",
["𫓱"]="鐈",
["𫓲"]="銁",
["𫓴"]="鉾",
["𫓵"]="鋠",
["𫓶"]="鋗",
["𫓸"]="錽",
["𫓹"]="錤",
["𫓺"]="鐪",
["𫓻"]="錜",
["𫓽"]="錝",
["𫓾"]="錥",
["𫔁"]="鐼",
["𫔂"]="鍉",
["𫔃"]="𨰲",
["𫔄"]="鍒",
["𫔅"]="鎍",
["𫔆"]="䥯",
["𫔇"]="鎞",
["𫔈"]="鎙",
["𫔉"]="𨰃",
["𫔋"]="䥗",
["𫔌"]="鏾",
["𫔍"]="鐇",
["𫔎"]="鐍",
["𫔔"]="鑴",
["𫔭"]="開",
["𫔯"]="閗",
["𫔰"]="閞",
["𫔴"]="閵",
["𫔵"]="䦯",
["𫔶"]="闑",
["𫕥"]="霣",
["𫖃"]="靧",
["𫖅"]="䪊",
["𫖇"]="鞾",
["𫖒"]="韠",
["𫖔"]="韛",
["𫖕"]="韝",
["𫖫"]="䪴",
["𫖬"]="䪾",
["𫖮"]="顗",
["𫖯"]="頫",
["𫖰"]="䫂",
["𫖱"]="䫀",
["𫖲"]="䫟",
["𫖳"]="頵",
["𫖵"]="𩓥",
["𫖶"]="顅",
["𫖸"]="願",
["𫖹"]="顣",
["𫖺"]="䫶",
["𫗇"]="䫻",
["𫗉"]="𩗴",
["𫗊"]="䬓",
["𫗋"]="飋",
["𫗚"]="𩟗",
["𫗞"]="飦",
["𫗟"]="䬧",
["𫗠"]="餦",
["𫗢"]="飵",
["𫗣"]="飶",
["𫗥"]="餫",
["𫗦"]="餔",
["𫗧"]="餗",
["𫗩"]="饠",
["𫗪"]="餧",
["𫗫"]="餬",
["𫗬"]="餪",
["𫗮"]="餭",
["𫗰"]="䭔",
["𫗱"]="䭑",
["𫗴"]="饘",
["𫗵"]="饟",
["𫘛"]="馯",
["𫘜"]="馼",
["𫘝"]="駃",
["𫘞"]="駞",
["𫘟"]="駊",
["𫘠"]="駤",
["𫘡"]="駫",
["𫘣"]="駻",
["𫘤"]="騃",
["𫘥"]="騉",
["𫘦"]="騊",
["𫘧"]="騄",
["𫘨"]="騠",
["𫘩"]="騜",
["𫘪"]="騵",
["𫘫"]="騴",
["𫘬"]="騱",
["𫘭"]="騻",
["𫘮"]="䮰",
["𫘯"]="驓",
["𫘰"]="驙",
["𫘱"]="驨",
["𫘽"]="鬠",
["𫚈"]="鱮",
["𫚉"]="魟",
["𫚊"]="鰑",
["𫚋"]="鱄",
["𫚌"]="魦",
["𫚍"]="魵",
["𫚏"]="䱁",
["𫚐"]="䱀",
["𫚑"]="鮅",
["𫚒"]="鮄",
["𫚓"]="鮤",
["𫚔"]="鮰",
["𫚕"]="鰤",
["𫚖"]="鮆",
["𫚗"]="鮯",
["𫚙"]="鯆",
["𫚚"]="鮿",
["𫚛"]="鮵",
["𫚜"]="䲅",
["𫚞"]="鯬",
["𫚠"]="䱧",
["𫚡"]="鯞",
["𫚢"]="鰋",
["𫚣"]="鯾",
["𫚤"]="鰦",
["𫚥"]="鰕",
["𫚦"]="鰫",
["𫚧"]="鰽",
["𫚪"]="鱊",
["𫚫"]="鱢",
["𫚭"]="鱲",
["𫛚"]="鳽",
["𫛛"]="鳷",
["𫛜"]="鴀",
["𫛝"]="鴅",
["𫛞"]="鴃",
["𫛟"]="鸗",
["𫛡"]="鴔",
["𫛢"]="鸋",
["𫛣"]="鴥",
["𫛤"]="鴐",
["𫛥"]="鵊",
["𫛦"]="鴮",
["𫛨"]="鵧",
["𫛩"]="鴳",
["𫛪"]="鴽",
["𫛫"]="鶰",
["𫛬"]="䳜",
["𫛭"]="鵟",
["𫛮"]="䳤",
["𫛯"]="鶭",
["𫛰"]="䳢",
["𫛱"]="鵫",
["𫛳"]="鵩",
["𫛴"]="鷤",
["𫛵"]="鶌",
["𫛶"]="鶒",
["𫛷"]="鶦",
["𫛸"]="鶗",
["𫛺"]="䳧",
["𫛼"]="䳫",
["𫛽"]="鷅",
["𫜀"]="鷐",
["𫜁"]="鷩",
["𫜃"]="鷣",
["𫜄"]="鷷",
["𫜅"]="䴋",
["𫜑"]="麷",
["𫜒"]="䴱",
["𫜔"]="䴽",
["𫜙"]="䵴",
["𫜨"]="䶕",
["𫜪"]="齩",
["𫜬"]="齰",
["𫜭"]="齭",
["𫜮"]="齴",
["𫜰"]="齾",
["𫜲"]="龓",
["𫜳"]="䶲",
["𫜷"]="𨞪",
["𫝈"]="㑮",
["𫝋"]="𠐊",
["𫝦"]="㛝",
["𫝧"]="㜐",
["𫝨"]="媈",
["𫝩"]="嬦",
["𫝪"]="𡟫",
["𫝫"]="婡",
["𫝬"]="嬇",
["𫝭"]="孆",
["𫝮"]="孄",
["𫝵"]="嶹",
["𫞅"]="𣎟",
["𫞗"]="潣",
["𫞚"]="澬",
["𫞛"]="㶆",
["𫞝"]="灍",
["𫞠"]="爧",
["𫞡"]="爃",
["𫞢"]="𤛱",
["𫞣"]="㹽",
["𫞥"]="珼",
["𫞦"]="璾",
["𫞧"]="𤩂",
["𫞨"]="璼",
["𫞩"]="璊",
["𫞷"]="𥢶",
["𫟃"]="絍",
["𫟄"]="綋",
["𫟅"]="綡",
["𫟆"]="緟",
["𫟇"]="𦆲",
["𫟑"]="䖅",
["𫟕"]="䕤",
["𫟞"]="訨",
["𫟟"]="詊",
["𫟠"]="譂",
["𫟡"]="誴",
["𫟢"]="䜖",
["𫟤"]="䡐",
["𫟥"]="䡩",
["𫟦"]="䡵",
["𫟫"]="𨞺",
["𫟬"]="𨟊",
["𫟲"]="釚",
["𫟳"]="釲",
["𫟴"]="鈖",
["𫟵"]="鈗",
["𫟶"]="銏",
["𫟷"]="鉝",
["𫟸"]="鉽",
["𫟹"]="鉷",
["𫟺"]="䤤",
["𫟻"]="銂",
["𫟼"]="鐽",
["𫟽"]="𨧰",
["𫟾"]="𨩰",
["𫟿"]="鎈",
["𫠀"]="䥄",
["𫠁"]="鑉",
["𫠂"]="閝",
["𫠅"]="韚",
["𫠆"]="頍",
["𫠇"]="𩖰",
["𫠈"]="䫾",
["𫠊"]="䮄",
["𫠋"]="騼",
["𫠌"]="𩦠",
["𫠏"]="𩵦",
["𫠐"]="魽",
["𫠑"]="䱸",
["𫠒"]="鱆",
["𫠖"]="𩿅",
["𫠜"]="齯",
["𫢒"]="儱",
["𫢙"]="働",
["𫢪"]="僆",
["𫢬"]="僗",
["𫢭"]="儰",
["𫢲"]="𫣴",
["𫢸"]="僤",
["𫢺"]="傪",
["𫣉"]="儖",
["𫣊"]="僾",
["𫦅"]="㔅",
["𫦌"]="㔃",
["𫦕"]="𠠜",
["𫦩"]="㔝",
["𫦰"]="𫦸",
["𫦳"]="㔢",
["𫧃"]="𣍐",
["𫧮"]="𪋿",
["𫧯"]="卨",
["𫧿"]="贕",
["𫩕"]="嚝",
["𫩛"]="㗰",
["𫩤"]="㗼",
["𫩩"]="㗙",
["𫩫"]="嚈",
["𫩳"]="𠼮",
["𫩺"]="嚍",
["𫪀"]="㗻",
["𫪁"]="唻",
["𫪂"]="㘙",
["𫪄"]="𠼤",
["𫪘"]="𡂿",
["𫪧"]="嘄",
["𫪺"]="㗣",
["𫫇"]="噁",
["𫫦"]="嚪",
["𫫾"]="嚬",
["𫬐"]="㘔",
["𫭞"]="塼",
["𫭟"]="塸",
["𫭢"]="埨",
["𫭨"]="墢",
["𫭪"]="墝",
["𫭲"]="壧",
["𫭼"]="𡑍",
["𫮃"]="墠",
["𫮅"]="墋",
["𫮜"]="㙬",
["𫯥"]="奯",
["𫰂"]="奲",
["𫰍"]="媁",
["𫰐"]="婜",
["𫰛"]="娙",
["𫰠"]="㜭",
["𫰡"]="嬅",
["𫰢"]="嬒",
["𫰨"]="㜥",
["𫰰"]="嬐",
["𫰹"]="嫢",
["𫱕"]="㜮",
["𫲗"]="㜺",
["𫳃"]="㝞",
["𫵵"]="崵",
["𫵶"]="𡺨",
["𫵷"]="㠣",
["𫵸"]="𡷨",
["𫶄"]="𫶦",
["𫶅"]="㠁",
["𫶇"]="嵽",
["𫶊"]="𡽳",
["𫶕"]="巆",
["𫶲"]="𣫒",
["𫷅"]="㡓",
["𫷌"]="𢅡",
["𫷬"]="庲",
["𫷮"]="廕",
["𫷷"]="廞",
["𫷹"]="廔",
["𫷾"]="廮",
["𫸩"]="彄",
["𫹮"]="懙",
["𫹴"]="愇",
["𫹽"]="慯",
["𫺁"]="㤲",
["𫺂"]="悏",
["𫺆"]="㦊",
["𫺊"]="懠",
["𫺌"]="愩",
["𫺓"]="㦖",
["𫺘"]="憦",
["𫺷"]="戁",
["𫻁"]="㦦",
["𫼝"]="搊",
["𫼟"]="摥",
["𫼣"]="𢳂",
["𫼤"]="𢯩",
["𫼥"]="㨟",
["𫼧"]="撶",
["𫼪"]="摌",
["𫼮"]="擃",
["𫼱"]="摃",
["𫼵"]="𢲸",
["𫼾"]="𢲩",
["𫽀"]="㨥",
["𫽁"]="摙",
["𫽇"]="㩇",
["𫽊"]="㩭",
["𫽋"]="攞",
["𫽣"]="摪",
["𫽥"]="攑",
["𫽧"]="㩌",
["𫽮"]="攩",
["𫾉"]="㩣",
["𫿳"]="㪻",
["𬀩"]="暐",
["𬀪"]="晛",
["𬀮"]="㬣",
["𬀱"]="暟",
["𬁢"]="曫",
["𬁵"]="膒",
["𬁺"]="𦜖",
["𬁽"]="䐣",
["𬂀"]="膶",
["𬂂"]="𦣇",
["𬂅"]="䐷",
["𬂉"]="賸",
["𬂠"]="橅",
["𬂩"]="梜",
["𬂮"]="榝",
["𬂰"]="檂",
["𬂱"]="𪳷",
["𬃀"]="槻",
["𬃊"]="櫍",
["𬃘"]="樲",
["𬃲"]="䫐",
["𬄩"]="櫽",
["𬅉"]="欗",
["𬅢"]="㰰",
["𬅥"]="歄",
["𬅫"]="歕",
["𬆦"]="毄",
["𬆮"]="鷇",
["𬆾"]="覒",
["𬇕"]="澫",
["𬇘"]="漙",
["𬇙"]="浿",
["𬇰"]="㵍",
["𬇹"]="漍",
["𬈁"]="潬",
["𬈕"]="㵒",
["𬈜"]="濴",
["𬈧"]="濇",
["𬉇"]="㵤",
["𬉋"]="瀢",
["𬉏"]="瀩",
["𬉠"]="灡",
["𬉼"]="熰",
["𬊂"]="煼",
["𬊈"]="燖",
["𬊉"]="燵",
["𬊍"]="燽",
["𬊎"]="熕",
["𬊖"]="燘",
["𬊜"]="𤓓",
["𬊤"]="燀",
["𬊦"]="覢",
["𬊵"]="爣",
["𬊶"]="爁",
["𬊺"]="燰",
["𬊾"]="㸐",
["𬋍"]="㸊",
["𬌛"]="㹂",
["𬌝"]="犓",
["𬌮"]="獟",
["𬌷"]="㺑",
["𬍙"]="琖",
["𬍛"]="瓅",
["𬍜"]="𤪥",
["𬍡"]="璗",
["𬍤"]="璕",
["𬎆"]="㼆",
["𬎑"]="瓓",
["𬎧"]="㼻",
["𬏜"]="㾺",
["𬏟"]="㾵",
["𬏦"]="癈",
["𬏮"]="瘑",
["𬏷"]="㿎",
["𬐠"]="𥂸",
["𬑆"]="睔",
["𬑏"]="䀴",
["𬑒"]="䁱",
["𬑓"]="瞱",
["𬑕"]="睴",
["𬑗"]="瞷",
["𬑧"]="矊",
["𬒆"]="礏",
["𬒈"]="礐",
["𬒍"]="磒",
["𬒎"]="䃘",
["𬒕"]="䃤",
["𬒗"]="𥗽",
["𬓠"]="穖",
["𬓸"]="䵘",
["𬓼"]="穨",
["𬕂"]="篢",
["𬕄"]="籭",
["𬕊"]="䉍",
["𬕛"]="䉐",
["𬕦"]="䉱",
["𬖃"]="籫",
["𬖑"]="粯",
["𬖘"]="𥼶",
["𬖠"]="㪹",
["𬖮"]="糮",
["𬘓"]="紃",
["𬘕"]="紌",
["𬘖"]="絸",
["𬘘"]="紞",
["𬘙"]="䋐",
["𬘛"]="紶",
["𬘜"]="䋎",
["𬘝"]="紾",
["𬘟"]="絤",
["𬘠"]="絠",
["𬘡"]="絪",
["𬘢"]="絖",
["𬘤"]="絽",
["𬘥"]="絟",
["𬘨"]="綕",
["𬘩"]="綎",
["𬘪"]="䌞",
["𬘫"]="綄",
["𬘬"]="綪",
["𬘭"]="綝",
["𬘮"]="䌐",
["𬘯"]="綧",
["𬘰"]="緛",
["𬘱"]="䌁",
["𬘲"]="䋾",
["𬘴"]="䋺",
["𬘵"]="縆",
["𬘶"]="緧",
["𬘷"]="縒",
["𬘺"]="縚",
["𬘻"]="縖",
["𬙁"]="䌪",
["𬙂"]="縯",
["𬙆"]="繙",
["𬙇"]="繎",
["𬙈"]="繗",
["𬙉"]="繵",
["𬙊"]="纆",
["𬙋"]="纕",
["𬙎"]="罏",
["𬙝"]="罼",
["𬙭"]="䍷",
["𬙯"]="羜",
["𬚄"]="䎘",
["𬛹"]="䑗",
["𬛼"]="轝",
["𬜤"]="菣",
["𬜥"]="葻",
["𬜧"]="蕟",
["𬜨"]="薉",
["𬜬"]="蔄",
["𬜯"]="䓣",
["𬜾"]="藖",
["𬜿"]="蔮",
["𬝁"]="䔡",
["𬝃"]="𤎤",
["𬝯"]="薲",
["𬝴"]="䕼",
["𬞕"]="蘭",
["𬞘"]="藬",
["𬞟"]="蘋",
["𬞫"]="蘫",
["𬟁"]="虉",
["𬟪"]="覤",
["𬟺"]="𧐱",
["𬟽"]="蝀",
["𬠅"]="蟷",
["𬠠"]="蠈",
["𬠱"]="𧖦",
["𬡇"]="褭",
["𬡒"]="裌",
["𬡓"]="褺",
["𬡠"]="𧟌",
["𬡷"]="襸",
["𬡻"]="䊲",
["𬢊"]="覗",
["𬢋"]="覜",
["𬢌"]="覟",
["𬢎"]="覩",
["𬢐"]="䚉",
["𬢑"]="䚆",
["𬢒"]="覭",
["𬢔"]="覴",
["𬢯"]="譻",
["𬣀"]="讆",
["𬣙"]="訏",
["𬣛"]="䚳",
["𬣜"]="䚽",
["𬣝"]="𧥺",
["𬣞"]="詝",
["𬣟"]="䚵",
["𬣠"]="詌",
["𬣡"]="諓",
["𬣤"]="詃",
["𬣥"]="詜",
["𬣦"]="詏",
["𬣧"]="䛍",
["𬣨"]="𧧝",
["𬣩"]="詴",
["𬣬"]="䛛",
["𬣭"]="譡",
["𬣮"]="詺",
["𬣯"]="䛘",
["𬣰"]="詯",
["𬣱"]="詶",
["𬣲"]="誁",
["𬣳"]="詪",
["𬣶"]="𧨊",
["𬣷"]="誎",
["𬣸"]="䛞",
["𬣹"]="䛤",
["𬣻"]="誔",
["𬣼"]="誏",
["𬣽"]="謰",
["𬣾"]="諎",
["𬣿"]="䜎",
["𬤀"]="諕",
["𬤁"]="䛬",
["𬤂"]="𧨾",
["𬤄"]="謲",
["𬤇"]="諲",
["𬤉"]="䜋",
["𬤊"]="諟",
["𬤌"]="䛽",
["𬤍"]="諻",
["𬤎"]="諠",
["𬤐"]="謌",
["𬤑"]="䛿",
["𬤗"]="𬣘",
["𬤘"]="䜉",
["𬤙"]="謼",
["𬤛"]="讇",
["𬤝"]="譓",
["𬤟"]="䜍",
["𬤡"]="䜒",
["𬤢"]="譐",
["𬤣"]="譈",
["𬤤"]="譄",
["𬤥"]="譔",
["𬤦"]="讉",
["𬤨"]="譟",
["𬤩"]="譺",
["𬤪"]="䜚",
["𬤫"]="譹",
["𬤬"]="䜝",
["𬤭"]="譿",
["𬤰"]="讙",
["𬥄"]="䝕",
["𬥈"]="䫉",
["𬥊"]="䝡",
["𬥵"]="䝯",
["𬥶"]="貱",
["𬥷"]="𧶄",
["𬥸"]="賗",
["𬥺"]="䞁",
["𬥻"]="䞂",
["𬥽"]="䞀",
["𬥾"]="𧸦",
["𬦅"]="𧼮",
["𬦥"]="䟺",
["𬦣"]="𨇗",
["𬦧"]="踚",
["𬦫"]="𨆅",
["𬦻"]="躀",
["𬦾"]="𨈇",
["𬧀"]="蹡",
["𬧃"]="䠮",
["𬧛"]="𨈆",
["𬧢"]="䡁",
["𬧤"]="軂",
["𬨁"]="軞",
["𬨂"]="軝",
["𬨄"]="軮",
["𬨆"]="䡗",
["𬨇"]="輆",
["𬨈"]="輓",
["𬨉"]="䡘",
["𬨋"]="𨌄",
["𬨌"]="䡟",
["𬨍"]="輵",
["𬨎"]="輶",
["𬨑"]="䡦",
["𬨓"]="轈",
["𬨔"]="䡶",
["𬨕"]="䡹",
["𬨨"]="過",
["𬩽"]="鄩",
["𬩾"]="郲",
["𬪍"]="鄮",
["𬪧"]="醧",
["𬪨"]="醆",
["𬪩"]="醲",
["𬪯"]="𨤋",
["𬪺"]="𨤡",
["𬬧"]="釬",
["𬬨"]="釫",
["𬬩"]="釴",
["𬬫"]="鈚",
["𬬬"]="鍏",
["𬬭"]="錀",
["𬬮"]="鋹",
["𬬯"]="鈓",
["𬬰"]="鎗",
["𬬱"]="釿",
["𬬲"]="釽",
["𬬵"]="鈂",
["𬬷"]="鉐",
["𬬸"]="鉥",
["𬬹"]="鉮",
["𬬺"]="鉏",
["𬬻"]="鑪",
["𬬼"]="𨭥",
["𬬽"]="鈼",
["𬬾"]="鑏",
["𬬿"]="鉊",
["𬭀"]="鈶",
["𬭁"]="鉧",
["𬭃"]="銔",
["𬭅"]="銗",
["𬭆"]="䤪",
["𬭈"]="䤩",
["𬭉"]="鑇",
["𬭊"]="𨧀",
["𬭌"]="鋘",
["𬭍"]="銲",
["𬭎"]="鋐",
["𬭓"]="錪",
["𬭔"]="鑡",
["𬭕"]="錭",
["𬭖"]="錋",
["𬭗"]="錗",
["𬭙"]="𨭐",
["𬭚"]="錞",
["𬭛"]="𨨏",
["𬭜"]="錑",
["𬭝"]="鏒",
["𬭡"]="鍣",
["𬭢"]="鐀",
["𬭣"]="䤼",
["𬭤"]="鍭",
["𬭦"]="鎒",
["𬭨"]="鎚",
["𬭩"]="鎓",
["𬭪"]="鎋",
["𬭫"]="𨫀",
["𬭬"]="鏏",
["𬭭"]="鏚",
["𬭮"]="鏋",
["𬭯"]="䥕",
["𬭰"]="鏔",
["𬭲"]="鏁",
["𬭳"]="𨭎",
["𬭴"]="䥛",
["𬭵"]="𨭌",
["𬭶"]="𨭆",
["𬭸"]="鏻",
["𬭻"]="䥞",
["𬭼"]="鐩",
["𬭽"]="鐴",
["𬮀"]="𨯵",
["𬮁"]="鑮",
["𬮟"]="焛",
["𬮠"]="閜",
["𬮢"]="閧",
["𬮥"]="閦",
["𬮨"]="䦝",
["𬮭"]="闚",
["𬮱"]="闉",
["𬮲"]="闄",
["𬮳"]="闆",
["𬮴"]="闇",
["𬮺"]="䧞",
["𬮻"]="隖",
["𬮿"]="隑",
["𬯀"]="隮",
["𬯎"]="隤",
["𬰣"]="𩉍",
["𬰥"]="䩫",
["𬰳"]="䪓",
["𬰶"]="韢",
["𬰷"]="䪜",
["𬱓"]="頄",
["𬱖"]="頔",
["𬱗"]="頕",
["𬱙"]="頖",
["𬱜"]="頛",
["𬱟"]="頠",
["𬱠"]="頢",
["𬱢"]="顐",
["𬱣"]="䫈",
["𬱦"]="䫏",
["𬱪"]="顊",
["𬱫"]="顁",
["𬱬"]="䫩",
["𬱮"]="䫜",
["𬱯"]="䭭",
["𬱰"]="䫠",
["𬱳"]="龥",
["𬱵"]="颹",
["𬱷"]="䫼",
["𬱸"]="䬂",
["𬱼"]="颽",
["𬱽"]="颴",
["𬱿"]="䬎",
["𬲀"]="䬍",
["𬲅"]="飉",
["𬲕"]="䭕",
["𬲫"]="䬯",
["𬲭"]="飷",
["𬲮"]="䬫",
["𬲯"]="䬲",
["𬲰"]="𩞃",
["𬲲"]="䭢",
["𬲳"]="䭞",
["𬲶"]="䭣",
["𬲷"]="䬶",
["𬲹"]="𩛲",
["𬲻"]="䬾",
["𬲼"]="餣",
["𬲾"]="䭅",
["𬲿"]="𩜠",
["𬳀"]="䭇",
["𬳂"]="餟",
["𬳅"]="䭉",
["𬳆"]="餰",
["𬳊"]="饀",
["𬳋"]="䭒",
["𬳍"]="餹",
["𬳏"]="𩞘",
["𬳑"]="䭘",
["𬳟"]="馩",
["𬳳"]="颿",
["𬳴"]="駍",
["𬳵"]="駓",
["𬳶"]="駉",
["𬳸"]="䮸",
["𬳽"]="駪",
["𬳾"]="䮈",
["𬳿"]="駼",
["𬴀"]="駺",
["𬴁"]="䮗",
["𬴂"]="騑",
["𬴃"]="騞",
["𬴅"]="騯",
["𬴆"]="騹",
["𬴊"]="驎",
["𬴋"]="驖",
["𬴍"]="䮽",
["𬴏"]="䮿",
["𬴐"]="驩",
["𬴩"]="鬞",
["𬶀"]="魝",
["𬶁"]="魜",
["𬶂"]="𩵚",
["𬶄"]="魡",
["𬶆"]="䰷",
["𬶇"]="魪",
["𬶊"]="䱍",
["𬶋"]="鮈",
["𬶌"]="鮘",
["𬶍"]="鮀",
["𬶎"]="䲙",
["𬶏"]="鮠",
["𬶐"]="鮡",
["𬶓"]="䱓",
["𬶕"]="鮷",
["𬶖"]="𩸆",
["𬶗"]="䲏",
["𬶛"]="鱓",
["𬶞"]="鰗",
["𬶟"]="鯻",
["𬶠"]="鰊",
["𬶣"]="䱹",
["𬶤"]="䱱",
["𬶥"]="𱇋",
["𬶧"]="鰇",
["𬶨"]="鱀",
["𬶫"]="鱑",
["𬶬"]="鱋",
["𬶭"]="鰶",
["𬶮"]="鱚",
["𬶲"]="鱌",
["𬶴"]="䲕",
["𬶵"]="鱞",
["𬶺"]="鱹",
["𬷕"]="鵏",
["𬷾"]="䲨",
["𬸀"]="鴍",
["𬸅"]="鶵",
["𬸆"]="䲼",
["𬸈"]="鵄",
["𬸊"]="鵀",
["𬸏"]="𪁜",
["𬸒"]="鶀",
["𬸕"]="鸎",
["𬸘"]="鶠",
["𬸚"]="鸑",
["𬸛"]="䳨",
["𬸜"]="鶣",
["𬸞"]="鷜",
["𬸡"]="𪇖",
["𬸢"]="鷎",
["𬸣"]="鶱",
["𬸦"]="鷟",
["𬸧"]="鷰",
["𬸩"]="䴈",
["𬸪"]="鷭",
["𬸭"]="𪆰",
["𬸮"]="𪆴",
["𬸯"]="鷿",
["𬸱"]="鸜",
["𬸾"]="麡",
["𬹅"]="䴭",
["𬹉"]="䴷",
["𬹔"]="䵖",
["𬹣"]="鼄",
["𬹭"]="𪕣",
["𬹺"]="齖",
["𬹼"]="齘",
["𬹾"]="𪗳",
["𬹿"]="𪗪",
["𬺃"]="䶣",
["𬺄"]="𪗽",
["𬺈"]="齮",
["𬺉"]="䶦",
["𬺌"]="𪘲",
["𬺍"]="䶢",
["𬺎"]="齹",
["𬺓"]="齼",
["𬺔"]="齽",
["𬺕"]="䶪",
["𬺖"]="𪚅",
["𬺜"]="㰍",
["𬾣"]="𠐮",
["𭄛"]="劗",
["𭇜"]="㗶",
["𭊸"]="𡅘",
["𭎂"]="㙡",
["𭎜"]="壔",
["𭏸"]="壝",
["𭑸"]="𡢿",
["𭘓"]="幠",
["𭚦"]="彍",
["𭝋"]="㦭",
["𭞄"]="懓",
["𭣇"]="攧",
["𭣧"]="斁",
["𭤎"]="斄",
["𭤰"]="旟",
["𭧋"]="曭",
["𭨶"]="𮌲",
["𭩚"]="檥",
["𭩛"]="椚",
["𭩰"]="橃",
["𭪆"]="檛",
["𭫀"]="樻",
["𭭈"]="㰳",
["𭰎"]="澢",
["𭱊"]="澒",
["𭲫"]="灟",
["𭴊"]="㷻",
["𭹜"]="㼈",
["𮀤"]="磱",
["𮀪"]="𥖏",
["𮆏"]="籣",
["𮇔"]="𥺼",
["𮉠"]="䊵",
["𮉡"]="纑",
["𮉢"]="紩",
["𮉣"]="䋏",
["𮉤"]="絓",
["𮉦"]="䋞",
["𮉧"]="緉",
["𮉨"]="緺",
["𮉪"]="緅",
["𮉫"]="緌",
["𮉬"]="綷",
["𮉮"]="繀",
["𮉯"]="縩",
["𮐚"]="薠",
["𮐨"]="蘡",
["𮔂"]="䗻",
["𮔅"]="蝜",
["𮔊"]="蜽",
["𮔚"]="蟧",
["𮖁"]="裲",
["𮖃"]="𧜶",
["𮖱"]="襭",
["𮙊"]="讔",
["𮙋"]="讟",
["𮛗"]="𨆉",
["𮜶"]="軇",
["𮝴"]="軱",
["𮝵"]="輀",
["𮝷"]="轒",
["𮝸"]="輴",
["𮝹"]="轘",
["𮝺"]="轕",
["𮠞"]="䤌",
["𮠳"]="醦",
["𮣲"]="釭",
["𮣳"]="鈜",
["𮣴"]="鋋",
["𮣵"]="錣",
["𮣶"]="鑢",
["𮣷"]="鐻",
["𮤫"]="閅",
["𮤬"]="䦌",
["𮤭"]="𨳒",
["𮤲"]="閟",
["𮤷"]="𬮍",
["𮧴"]="韔",
["𮧵"]="韡",
["𮨴"]="檒",
["𮨵"]="飂",
["𮩛"]="饆",
["𮩜"]="餀",
["𮩝"]="餲",
["𮩞"]="饐",
["𮪡"]="駹",
["𮪢"]="駴",
["𮪣"]="騣",
["𮪤"]="騲",
["𮪥"]="驐",
["𮫂"]="鬡",
["𮬛"]="魣",
["𮬜"]="鮨",
["𮬝"]="鱥",
["𮬞"]="䱗",
["𮬟"]="䱛",
["𮬠"]="䱚",
["𮬡"]="䱻",
["𮬢"]="䱵",
["𮬣"]="䲗",
["𮬤"]="鱵",
["𮭡"]="䲸",
["𮭢"]="鴁",
["𮭤"]="鴓",
["𮭥"]="䳍",
["𮭨"]="鷃",
["𮭪"]="鷞",
["𮭰"]="䴚",
["𮮆"]="麭",
["𮮇"]="麰",
["𮯙"]="䶗",
[""]="㒖",
[""]="儮",
[""]="𠏄",
[""]="𠖥",
[""]="凴",
[""]="喡",
[""]="𡑑",
[""]="𪣷",
[""]="嬟",
[""]="㜰",
[""]="㛍",
[""]="嬧",
[""]="𡢄",
[""]="㜕",
[""]="𡤢",
[""]="𡤶",
[""]="嬝",
[""]="𡠪",
[""]="𪦯",
[""]="㟦",
[""]="㠆",
[""]="𢐟",
[""]="𭜼",
[""]="悓",
[""]="𢞁",
[""]="㦡",
[""]="憅",
[""]="𫺤",
[""]="慖",
[""]="𠅀",
[""]="敳",
[""]="㬢",
[""]="暊",
[""]="𣋪",
[""]="欆",
[""]="㮿",
[""]="㰄",
[""]="𬅁",
[""]="𣿭",
[""]="𣵾",
[""]="澕",
[""]="𣼼",
[""]="𤁐",
[""]="𤅊",
[""]="瀭",
[""]="煈",
[""]="𤆼",
[""]="燆",
[""]="𬊿",
[""]="𤏩",
[""]="𤏳",
[""]="爗",
[""]="𤑚",
[""]="𤒨",
[""]="𤚴",
[""]="㼁",
[""]="𤦎",
[""]="𤧑",
[""]="𤦩",
[""]="𤥵",
[""]="𤧸",
[""]="𤩝",
[""]="璍",
[""]="𤩊",
[""]="㼀",
[""]="𪼑",
[""]="𤫟",
[""]="𤩑",
[""]="𤫎",
[""]="𬎟",
[""]="鴫",
[""]="𥋟",
[""]="𪾳",
[""]="𥔬",
[""]="𥚗",
[""]="𱵭",
[""]="稦",
[""]="𬕜",
[""]="䉆",
[""]="箂",
[""]="紁",
[""]="𬗈",
[""]="𥿑",
[""]="綘",
[""]="縧",
[""]="𫃻",
[""]="𦝛",
[""]="艦",
[""]="䕏",
[""]="𧀀",
[""]="𧂂",
[""]="𬞼",
[""]="𦿭",
[""]="𧜘",
[""]="𧠳",
[""]="諌",
[""]="𧦵",
[""]="𧭥",
[""]="䛴",
[""]="𧩎",
[""]="譒",
[""]="𮚫",
[""]="䡄",
[""]="軚",
[""]="鿂",
[""]="轟",
[""]="轁",
[""]="𨘀",
[""]="𨟑",
[""]="𨮪",
[""]="𨥈",
[""]="𫓔",
[""]="鈨",
[""]="𫒋",
[""]="𩗩",
[""]="𨥤",
[""]="𨥮",
[""]="𬫉",
[""]="𨥭",
[""]="𬫍",
[""]="𨦍",
[""]="鍕",
[""]="𨫋",
[""]="鋓",
[""]="𫒟",
[""]="䤭",
[""]="鋑",
[""]="錺",
[""]="𮢅",
[""]="𮢆",
[""]="𨩃",
[""]="鍢",
[""]="𨩎",
[""]="𨪦",
[""]="𨪜",
[""]="鎧",
[""]="𨯗",
[""]="䥓",
[""]="鏛",
[""]="鑧",
[""]="𨬫",
[""]="𨯂",
[""]="䦖",
[""]="䦣",
[""]="䩤",
[""]="𩔐",
[""]="𩐳",
[""]="顧",
[""]="𩗺",
[""]="飊",
[""]="馪",
[""]="𩢀",
[""]="𩢖",
[""]="𫘋",
[""]="騆",
[""]="𩥈",
[""]="𩵳",
[""]="𬷈",
[""]="䳥",
[""]="鶯",
[""]="䳽",
[""]="䴏",
[""]="龘",
["𰀡"]="臤",
["𰀢"]="𰯲",
["𰁜"]="龻",
["𰁧"]="傱",
["𰁸"]="儅",
["𰁾"]="偩",
["𰂋"]="僴",
["𰂎"]="僩",
["𰂏"]="儥",
["𰂗"]="僀",
["𰂜"]="僓",
["𰂦"]="儢",
["𰂭"]="儩",
["𰃆"]="儹",
["𰃮"]="𦥯",
["𰃷"]="凔",
["𰃻"]="㓖",
["𰃿"]="凟",
["𰄝"]="𭃶",
["𰄞"]="剸",
["𰄭"]="𠠫",
["𰅔"]="勴",
["𰅥"]="匵",
["𰅦"]="匰",
["𰆕"]="㕒",
["𰆚"]="厱",
["𰇀"]="㕢",
["𰇎"]="㖦",
["𰇕"]="唊",
["𰇖"]="㗢",
["𰇠"]="嗧",
["𰇲"]="嗿",
["𰇼"]="嘇",
["𰈆"]="囕",
["𰈇"]="嚐",
["𰈍"]="嚫",
["𰈓"]="嚂",
["𰈮"]="𡃈",
["𰈯"]="囐",
["𰈶"]="嚩",
["𰉁"]="㘖",
["𰉄"]="囋",
["𰉘"]="㙔",
["𰉙"]="堈",
["𰉚"]="垷",
["𰉣"]="墿",
["𰉥"]="埉",
["𰉩"]="墧",
["𰉪"]="墷",
["𰉽"]="㙾",
["𰊂"]="墆",
["𰊈"]="墏",
["𰊑"]="壏",
["𰊛"]="㙺",
["𰊟"]="㙢",
["𰊡"]="壛",
["𰊢"]="壍",
["𰋸"]="婸",
["𰋹"]="嫥",
["𰋽"]="嬮",
["𰌀"]="嫈",
["𰌂"]="媜",
["𰌆"]="㜞",
["𰌇"]="嫧",
["𰌙"]="嬾",
["𰌦"]="孲",
["𰌷"]="寪",
["𰎌"]="嵷",
["𰎎"]="巃",
["𰎏"]="崠",
["𰎐"]="㠠",
["𰎑"]="嶪",
["𰎔"]="嶤",
["𰎖"]="崱",
["𰎞"]="嶩",
["𰏁"]="巑",
["𰏕"]="帴",
["𰏜"]="㡞",
["𰏟"]="幱",
["𰏶"]="廥",
["𰏼"]="廗",
["𰏽"]="𢊃",
["𰐾"]="懭",
["𰐿"]="愓",
["𰑁"]="慱",
["𰑂"]="𢜟",
["𰑄"]="惀",
["𰑔"]="慹",
["𰑕"]="懕",
["𰑙"]="懰",
["𰑟"]="慐",
["𰑥"]="憪",
["𰑧"]="慙",
["𰑪"]="憴",
["𰑫"]="㦬",
["𰑬"]="懫",
["𰑵"]="慸",
["𰑸"]="㥷",
["𰑿"]="戃",
["𰒆"]="慲",
["𰒒"]="懘",
["𰓄"]="掁",
["𰓆"]="摀",
["𰓔"]="㨛",
["𰓙"]="擪",
["𰓜"]="擳",
["𰓧"]="搎",
["𰓬"]="攦",
["𰓱"]="摼",
["𰓷"]="撋",
["𰓻"]="摫",
["𰓼"]="摲",
["𰔇"]="摕",
["𰔋"]="撌",
["𰔲"]="㩷",
["𰕁"]="攳",
["𰕅"]="敺",
["𰕈"]="敿",
["𰕭"]="旝",
["𰖈"]="曮",
["𰖠"]="㬮",
["𰗓"]="櫎",
["𰗖"]="棆",
["𰗘"]="㯺",
["𰗙"]="㮲",
["𰗛"]="檡",
["𰗜"]="檿",
["𰗡"]="㯆",
["𰗢"]="楎",
["𰗦"]="㯸",
["𰗨"]="榯",
["𰗬"]="櫏",
["𰗵"]="㰂",
["𰗹"]="橚",
["𰗺"]="橨",
["𰘀"]="㯂",
["𰘈"]="檋",
["𰘓"]="檾",
["𰘠"]="櫩",
["𰘣"]="檰",
["𰘩"]="櫹",
["𰘳"]="櫴",
["𰘶"]="櫯",
["𰘸"]="櫢",
["𰙋"]="歍",
["𰙎"]="歛",
["𰙑"]="歗",
["𰚔"]="㲰",
["𰚦"]="氀",
["𰚪"]="㲯",
["𰛊"]="溤",
["𰛏"]="漎",
["𰛑"]="泞",
["𰛒"]="涷",
["𰛛"]="㴸",
["𰛡"]="滭",
["𰛣"]="漐",
["𰛤"]="瀄",
["𰛥"]="溰",
["𰛦"]="濊",
["𰛩"]="㶒",
["𰛪"]="灓",
["𰛮"]="滷",
["𰛲"]="澰",
["𰛵"]="澖",
["𰛻"]="𤅷",
["𰛽"]="㴿",
["𰜐"]="灠",
["𰜜"]="瀙",
["𰜢"]="㵑",
["𰜨"]="瀳",
["𰜳"]="瀴",
["𰝅"]="瀯",
["𰝋"]="㶏",
["𰝍"]="瀈",
["𰝗"]="㶕",
["𰝞"]="𤄙",
["𰝟"]="㶍",
["𰝾"]="㷃",
["𰞇"]="燡",
["𰞉"]="㷲",
["𰞍"]="㸅",
["𰞤"]="熞",
["𰞲"]="㷶",
["𰞳"]="龽",
["𰞻"]="燌",
["𰟘"]="爓",
["𰠛"]="牋",
["𰠫"]="犅",
["𰠲"]="牼",
["𰠴"]="㹓",
["𰠹"]="犤",
["𰡄"]="獹",
["𰡊"]="獢",
["𰡎"]="猍",
["𰡏"]="猧",
["𰡔"]="獑",
["𰡞"]="獖",
["𰡩"]="玂",
["𰡵"]="瓐",
["𰡽"]="璹",
["𰢄"]="璛",
["𰢢"]="甒",
["𰢤"]="甖",
["𰢦"]="甊",
["𰣬"]="癠",
["𰣯"]="癎",
["𰣶"]="㿉",
["𰣽"]="癴",
["𰤓"]="𤾉",
["𰤕"]="皪",
["𰤨"]="㿹",
["𰤬"]="皾",
["𰥊"]="䀍",
["𰥒"]="瞛",
["𰥛"]="瞓",
["𰥞"]="䁝",
["𰥠"]="矕",
["𰥢"]="矖",
["𰥣"]="𥉸",
["𰥨"]="瞯",
["𰥪"]="瞡",
["𰥹"]="矘",
["𰦔"]="䂓",
["𰦜"]="矲",
["𰦦"]="礰",
["𰦨"]="䃣",
["𰦭"]="礲",
["𰦰"]="礋",
["𰦴"]="䃁",
["𰦷"]="䃕",
["𰦾"]="礹",
["𰦿"]="碢",
["𰧃"]="磵",
["𰧇"]="礥",
["𰧉"]="礩",
["𰧎"]="䃢",
["𰧔"]="礛",
["𰧘"]="䃴",
["𰧰"]="禓",
["𰧻"]="禬",
["𰨖"]="禵",
["𰨜"]="穬",
["𰨦"]="穧",
["𰨳"]="䆅",
["𰩅"]="竉",
["𰩏"]="窱",
["𰩓"]="竀",
["𰩧"]="䇓",
["𰩮"]="篿",
["𰩲"]="籚",
["𰩸"]="簥",
["𰩹"]="簜",
["𰩺"]="箹",
["𰩻"]="簻",
["𰪏"]="簵",
["𰪣"]="籯",
["𰪩"]="䊯",
["𰪫"]="䊜",
["𰪭"]="粻",
["𰪻"]="䊛",
["𰪿"]="𫃑",
["𰫋"]="䊟",
["𰫖"]="糷",
["𰫼"]="糽",
["𰫽"]="紑",
["𰬀"]="紒",
["𰬁"]="䋆",
["𰬂"]="䋍",
["𰬃"]="䋑",
["𰬅"]="紨",
["𰬆"]="絇",
["𰬇"]="紸",
["𰬈"]="絃",
["𰬉"]="紽",
["𰬋"]="紭",
["𰬌"]="絚",
["𰬍"]="綊",
["𰬎"]="縪",
["𰬏"]="絑",
["𰬐"]="繑",
["𰬑"]="䋫",
["𰬒"]="絘",
["𰬓"]="絯",
["𰬔"]="絣",
["𰬕"]="䋝",
["𰬖"]="絾",
["𰬗"]="絿",
["𰬘"]="綍",
["𰬚"]="縜",
["𰬛"]="絼",
["𰬜"]="絻",
["𰬞"]="綅",
["𰬟"]="緎",
["𰬠"]="繣",
["𰬡"]="緁",
["𰬢"]="緀",
["𰬣"]="緆",
["𰬤"]="綼",
["𰬥"]="総",
["𰬧"]="緂",
["𰬪"]="縿",
["𰬫"]="緻",
["𰬬"]="緢",
["𰬭"]="䋽",
["𰬯"]="緵",
["𰬱"]="䌇",
["𰬲"]="縓",
["𰬳"]="縌",
["𰬴"]="縡",
["𰬵"]="縼",
["𰬶"]="䌌",
["𰬷"]="繖",
["𰬸"]="繐",
["𰬺"]="繜",
["𰬻"]="繘",
["𰬽"]="繲",
["𰬿"]="纀",
["𰭀"]="纋",
["𰭄"]="罆",
["𰭔"]="羂",
["𰭢"]="翜",
["𰭣"]="翿",
["𰭹"]="䏊",
["𰮅"]="膷",
["𰮇"]="膴",
["𰮙"]="䐢",
["𰮝"]="膮",
["𰮲"]="䐹",
["𰯂"]="𦡶",
["𰯋"]="臡",
["𰯎"]="䐽",
["𰰋"]="艭",
["𰰌"]="䑼",
["𰰏"]="艜",
["𰰑"]="艛",
["𰰠"]="藇",
["𰰢"]="𦳝",
["𰰤"]="蓲",
["𰰨"]="菕",
["𰰮"]="蘬",
["𰰱"]="薱",
["𰰳"]="蒒",
["𰰴"]="䔇",
["𰰵"]="蔱",
["𰰷"]="萯",
["𰰹"]="藰",
["𰰺"]="蔎",
["𰰾"]="薖",
["𰱀"]="䔈",
["𰱇"]="蕑",
["𰱈"]="禜",
["𰱉"]="蕄",
["𰱌"]="蒳",
["𰱍"]="蒶",
["𰱐"]="藚",
["𰱑"]="蔪",
["𰱛"]="蔠",
["𰱟"]="蕡",
["𰱩"]="䕡",
["𰱮"]="藘",
["𰱯"]="藣",
["𰱱"]="薋",
["𰱲"]="蘵",
["𰱾"]="藾",
["𰲁"]="蘈",
["𰲂"]="虅",
["𰲒"]="蘱",
["𰲖"]="䖀",
["𰲟"]="䖚",
["𰲠"]="虦",
["𰲬"]="蛼",
["𰲮"]="蜸",
["𰲯"]="䗥",
["𰲰"]="蜦",
["𰲲"]="蟡",
["𰲳"]="䗃",
["𰲴"]="蠪",
["𰲵"]="蠌",
["𰲶"]="蛵",
["𰲸"]="蝁",
["𰲹"]="螘",
["𰳂"]="螹",
["𰳄"]="螴",
["𰳊"]="蟦",
["𰳗"]="蠳",
["𰳚"]="䗽",
["𰳲"]="襱",
["𰳵"]="襼",
["𰳺"]="襛",
["𰳻"]="𧞅",
["𰳼"]="襹",
["𰴂"]="襂",
["𰴕"]="覕",
["𰴖"]="䙼",
["𰴗"]="䚕",
["𰴘"]="覸",
["𰴙"]="覠",
["𰴜"]="覰",
["𰴝"]="覶",
["𰴞"]="覻",
["𰴢"]="觻",
["𰴣"]="觷",
["𰴤"]="䚞",
["𰴯"]="謍",
["𰵊"]="訆",
["𰵌"]="諹",
["𰵍"]="訰",
["𰵎"]="訧",
["𰵏"]="訬",
["𰵐"]="䛀",
["𰵑"]="譌",
["𰵒"]="訦",
["𰵓"]="訹",
["𰵔"]="詍",
["𰵖"]="讛",
["𰵗"]="詇",
["𰵙"]="詄",
["𰵚"]="詅",
["𰵛"]="訽",
["𰵜"]="䛌",
["𰵝"]="訸",
["𰵠"]="詉",
["𰵡"]="誙",
["𰵢"]="䛟",
["𰵣"]="詥",
["𰵤"]="詻",
["𰵥"]="誃",
["𰵦"]="詨",
["𰵨"]="讝",
["𰵩"]="誧",
["𰵫"]="䛠",
["𰵬"]="𧧸",
["𰵭"]="誗",
["𰵮"]="誐",
["𰵯"]="誜",
["𰵰"]="䛭",
["𰵱"]="諃",
["𰵲"]="諆",
["𰵴"]="諔",
["𰵵"]="誽",
["𰵶"]="諈",
["𰵷"]="諁",
["𰵸"]="誻",
["𰵹"]="讘",
["𰵺"]="謜",
["𰵼"]="謋",
["𰵽"]="謟",
["𰵾"]="謑",
["𰵿"]="謞",
["𰶀"]="謣",
["𰶁"]="謻",
["𰶂"]="謥",
["𰶃"]="謵",
["𰶄"]="譇",
["𰶆"]="譀",
["𰶇"]="䜏",
["𰶈"]="䜄",
["𰶉"]="譠",
["𰶊"]="譩",
["𰶌"]="譳",
["𰶍"]="讂",
["𰶎"]="譅",
["𰶏"]="讑",
["𰶑"]="豅",
["𰶔"]="豄",
["𰶬"]="䝏",
["𰷞"]="貣",
["𰷟"]="𧶽",
["𰷠"]="貤",
["𰷡"]="貦",
["𰷢"]="貾",
["𰷤"]="賥",
["𰷥"]="賨",
["𰷦"]="靅",
["𰷧"]="賮",
["𰷩"]="䞉",
["𰷪"]="賹",
["𰷫"]="贆",
["𰷮"]="贙",
["𰷴"]="䟏",
["𰷵"]="趬",
["𰷶"]="趫",
["𰸄"]="踼",
["𰸈"]="䠟",
["𰸊"]="䠩",
["𰸐"]="躧",
["𰸔"]="蹥",
["𰸚"]="蹛",
["𰸛"]="䠠",
["𰸞"]="蹪",
["𰹀"]="軃",
["𰹲"]="軎",
["𰹳"]="䡅",
["𰹴"]="軓",
["𰹵"]="轙",
["𰹶"]="軖",
["𰹷"]="䡇",
["𰹸"]="軘",
["𰹺"]="䡊",
["𰹼"]="輚",
["𰹽"]="軯",
["𰹾"]="𨏊",
["𰹿"]="軵",
["𰺀"]="軧",
["𰺁"]="軥",
["𰺂"]="軳",
["𰺃"]="轛",
["𰺄"]="輁",
["𰺅"]="輂",
["𰺇"]="輐",
["𰺈"]="輑",
["𰺉"]="輤",
["𰺊"]="輘",
["𰺋"]="輙",
["𰺍"]="輠",
["𰺎"]="輫",
["𰺏"]="輣",
["𰺐"]="輡",
["𰺑"]="䡝",
["𰺒"]="輲",
["𰺓"]="輹",
["𰺖"]="轃",
["𰺗"]="轞",
["𰺘"]="䡰",
["𰺙"]="轖",
["𰺛"]="轑",
["𰺜"]="轓",
["𰺝"]="䡴",
["𰺞"]="轏",
["𰺟"]="轚",
["𰺠"]="䡾",
["𰺡"]="䡷",
["𰺣"]="轥",
["𰺤"]="䡻",
["𰺭"]="䢈",
["𰺲"]="逿",
["𰺷"]="遶",
["𰻆"]="遰",
["𰻝"]="𰻞",
["𰻡"]="鄦",
["𰻦"]="鄬",
["𰻮"]="鄡",
["𰻳"]="鄪",
["𰼅"]="醳",
["𰼋"]="𨣃",
["𰼏"]="𨣨",
["𰼑"]="䤍",
["𰼻"]="鑋",
["𰽕"]="鐖",
["𰽗"]="釪",
["𰽘"]="釱",
["𰽚"]="鑛",
["𰽛"]="釥",
["𰽜"]="鏂",
["𰽝"]="䥶",
["𰽞"]="鈪",
["𰽠"]="䤠",
["𰽡"]="鈤",
["𰽢"]="鋧",
["𰽣"]="鈏",
["𰽤"]="鈌",
["𰽥"]="鈵",
["𰽦"]="鑨",
["𰽧"]="鉟",
["𰽩"]="鉲",
["𰽫"]="鉎",
["𰽬"]="鉌",
["𰽮"]="鉜",
["𰽯"]="鉒",
["𰽰"]="鉡",
["𰽱"]="鉘",
["𰽲"]="銡",
["𰽳"]="顉",
["𰽴"]="銙",
["𰽵"]="銧",
["𰽶"]="鉵",
["𰽷"]="鐬",
["𰽸"]="䤨",
["𰽹"]="鉹",
["𰽺"]="䤥",
["𰽻"]="銋",
["𰽼"]="鉼",
["𰽽"]="𨦡",
["𰽾"]="鐹",
["𰽿"]="銸",
["𰾀"]="鋍",
["𰾁"]="銾",
["𰾃"]="鋜",
["𰾄"]="鋂",
["𰾅"]="鋡",
["𰾆"]="鋊",
["𰾈"]="䤬",
["𰾋"]="龲",
["𰾌"]="鏩",
["𰾍"]="錶",
["𰾎"]="錍",
["𰾏"]="鋾",
["𰾐"]="䤵",
["𰾑"]="鍂",
["𰾒"]="錧",
["𰾓"]="錔",
["𰾕"]="鍱",
["𰾖"]="䤻",
["𰾗"]="鍼",
["𰾘"]="鍖",
["𰾙"]="鍝",
["𰾚"]="鍡",
["𰾛"]="鎅",
["𰾜"]="鍴",
["𰾝"]="鍟",
["𰾞"]="鍐",
["𰾟"]="鍑",
["𰾡"]="鍧",
["𰾢"]="鍦",
["𰾤"]="鍜",
["𰾥"]="鍨",
["𰾦"]="䤸",
["𰾧"]="𨫼",
["𰾩"]="鎑",
["𰾫"]="鑑",
["𰾬"]="鎉",
["𰾭"]="鑀",
["𰾮"]="鎌",
["𰾯"]="鎕",
["𰾰"]="鏙",
["𰾱"]="鏓",
["𰾲"]="鏕",
["𰾴"]="鐁",
["𰾶"]="鏸",
["𰾷"]="鐕",
["𰾸"]="鐤",
["𰾻"]="䥖",
["𰾼"]="鐉",
["𰾽"]="钃",
["𰾾"]="钀",
["𰿀"]="𨰹",
["𰿁"]="䥝",
["𰿂"]="鑐",
["𰿃"]="鑖",
["𰿄"]="鑘",
["𰿅"]="䥴",
["𰿆"]="鑽",
["𰿇"]="䥷",
["𰿈"]="鑯",
["𰿉"]="鑸",
["𰿨"]="䦎",
["𰿩"]="閕",
["𰿫"]="䦱",
["𰿬"]="閛",
["𰿰"]="𨉖",
["𰿳"]="閷",
["𰿴"]="䦪",
["𰿺"]="闛",
["𰿻"]="闟",
["𰿾"]="闢",
["𱀡"]="隫",
["𱁒"]="䨴",
["𱁱"]="𩋬",
["𱁳"]="𩍜",
["𱁴"]="鞸",
["𱁶"]="韆",
["𱁷"]="韇",
["𱁹"]="鞼",
["𱁺"]="鞻",
["𱁽"]="䪍",
["𱁾"]="韊",
["𱂅"]="䪐",
["𱂆"]="韐",
["𱂇"]="韏",
["𱂈"]="韗",
["𱂉"]="韒",
["𱂊"]="韘",
["𱂋"]="韣",
["𱂌"]="䪝",
["𱂎"]="䪥",
["𱂢"]="䪼",
["𱂣"]="顤",
["𱂤"]="顪",
["𱂥"]="頟",
["𱂦"]="頩",
["𱂧"]="頪",
["𱂨"]="頞",
["𱂫"]="顩",
["𱂬"]="頯",
["𱂭"]="顀",
["𱂮"]="䫌",
["𱂯"]="顇",
["𱂰"]="顄",
["𱂱"]="顑",
["𱂲"]="顋",
["𱂴"]="顜",
["𱂵"]="顝",
["𱂶"]="顖",
["𱂸"]="顮",
["𱂺"]="顠",
["𱂻"]="顦",
["𱃔"]="颩",
["𱃕"]="颬",
["𱃖"]="䬀",
["𱃗"]="颱",
["𱃘"]="颲",
["𱃙"]="䬟",
["𱃚"]="䬅",
["𱃜"]="䬐",
["𱃝"]="飍",
["𱃞"]="䬔",
["𱃟"]="飁",
["𱃠"]="飇",
["𱃱"]="䬣",
["𱃲"]="饇",
["𱃳"]="䬪",
["𱃵"]="䬬",
["𱃷"]="䬳",
["𱃸"]="䬹",
["𱃹"]="䭓",
["𱃺"]="餂",
["𱃼"]="餴",
["𱃽"]="餩",
["𱃿"]="餤",
["𱄀"]="饙",
["𱄃"]="䭈",
["𱄄"]="餯",
["𱄆"]="饎",
["𱄈"]="饛",
["𱄉"]="䭡",
["𱄊"]="饡",
["𱄼"]="馵",
["𱄽"]="馲",
["𱄾"]="𩧉",
["𱄿"]="騳",
["𱅀"]="駂",
["𱅁"]="馽",
["𱅂"]="馺",
["𱅃"]="駏",
["𱅄"]="䮂",
["𱅅"]="驡",
["𱅇"]="駗",
["𱅈"]="駜",
["𱅉"]="駥",
["𱅊"]="騺",
["𱅋"]="駬",
["𱅏"]="駣",
["𱅐"]="駮",
["𱅑"]="駦",
["𱅔"]="駷",
["𱅕"]="騋",
["𱅖"]="駽",
["𱅗"]="騀",
["𱅙"]="駾",
["𱅚"]="騇",
["𱅛"]="驒",
["𱅜"]="騕",
["𱅝"]="騗",
["𱅞"]="騢",
["𱅟"]="騥",
["𱅠"]="䮧",
["𱅡"]="騩",
["𱅢"]="騬",
["𱅣"]="𩥅",
["𱅤"]="驞",
["𱅦"]="䮲",
["𱅧"]="驉",
["𱅩"]="騽",
["𱅪"]="驔",
["𱅫"]="驈",
["𱅬"]="驠",
["𱅮"]="髐",
["𱆁"]="鬜",
["𱆃"]="䰎",
["𱆅"]="䰐",
["𱆆"]="鬗",
["𱆈"]="䰖",
["𱆌"]="鬺",
["𱆙"]="䰫",
["𱆚"]="䫥",
["𱆛"]="魗",
["𱇍"]="䰲",
["𱇏"]="魠",
["𱇐"]="魭",
["𱇑"]="䰽",
["𱇒"]="魮",
["𱇓"]="魱",
["𱇔"]="魶",
["𱇕"]="䰻",
["𱇖"]="魬",
["𱇗"]="鯩",
["𱇘"]="魧",
["𱇙"]="魫",
["𱇚"]="䱅",
["𱇛"]="鮇",
["𱇜"]="魼",
["𱇝"]="魾",
["𱇞"]="䱇",
["𱇟"]="魻",
["𱇠"]="鮂",
["𱇡"]="鮏",
["𱇢"]="鮌",
["𱇣"]="鱍",
["𱇤"]="䱂",
["𱇥"]="䱎",
["𱇦"]="鮬",
["𱇧"]="鮧",
["𱇨"]="鮛",
["𱇩"]="鱎",
["𱇪"]="鮥",
["𱇬"]="䱌",
["𱇭"]="鯠",
["𱇮"]="𩷶",
["𱇯"]="鮹",
["𱇰"]="䱒",
["𱇱"]="鯈",
["𱇲"]="䱐",
["𱇵"]="鰿",
["𱇶"]="鯥",
["𱇷"]="䱜",
["𱇸"]="鱦",
["𱇹"]="䱥",
["𱇺"]="鯚",
["𱇻"]="䱤",
["𱇼"]="鯦",
["𱇽"]="䱡",
["𱇾"]="鯮",
["𱇿"]="鱐",
["𱈀"]="䱟",
["𱈁"]="鯅",
["𱈂"]="鰅",
["𱈄"]="鯸",
["𱈅"]="鯼",
["𱈆"]="䱾",
["𱈇"]="䱭",
["𱈈"]="䱴",
["𱈉"]="鰬",
["𱈊"]="鰡",
["𱈋"]="鰝",
["𱈌"]="鱃",
["𱈍"]="鰯",
["𱈏"]="鱁",
["𱈐"]="鱄",
["𱈑"]="鰴",
["𱈒"]="䲉",
["𱈓"]="鱏",
["𱈕"]="鱕",
["𱈖"]="䲚",
["𱈗"]="鱬",
["𱈙"]="鱴",
["𱈛"]="䲛",
["𱈜"]="鱻",
["𱉇"]="鳦",
["𱉈"]="鳭",
["𱉊"]="鳱",
["𱉌"]="鸃",
["𱉍"]="鳿",
["𱉎"]="鳺",
["𱉏"]="鷒",
["𱉐"]="鵙",
["𱉑"]="鳻",
["𱉓"]="鳸",
["𱉔"]="鴂",
["𱉕"]="鴚",
["𱉖"]="䲹",
["𱉗"]="鴠",
["𱉘"]="鴡",
["𱉙"]="䳅",
["𱉚"]="鴩",
["𱉛"]="鴙",
["𱉝"]="鵖",
["𱉞"]="䳇",
["𱉟"]="鸅",
["𱉠"]="鵛",
["𱉡"]="鴘",
["𱉢"]="鴢",
["𱉤"]="䳏",
["𱉥"]="鴶",
["𱉦"]="䳓",
["𱉧"]="䳒",
["𱉨"]="鵶",
["𱉩"]="鴺",
["𱉪"]="鴱",
["𱉫"]="鴸",
["𱉬"]="鷮",
["𱉮"]="鵅",
["𱉯"]="鴹",
["𱉱"]="鶤",
["𱉲"]="鴾",
["𱉳"]="鷶",
["𱉴"]="鸉",
["𱉵"]="鶆",
["𱉶"]="䳚",
["𱉸"]="鵌",
["𱉹"]="鵗",
["𱉺"]="䳕",
["𱉻"]="鵎",
["𱉼"]="䳭",
["𱉽"]="鵋",
["𱉾"]="鵕",
["𱉿"]="鵔",
["𱊀"]="鵱",
["𱊁"]="鵸",
["𱊂"]="䳟",
["𱊃"]="鵹",
["𱊄"]="鶃",
["𱊅"]="鵻",
["𱊆"]="鵵",
["𱊇"]="鵴",
["𱊈"]="鶂",
["𱊉"]="𪈔",
["𱊊"]="鵼",
["𱊋"]="鵳",
["𱊌"]="鶋",
["𱊍"]="鵽",
["𱊎"]="鶅",
["𱊏"]="鶝",
["𱊐"]="鶛",
["𱊑"]="鶞",
["𱊒"]="鶢",
["𱊓"]="䳮",
["𱊕"]="鶙",
["𱊖"]="鶟",
["𱊗"]="鶔",
["𱊘"]="鶨",
["𱊙"]="䳲",
["𱊚"]="鷏",
["𱊛"]="鶽",
["𱊝"]="鶶",
["𱊟"]="鶷",
["𱊠"]="鷋",
["𱊡"]="鷕",
["𱊢"]="鷑",
["𱊣"]="䳺",
["𱊤"]="鷛",
["𱊧"]="鷢",
["𱊨"]="𪆫",
["𱊩"]="鷵",
["𱊪"]="䴇",
["𱊫"]="鸆",
["𱊬"]="鸀",
["𱊭"]="鸒",
["𱊮"]="鸁",
["𱊯"]="鸄",
["𱊰"]="鷾",
["𱊱"]="鸐",
["𱊳"]="鸓",
["𱊵"]="鸙",
["𱊼"]="䴝",
["𱋆"]="䴮",
["𱋇"]="麧",
["𱋊"]="䴲",
["𱋋"]="麮",
["𱋎"]="䴳",
["𱋐"]="麴",
["𱋔"]="䴵",
["𱋖"]="麱",
["𱋗"]="䴸",
["𱋙"]="䴹",
["𱋝"]="䴺",
["𱋢"]="𪍑",
["𱋧"]="䴾",
["𱋪"]="䵂",
["𱋫"]="䵃",
["𱋮"]="䵆",
["𱋱"]="黂",
["𱋴"]="䵐",
["𱋶"]="黸",
["𱋾"]="鼀",
["𱋿"]="鼁",
["𱌁"]="䵶",
["𱌃"]="䵷",
["𱌄"]="鼅",
["𱌆"]="鼆",
["𱌇"]="鼈",
["𱌉"]="鼊",
["𱌊"]="鼚",
["𱌏"]="鼲",
["𱌖"]="齈",
["𱌗"]="齌",
["𱌘"]="齍",
["𱌙"]="𪗋",
["𱌫"]="齞",
["𱌬"]="齚",
["𱌭"]="齺",
["𱌮"]="齣",
["𱌯"]="齝",
["𱌰"]="䶧",
["𱌱"]="齥",
["𱌲"]="齤",
["𱌳"]="齳",
["𱌴"]="𪘨",
["𱌵"]="䶨",
["𱌶"]="齱",
["𱌷"]="𪘬",
["𱌸"]="𪘥",
["𱌹"]="齵",
["𱌺"]="齻",
["𱌼"]="𪙉",
["𱌽"]="齸",
["𱍁"]="龏",
["𱍂"]="龖",
["𱍇"]="䶱",
["𱍈"]="龞",
["𱎟"]="偒",
["𱎫"]="俹",
["𱏀"]="僫",
["𱏆"]="𪝼",
["𱏩"]="㒯",
["𱐠"]="剼",
["𱐳"]="㔤",
["𱑉"]="㔶",
["𱒀"]="噧",
["𱒂"]="啺",
["𱒦"]="嚋",
["𱕌"]="囖",
["𱖚"]="壐",
["𱙄"]="嬩",
["𱙇"]="婨",
["𱙋"]="",
["𱙑"]="𡣙",
["𱙔"]="孍",
["𱙷"]="孭",
["𱛇"]="㠘",
["𱛊"]="𡷹",
["𱛓"]="巄",
["𱞕"]="憳",
["𱞲"]="憌",
["𱟸"]="揁",
["𱟽"]="𢰸",
["𱡼"]="㬙",
["𱣂"]="㮧",
["𱣇"]="檏",
["𱣡"]="㯗",
["𱣤"]="橺",
["𱣱"]="樌",
["𱥵"]="𣷣",
["𱩂"]="𤃡",
["𱩪"]="灆",
["𱪪"]="爏",
["𱫅"]="㸄",
["𱫊"]="𤏪",
["𱫜"]="𤎽",
["𱭰"]="㹚",
["𱮺"]="𤦹",
["𱮾"]="琜",
["𱰆"]="𤬏",
["𱲥"]="䁑",
["𱲦"]="瞴",
["𱲮"]="䁺",
["𱳯"]="碖",
["𱳱"]="䂻",
["𱳳"]="䃖",
["𱳹"]="礑",
["𱴄"]="䂾",
["𱷷"]="䉅",
["𱷸"]="䈟",
["𱸂"]="䉩",
["𱸇"]="簩",
["𱸐"]="䉔",
["𱺕"]="䌬",
["𱺖"]="𦆭",
["𱺘"]="䋋",
["𱺙"]="𥿡",
["𱺛"]="䋘",
["𱺜"]="䋱",
["𱺦"]="緾",
["𱺫"]="䌏",
["𱺯"]="䌨",
["𱻞"]="翸",
["𱻴"]="耫",
["𱼇"]="𦠜",
["𱼏"]="膭",
["𱼸"]="䑺",
["𱽜"]="蓻",
["𱽱"]="䕠",
["𱽾"]="𦻖",
["𱾎"]="䕵",
["𱿧"]="𧒄",
["𱿩"]="䗯",
["𲀝"]="䡓",
["𲁑"]="覔",
["𲁔"]="𧢝",
["𲁖"]="覮",
["𲁙"]="覫",
["𲂂"]="訉",
["𲂃"]="訍",
["𲂆"]="䛅",
["𲂇"]="𧭈",
["𲂈"]="䛔",
["𲂉"]="䛩",
["𲂍"]="誩",
["𲂏"]="諘",
["𲂐"]="諵",
["𲂓"]="䜊",
["𲂔"]="謶",
["𲂕"]="譧",
["𲂖"]="譢",
["𲂻"]="賏",
["𲃄"]="賲",
["𲃏"]="䟄",
["𲄙"]="𨊛",
["𲄚"]="躼",
["𲄧"]="軁",
["𲅎"]="遤",
["𲅑"]="䢙",
["𲇑"]="鑍",
["𲇭"]="釮",
["𲇯"]="𨥉",
["𲇰"]="釰",
["𲇱"]="鈘",
["𲇲"]="鏄",
["𲇳"]="䤝",
["𲇴"]="鈊",
["𲇷"]="錬",
["𲇸"]="鈱",
["𲇻"]="銌",
["𲇽"]="鋕",
["𲇿"]="鋲",
["𲈀"]="鐱",
["𲈁"]="錴",
["𲈄"]="䥊",
["𲈅"]="𨨩",
["𲈆"]="鋿",
["𲈋"]="鍸",
["𲈌"]="鍷",
["𲈍"]="鎁",
["𲈎"]="鍹",
["𲈏"]="𨪃",
["𲈒"]="鎤",
["𲈗"]="鏱",
["𲈙"]="䥔",
["𲈚"]="鐛",
["𲈜"]="鏳",
["𲈝"]="鏴",
["𲈞"]="鐰",
["𲈵"]="閖",
["𲈹"]="閪",
["𲈽"]="䦜",
["𲉁"]="闀",
["𲉉"]="陯",
["𲊺"]="頙",
["𲊼"]="頳",
["𲊾"]="䫖",
["𲋀"]="䫫",
["𲋃"]="䫲",
["𲋎"]="䫺",
["𲋏"]="䫽",
["𲋢"]="",
["𲋤"]="䬰",
["𲌅"]="駖",
["𲌉"]="𩤅",
["𲌋"]="䮴",
["𲍇"]="䲑",
["𲍈"]="䰶",
["𲍌"]="鮕",
["𲍎"]="䱋",
["𲍐"]="䱊",
["𲍑"]="鱙",
["𲍕"]="䱝",
["𲍙"]="䲎",
["𲍬"]="鷌",
["𲍮"]="鴋",
["𲍰"]="鸍",
["𲍱"]="𩿞",
["𲍲"]="䳂",
["𲍳"]="䳑",
["𲍴"]="鷝",
["𲍵"]="䳄",
["𲍸"]="𪁎",
["𲍻"]="鷼",
["𲍽"]="𪂇",
["𲍾"]="䳡",
["𲎀"]="鶧",
["𲎈"]="䴌",
["𲎨"]="𪘁",
["𱂩"]="𩒺",
["𱳅"]="𥍉",
["𲍘"]="𫙱",
["𡋤"]="壗",
["𫽫"]="𰔫",
}
1ahjmoyi0lvdqulrasmuwbqwkpmtrna
বাউঁ
0
306847
487738
487711
2026-09-02T14:08:24Z
अजीत कुमार तिवारी
4887
487738
wikitext
text/x-wiki
=={{-as-}}==
===विशेषण===
{{as-adj}}
#[[वाम]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश ====
# बायाँ, दाहिना या दक्षिण का विपर्याय;
# प्रतिकूल, विरुद्ध;
# दुष्ट बुरा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश]]
ocfnbb4hcmg2ry7pvn839mo7ei0w0vc
487776
487738
2026-09-02T17:06:09Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487776
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
#[[वाम]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश ====
# बायाँ, दाहिना या दक्षिण का विपर्याय;
# प्रतिकूल, विरुद्ध;
# दुष्ट बुरा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेजी त्रिभाषा कोश]]
ee0p8lkjy8yl9yfc9ixp3ied7z4gmpn
অন্তৰ্ভুক্ত
0
306854
487740
487709
2026-09-02T14:11:35Z
अजीत कुमार तिवारी
4887
487740
wikitext
text/x-wiki
=={{-as-}}==
===विशेषण===
{{as-adj}}
# [[अंतर्भूत]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
भीतर समाया हुआ, अंतर्गत।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
3om38ohgvp2xatbnnslrbgb5guq8h3j
487741
487740
2026-09-02T14:12:09Z
अजीत कुमार तिवारी
4887
487741
wikitext
text/x-wiki
{{-as-}}
===विशेषण===
{{as-adj}}
# [[अंतर्भूत]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
भीतर समाया हुआ, अंतर्गत।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
qyud61sq6c8ksvzak1ee105pyef1g54
487742
487741
2026-09-02T14:12:34Z
अजीत कुमार तिवारी
4887
487742
wikitext
text/x-wiki
=={{-as-}}==
===विशेषण===
{{as-adj}}
# [[अंतर्भूत]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
भीतर समाया हुआ, अंतर्गत।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
3om38ohgvp2xatbnnslrbgb5guq8h3j
487769
487742
2026-09-02T16:37:29Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487769
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अंतर्भूत]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
भीतर समाया हुआ, अंतर्गत।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
ciyp18d20kwcliit5y7wkle26dbwneo
অন্ত্যজ
0
306857
487739
487710
2026-09-02T14:10:44Z
अजीत कुमार तिवारी
4887
487739
wikitext
text/x-wiki
=={{-as-}}==
===विशेषण===
{{as-adj}}
# [[अंत्यज]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
अंतिम वर्ण से उत्पन्न। (विशेषण)
#शूद्र वर्ण;
#अछूत या अस्पृश्य जाति। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
5cetg7atip7feuuk1mmk06n7k8tzkjx
487775
487739
2026-09-02T17:02:34Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487775
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अंत्यज]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
अंतिम वर्ण से उत्पन्न। (विशेषण)
#शूद्र वर्ण;
#अछूत या अस्पृश्य जाति। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
o5821tth20eddzctb8abtv7vtz5i43u
साँचा:as-noun
10
306860
487797
487570
2026-09-02T17:47:38Z
SM7
6218
सुधार
487797
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{head|as|संज्ञाएँ|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}|{{#if:{{{cl|}}}|classifier|}}|{{{cl|}}}}}<!--
--><noinclude>{{documentation}}</noinclude>
1u0vv8w4c0omivhkzkgxkwzv0h4kg03
487800
487797
2026-09-02T18:12:20Z
SM7
6218
टेम्परेरी परीक्षण वापस
487800
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{head|as|noun|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}|{{#if:{{{cl|}}}|classifier|}}|{{{cl|}}}}}<!--
--><noinclude>{{documentation}}</noinclude>
5d16s4jpu3jnav440i4bqd6wthv706z
অন্ধবিশ্বাস
0
306861
487737
487712
2026-09-02T14:07:56Z
अजीत कुमार तिवारी
4887
साँचा सुधार.
487737
wikitext
text/x-wiki
=={{-as-}}==
===संज्ञा===
{{as-noun}}
# [[अंधविश्वास]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
बिना सोचे समझे किसी बात को मान लेना, विवेकरहित धारणा। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
bo313evpi4nvkhedwv444a7t22ugg8s
487779
487737
2026-09-02T17:08:00Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487779
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[अंधविश्वास]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
बिना सोचे समझे किसी बात को मान लेना, विवेकरहित धारणा। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
8tzyq2fy4f0i13adz6ci1eepmnt8qpi
मॉड्यूल:headword/page
828
306870
487793
487583
2026-09-02T17:37:39Z
SM7
6218
localization...
487793
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["Pages with language headings in the wrong order"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["Pages with nonstandard language headings"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
insert(cats, get_category("पृष्ठ प्रविष्टियों के साथ"))
insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and "" or "यों" .. " के साथ")))
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("Pages with tab characters"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
a1l7cagb139m4lkrsl6pdggcmmktq8o
487794
487793
2026-09-02T17:40:01Z
SM7
6218
मामूली सुधार
487794
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["Pages with language headings in the wrong order"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["Pages with nonstandard language headings"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
insert(cats, get_category("पृष्ठ प्रविष्टियों के साथ"))
insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and " के साथ" or "यों के साथ")))
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("पृष्ठ टैब कैरेक्टर के साथ"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
qvh2ct7wn444crx7pma3fsfn0yeb6am
487798
487794
2026-09-02T17:51:07Z
SM7
6218
localization...
487798
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["ग़लत क्रम वाली भाषा हेडिंग वाले पृष्ठ"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["गैर-स्टैंडर्ड भाषा हेडिंग वाले पृष्ठ"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
insert(cats, get_category("पृष्ठ प्रविष्टियों के साथ"))
insert(cats, get_category(format("पृष्ठ %s प्रविष्टि%s", L2_list_len, L2_list_len == 1 and " के साथ" or "यों के साथ")))
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("पृष्ठ टैब कैरेक्टर के साथ"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
dxh2g9itj73w44syru1ihxeicpw86q9
साँचा:as-adj
10
306922
487795
487674
2026-09-02T17:40:51Z
SM7
6218
सुधार
487795
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{head|as|विशेषण|sort={{{sort|}}}|head={{{head|}}}|tr={{{tr|}}}<!--
-->|{{#ifeq:{{{c}}}|+|comparative}}<!--
-->|[[আৰু]] {{pagename}}<!--
-->|{{#ifeq:{{{c}}}|+|superlative}}<!--
-->|[[আটাইতকৈ]] {{pagename}}<!--
-->}}<!--
--><noinclude>{{documentation}}</noinclude>
577gicgqb9ldo0g49xix7aqgkar7a51
मॉड्यूल:category tree/परिवार
828
306935
487812
487720
2026-09-02T19:15:06Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/families]] को [[मॉड्यूल:category tree/परिवार]] पर स्थानांतरित किया
487720
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["सभी भाषा परिवार"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category lists all [[language family|language families]].",
parents = {"मूलभूत"},
}
raw_categories["भाषाएँ परिवार अनुसार"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.",
additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].",
parents = {
{name = "All languages", sort = " "},
{name = "All language families", sort = " "},
},
}
raw_categories["Unassigned languages"] = {
description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.",
additional = [=[This should be distinguished from:
* [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it);
* [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and
* [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=],
parents = {
{name = "भाषा परिवार अनुसार", sort = "*"},
"सभी भाषा परिवार",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function family_is_not_a_family(fam)
if not fam then
return false
elseif fam:getCode() == "qfa-not" then
return true
else
local family_parent = fam:getFamily()
local parent_code = family_parent and family_parent:getCode() or nil
-- Some families have no parent, some are in the pseudo-family sgn (sign languages), some are given as
-- qfa-dis (disputed) or potentially qfa-unc (unclassifiable), but are not themselves pseudo-families.
if not parent_code or parent_code == "sgn" or parent_code == "qfa-dis" or parent_code == "qfa-unc" then
return false
end
return family_is_not_a_family(family_parent)
end
end
local function family_has_no_category(fam)
local famcode = fam:getCode()
if famcode == "paa" then
return false -- Papuan languages are not a family but have a category
elseif famcode == "qfa-iso" or famcode == "qfa-not" then
return true
else
local parfam = fam:getFamily()
if parfam and parfam:getCode() == "qfa-not" then
-- Constructed languages, sign languages, etc.; no category for them
return true
end
end
return false
end
-- Currently all Papuan families begin with "paa" or "ngf",
local function family_is_papuan(fam)
local famcode = fam:getCode()
return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf"))
end
local function infobox(fam)
local ret = {}
insert(ret, "<table class=\"wikitable\">\n")
insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = fam:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>अन्य नाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = fam:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>उपनाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = fam:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>")
local protoLanguage = fam:getProtoLanguage()
if protoLanguage then
insert(ret, "[[:श्रेणी:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]")
else
insert(ret, "none")
end
insert(ret, "</td>\n")
insert(ret, "\n</tr>\n")
local parent = fam:getFamily()
if not parent then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "unassigned")
elseif parent:getCode() == "qfa-not" then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "not a family")
else
local chain = {}
while parent do
if family_has_no_category(parent) then
break
end
insert(chain, "[[:श्रेणी:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]")
parent = parent:getFamily()
end
if #chain == 0 then
insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|पूर्वज परिवार]]</th>\n<td>")
insert(ret, "no parents")
else
insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|Parent famil"
.. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>")
for i = #chain, 1, -1 do
insert(ret, "<ul><li>" .. chain[i])
end
insert(ret, string.rep("</li></ul>", #chain))
end
end
insert(ret, "</td>\n</tr>\n")
if fam:getWikidataItem() and mw.wikibase then
local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']'
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local additional_information = {
["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.",
["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.",
["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.",
["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " ..
"They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " ..
"languages that cannot be classified (due to insufficient data) and those that merely have not been classified " ..
"(due to insufficient research).",
}
local preceding_information = {
["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}",
["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}",
["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}",
["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}",
["crp"] = "{{also|Category:Mixed languages}}",
}
local specially_named_families = {
["Languages of disputed affiliation"] = "qfa-dis",
["Language isolates"] = "qfa-iso",
}
local specially_named_family_sort_keys = {
["Languages of disputed affiliation"] = "Disputed affiliation",
["Language isolates"] = "Isolate",
}
insert(raw_handlers, function(data)
local family = require("Module:families").getByCategoryName(data.category)
if not family then
local special_code = specially_named_families[data.category]
if special_code then
family = require("Module:families").getByCode(special_code)
if not family then
error(("Internal error: Family code '%s' is an invalid family code."):format(special_code))
end
end
end
if not family then
return nil
end
local parent_fam = family:getFamily()
local first_parent, parent_sort_key, first_parent_sort_key
if not parent_fam or family_has_no_category(parent_fam) then
first_parent = "भाषाएँ परिवार अनुसार"
parent_sort_key = specially_named_family_sort_keys[data.category]
first_parent_sort_key = "*" .. (parent_sort_key or "")
else
first_parent = parent_fam:getCategoryName()
end
local description, additional = "", ""
local topright
local preceding = preceding_information[family:getCode()]
local additional_preface = additional_information[family:getCode()]
if additional_preface then
additional_preface = additional_preface .. "\n\n"
else
additional_preface = ""
end
if family_is_not_a_family(family) then
additional_preface = additional_preface ..
"This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " ..
"(i.e. a set of linguistically related languages descending from a common parent).\n\n" ..
"Information about this family:\n\n"
else
additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n"
end
if not data.called_from_inside then
topright = {}
local wikipedia_art = family:getWikipediaArticle("noCategoryFallback")
if wikipedia_art then
insert(topright, "{{wp|" .. wikipedia_art .. "}}")
end
local commons_cat = family:getCommonsCategory()
if commons_cat then
insert(topright, "{{commonscat|" .. commons_cat:gsub("^श्रेणी:", "") .. "}}")
end
topright = #topright > 0 and concat(topright, "\n") or nil
description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''."
additional = additional_preface .. infobox(family)
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
family:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
additional = additional .. NavFrame_for_family_tree(
tree_of_descendants,
"परिवार वृक्ष")
else
additional = additional .. "\n\n" .. ucfirst(family:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
local parents = {
{name = first_parent, sort = first_parent_sort_key},
{name = "सभी भाषा परिवार", sort = parent_sort_key},
}
if parent_fam and parent_fam:getCode() == "sgn" then
insert(parents, "All sign languages")
end
if family_is_papuan(family) then
insert(parents, "Papuan languages")
end
return {
preceding = preceding,
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = family:getCanonicalName(),
can_be_empty = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
9eksalu5otlpo6m1zl5s2f089221ybt
487814
487812
2026-09-02T19:16:16Z
SM7
6218
सुधार
487814
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["सभी भाषा परिवार"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category lists all [[language family|language families]].",
parents = {"मूलभूत श्रेणी"},
}
raw_categories["भाषाएँ परिवार अनुसार"] = {
topright = "{{commonscat|Languages by family}}\n{{wp|Language family,List of language families}}",
description = "This category contains all languages categorized hierarchically according to the [[language family]] they belong to.",
additional = "Only top-level language families are shown here. For a full list of all language families, see [[:Category:All language families]] or [[Wiktionary:List of families]].",
parents = {
{name = "All languages", sort = " "},
{name = "सभी भाषा परिवार", sort = " "},
},
}
raw_categories["Unassigned languages"] = {
description = "Languages that have not yet been assigned to any family by Wiktionary editors, usually due to oversight.",
additional = [=[This should be distinguished from:
* [[:Category:Unclassifiable languages]] (languages that cannot be confidently assigned to any family, typically because the language is extinct or unresearched and has little available data on it);
* [[:Category:Language isolates]] (where there is general agreement that the language has no relatives); and
* [[:Category:Languages of disputed affiliation]] (languages where there is no consensus concerning which family, if any, they belong to).]=],
parents = {
{name = "भाषा परिवार अनुसार", sort = "*"},
"सभी भाषा परिवार",
},
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function family_is_not_a_family(fam)
if not fam then
return false
elseif fam:getCode() == "qfa-not" then
return true
else
local family_parent = fam:getFamily()
local parent_code = family_parent and family_parent:getCode() or nil
-- Some families have no parent, some are in the pseudo-family sgn (sign languages), some are given as
-- qfa-dis (disputed) or potentially qfa-unc (unclassifiable), but are not themselves pseudo-families.
if not parent_code or parent_code == "sgn" or parent_code == "qfa-dis" or parent_code == "qfa-unc" then
return false
end
return family_is_not_a_family(family_parent)
end
end
local function family_has_no_category(fam)
local famcode = fam:getCode()
if famcode == "paa" then
return false -- Papuan languages are not a family but have a category
elseif famcode == "qfa-iso" or famcode == "qfa-not" then
return true
else
local parfam = fam:getFamily()
if parfam and parfam:getCode() == "qfa-not" then
-- Constructed languages, sign languages, etc.; no category for them
return true
end
end
return false
end
-- Currently all Papuan families begin with "paa" or "ngf",
local function family_is_papuan(fam)
local famcode = fam:getCode()
return famcode ~= "paa" and (famcode:find("^paa") or famcode:find("^ngf"))
end
local function infobox(fam)
local ret = {}
insert(ret, "<table class=\"wikitable\">\n")
insert(ret, "<tr>\n<th colspan=\"2\" class=\"plainlinks\">[//en.wiktionary.org/w/index.php?title=Module:families/data&action=edit Edit family data]</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. fam:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = fam:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>अन्य नाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local aliases = fam:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, "<tr>\n<th>उपनाम</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
local varieties = fam:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, "<li><dl><dt>" .. first_var .. "</dt>\n<dd><ul>" .. concat(subvars, "\n") .. "</ul></dd></dl></li>")
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, "<tr>\n<th>Varieties</th><td><ul>" .. concat(names, "\n") .. "</ul></td>\n</tr>\n")
end
end
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Family code]]</th><td><code>" .. fam:getCode() .. "</code></td>\n</tr>\n")
insert(ret, "<tr>\n<th>[[w:Proto-language|Common ancestor]]</th><td>")
local protoLanguage = fam:getProtoLanguage()
if protoLanguage then
insert(ret, "[[:श्रेणी:" .. protoLanguage:getCategoryName() .. "|" .. protoLanguage:getCanonicalName() .. "]]")
else
insert(ret, "none")
end
insert(ret, "</td>\n")
insert(ret, "\n</tr>\n")
local parent = fam:getFamily()
if not parent then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "unassigned")
elseif parent:getCode() == "qfa-not" then
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Parent family]]</th>\n<td>")
insert(ret, "not a family")
else
local chain = {}
while parent do
if family_has_no_category(parent) then
break
end
insert(chain, "[[:श्रेणी:" .. parent:getCategoryName() .. "|" .. parent:getCanonicalName() .. "]]")
parent = parent:getFamily()
end
if #chain == 0 then
insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|पूर्वज परिवार]]</th>\n<td>")
insert(ret, "no parents")
else
insert(ret, "<tr>\n<th>[[Wiktionary:परिवार|Parent famil"
.. (#chain == 1 and "y" or "ies") .. "]]</th>\n<td>")
for i = #chain, 1, -1 do
insert(ret, "<ul><li>" .. chain[i])
end
insert(ret, string.rep("</li></ul>", #chain))
end
end
insert(ret, "</td>\n</tr>\n")
if fam:getWikidataItem() and mw.wikibase then
local link = '[' .. mw.wikibase.getEntityUrl(fam:getWikidataItem()) .. ' ' .. fam:getWikidataItem() .. ']'
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local additional_information = {
["qfa-dis"] = "These are languages where there is no consensus concerning which family, if any, they belong to.",
["qfa-iso"] = "These are languages where there is general agreement that the language has no known relatives.",
["qfa-mix"] = "A [[mixed language]] is a language which is composed of two different languages.",
["qfa-unc"] = "These are languages that cannot be confidently assigned to a family due to lack of sufficient linguistic data. " ..
"They are also commonly called {{w|unclassified language|unclassified languages}}, but this is ambiguous between " ..
"languages that cannot be classified (due to insufficient data) and those that merely have not been classified " ..
"(due to insufficient research).",
}
local preceding_information = {
["qfa-dis"] = "{{also|Category:Unclassifiable languages|Category:Unassigned languages|Category:Language isolates}}",
["qfa-iso"] = "{{also|Category:Languages of disputed affiliation|Category:Unclassifiable languages|Category:Unassigned languages}}",
["qfa-unc"] = "{{also|Category:Languages of disputed affiliation|Category:Unassigned languages|Category:Language isolates}}",
["qfa-mix"] = "{{also|Category:Creole or pidgin languages}}",
["crp"] = "{{also|Category:Mixed languages}}",
}
local specially_named_families = {
["Languages of disputed affiliation"] = "qfa-dis",
["Language isolates"] = "qfa-iso",
}
local specially_named_family_sort_keys = {
["Languages of disputed affiliation"] = "Disputed affiliation",
["Language isolates"] = "Isolate",
}
insert(raw_handlers, function(data)
local family = require("Module:families").getByCategoryName(data.category)
if not family then
local special_code = specially_named_families[data.category]
if special_code then
family = require("Module:families").getByCode(special_code)
if not family then
error(("Internal error: Family code '%s' is an invalid family code."):format(special_code))
end
end
end
if not family then
return nil
end
local parent_fam = family:getFamily()
local first_parent, parent_sort_key, first_parent_sort_key
if not parent_fam or family_has_no_category(parent_fam) then
first_parent = "भाषाएँ परिवार अनुसार"
parent_sort_key = specially_named_family_sort_keys[data.category]
first_parent_sort_key = "*" .. (parent_sort_key or "")
else
first_parent = parent_fam:getCategoryName()
end
local description, additional = "", ""
local topright
local preceding = preceding_information[family:getCode()]
local additional_preface = additional_information[family:getCode()]
if additional_preface then
additional_preface = additional_preface .. "\n\n"
else
additional_preface = ""
end
if family_is_not_a_family(family) then
additional_preface = additional_preface ..
"This is a pseudo-family, used for grouping purposes but not forming a linguistically valid [[clade]] " ..
"(i.e. a set of linguistically related languages descending from a common parent).\n\n" ..
"Information about this family:\n\n"
else
additional_preface = "Information about " .. family:getCanonicalName() .. ":\n\n"
end
if not data.called_from_inside then
topright = {}
local wikipedia_art = family:getWikipediaArticle("noCategoryFallback")
if wikipedia_art then
insert(topright, "{{wp|" .. wikipedia_art .. "}}")
end
local commons_cat = family:getCommonsCategory()
if commons_cat then
insert(topright, "{{commonscat|" .. commons_cat:gsub("^श्रेणी:", "") .. "}}")
end
topright = #topright > 0 and concat(topright, "\n") or nil
description = "This is the main category of the '''" .. family:getDisplayForm() .. "'''."
additional = additional_preface .. infobox(family)
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
family:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
additional = additional .. NavFrame_for_family_tree(
tree_of_descendants,
"परिवार वृक्ष")
else
additional = additional .. "\n\n" .. ucfirst(family:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
local parents = {
{name = first_parent, sort = first_parent_sort_key},
{name = "सभी भाषा परिवार", sort = parent_sort_key},
}
if parent_fam and parent_fam:getCode() == "sgn" then
insert(parents, "All sign languages")
end
if family_is_papuan(family) then
insert(parents, "Papuan languages")
end
return {
preceding = preceding,
topright = topright,
description = description,
additional = additional,
parents = parents,
breadcrumb = family:getCanonicalName(),
can_be_empty = true,
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
6c0ywzwqj0mc8fgvtgg05763i0q9zww
কিন্নৰ
0
306938
487736
487723
2026-09-02T14:07:23Z
अजीत कुमार तिवारी
4887
साँचा सुधार.
487736
wikitext
text/x-wiki
=={{-as-}}==
===संज्ञा===
{{as-noun}}
# [[किन्नर]]
# देवलोक का एक उपदेवता जो एक प्रकार का गायक था और उसका मुँह घोड़े के समान होता था।
# बाजा जो बीन जैसा होता है लेकिन इस की लकड़ी इस से कुछ ज़्यादा लंबी होती है और इस में तीन कद्दू और दो तार होते हैं।
# वर्तमान समय में 'हिजड़ा' के लिए शिष्टोक्ति।
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# पुराणानुसार देवलोक या स्वर्ग के एक प्रकार के गायक-उपदेवता; (पुल्लिंग)
# आजकल गाने-बजाने का पेशा करने वाली एक जाति।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
ekeoj98bf0fr86ar9m47qzwn7l8io39
487778
487736
2026-09-02T17:07:27Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487778
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[किन्नर]]
# देवलोक का एक उपदेवता जो एक प्रकार का गायक था और उसका मुँह घोड़े के समान होता था।
# बाजा जो बीन जैसा होता है लेकिन इस की लकड़ी इस से कुछ ज़्यादा लंबी होती है और इस में तीन कद्दू और दो तार होते हैं।
# वर्तमान समय में 'हिजड़ा' के लिए शिष्टोक्ति।
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# पुराणानुसार देवलोक या स्वर्ग के एक प्रकार के गायक-उपदेवता; (पुल्लिंग)
# आजकल गाने-बजाने का पेशा करने वाली एक जाति।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
3q40lqzc202mmcowqyrud8cg7cuy5rb
অখন্ড
0
306939
487724
2026-09-02T13:54:55Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487724
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अखंड]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# जिसके खंड न हुए हों, समूचा, पूरा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
c2byragnpzmdyi00dsfab50hj3c76w0
487735
487724
2026-09-02T14:06:19Z
अजीत कुमार तिवारी
4887
साँचा सुधार.
487735
wikitext
text/x-wiki
=={{-as-}}==
===विशेषण===
{{as-adj}}
# [[अखंड]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# जिसके खंड न हुए हों, समूचा, पूरा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
fcf4elwtf42o6zkrv6heg3eiwt7tsk8
487777
487735
2026-09-02T17:06:58Z
अजीत कुमार तिवारी
4887
अनावश्यक साँचा जिसके कारण अनुभाग संपादनीय नहीं.
487777
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अखंड]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# जिसके खंड न हुए हों, समूचा, पूरा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
c2byragnpzmdyi00dsfab50hj3c76w0
अखण्ड़नीय
0
306940
487726
2026-09-02T13:56:18Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़नीय]] को [[अखण्डनीय]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी
487726
wikitext
text/x-wiki
#पुनर्प्रेषित [[अखण्डनीय]]
533qeyz69xntcq5jnhd80s0uwn7tpue
अखण्ड़
0
306941
487729
2026-09-02T13:58:48Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[अखण्ड़]] को [[अखंड]] पर स्थानांतरित किया: शीर्षक में गलत वर्तनी
487729
wikitext
text/x-wiki
#पुनर्प्रेषित [[अखंड]]
06k4cqem75qhdjr2njfmqjyod8tfdb8
आसामी
0
306942
487734
2026-09-02T14:03:44Z
अजीत कुमार तिवारी
4887
अजीत कुमार तिवारी ने पृष्ठ [[आसामी]] को [[असमिया]] पर स्थानांतरित किया: अधिक प्रचलित नाम.
487734
wikitext
text/x-wiki
#पुनर्प्रेषित [[असमिया]]
bc0omf0p5x5mtndsin4wlzl8322wwj5
मॉड्यूल:rhymes/data
828
306943
487756
2026-09-02T15:18:16Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487756
Scribunto
text/plain
local export = {}
-- List of languages which do not have entries in the Rhymes
-- namespace and link to the automatic category instead.
export.link_to_category_langs = {
["izh"] = true,
["mt"] = true,
["sq"] = true,
}
return export
88uttm5ad5u5las70bryawduhf0aqug
मॉड्यूल:labels/data/qualifiers
828
306944
487757
2026-09-02T15:54:49Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487757
Scribunto
text/plain
local labels = {}
-- Qualifiers and similar labels.
-- NOTE: This module is loaded both by [[Module:labels]] and by [[Module:accent qualifier]].
-- Helper labels
labels["_"] = {
display = "",
omit_preComma = true,
omit_postComma = true,
}
labels[","] = { -- forced comma
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
}
labels[";"] = {
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
}
labels[":"] = {
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
}
labels["?"] = {
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
}
labels["(?)"] = {
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
}
labels["-"] = { -- hyphen
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
omit_postSpace = true,
}
labels["–"] = { -- en dash
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
omit_postSpace = true,
}
labels["—"] = { -- em dash
omit_preComma = true,
omit_postComma = true,
omit_preSpace = true,
omit_postSpace = true,
}
labels["also"] = {
omit_postComma = true,
}
labels["and"] = {
aliases = {"&"},
omit_preComma = true,
omit_postComma = true,
}
-- e.g. "informal, but formal in Louisiana"
labels["but"] = {
omit_postComma = true,
}
labels["by"] = {
omit_preComma = true,
omit_postComma = true,
}
-- e.g. "except in", "except with" etc.
labels["except"] = {
omit_preComma = true,
omit_postComma = true,
}
labels["or"] = {
omit_preComma = true,
omit_postComma = true,
}
labels["outside"] = {
aliases = {"except in"},
omit_preComma = true,
omit_postComma = true,
}
labels["with"] = {
aliases = {"+"},
omit_preComma = true,
omit_postComma = true,
}
-- Qualifier labels
labels["attested in"] = {
omit_postComma = true,
}
labels["chiefly"] = {
aliases = {"mainly", "mostly", "primarily", "Chiefly"},
omit_postComma = true,
}
labels["especially"] = {
omit_postComma = true,
}
labels["excluding"] = {
omit_postComma = true,
}
labels["exclusively"] = {
aliases = {"strictly"},
omit_postComma = true,
}
labels["extremely"] = {
omit_postComma = true,
}
labels["formerly"] = {
omit_postComma = true,
}
labels["frequently"] = {
omit_postComma = true,
}
-- e.g. "highly nonstandard"
labels["highly"] = {
omit_postComma = true,
}
labels["in"] = {
omit_postComma = true,
}
labels["in a"] = {
omit_postComma = true,
}
labels["in an"] = {
omit_postComma = true,
}
labels["in the"] = {
omit_postComma = true,
}
labels["including"] = {
omit_postComma = true,
}
-- e.g. "less common"
labels["less"] = {
omit_postComma = true,
}
-- e.g. "many dialects"
labels["many"] = {
omit_postComma = true,
}
labels["markedly"] = {
omit_postComma = true,
}
labels["mildly"] = {
omit_postComma = true,
}
-- e.g. "more common"
labels["more"] = {
omit_postComma = true,
}
labels["now"] = {
aliases = {"nowadays"},
omit_postComma = true,
}
labels["occasionally"] = {
omit_postComma = true,
}
labels["of"] = {
omit_postComma = true,
}
labels["of a"] = {
omit_postComma = true,
}
labels["of an"] = {
omit_postComma = true,
}
labels["of the"] = {
omit_postComma = true,
}
labels["often"] = {
aliases = {"commonly"},
omit_postComma = true,
}
labels["originally"] = {
omit_postComma = true,
}
-- e.g. "law, otherwise archaic"
labels["otherwise"] = {
omit_postComma = true,
}
labels["particularly"] = {
omit_postComma = true,
}
labels["possibly"] = {
-- aliases = {"perhaps"},
omit_postComma = true,
}
labels["predominantly"] = {
omit_postComma = true,
}
labels["rarely"] = {
omit_postComma = true,
}
labels["rather"] = {
omit_postComma = true,
}
labels["relatively"] = {
omit_postComma = true,
}
labels["slightly"] = {
omit_postComma = true,
}
labels["sometimes"] = {
omit_postComma = true,
}
labels["somewhat"] = {
omit_postComma = true,
}
labels["strongly"] = {
omit_postComma = true,
}
labels["the"] = {
omit_postComma = true,
}
-- e.g. "then colloquial, now dated"
labels["then"] = {
omit_postComma = true,
}
labels["typically"] = {
omit_postComma = true,
}
labels["usually"] = {
omit_postComma = true,
}
labels["very"] = {
omit_postComma = true,
}
labels["with a"] = {
omit_postComma = true,
}
labels["with an"] = {
omit_postComma = true,
}
labels["with the"] = {
omit_postComma = true,
}
labels["with respect to"] = {
aliases = {"wrt"},
omit_postComma = true,
}
return require("Module:labels").finalize_data(labels)
ow7lz65j1yqeur8mu3w2vng38trdiut
मॉड्यूल:pron qualifier
828
306945
487760
2026-09-02T15:59:45Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487760
Scribunto
text/plain
-- TODO: this module is now used for more than just pronunciations and should be renamed.
local export = {}
local labels_module = "Module:labels"
local qualifier_module = "Module:qualifier"
local references_module = "Module:references"
local function track(page)
require("Module:debug/track")("pron qualifier/" .. page)
return true
end
--[==[
This function is used by any module that wants to add support for (some subset of) left and right regular and accent
qualifiers, labels and references to a template, e.g. for pronunciations.
It is currently used by [[Module:IPA]], [[Module:rhymes]], [[Module:hyphenation]], [[Module:homophones]],
[[Module:affix]] and various lang-specific modules such as [[Module:es-pronunc]] (for specifying pronunciation,
rhymes, hyphenation, homophones and audio in {{tl|es-pr}}). It should potentially also be used in {{tl|audio}}.
To reduce memory usage, the caller should check that any qualifiers exist before loading the module.
`data` is a structure containing the following fields:
* `q`: List of left regular qualifiers, each a string.
* `qq`: List of right regular qualifiers, each a string.
* `qualifiers`: List of qualifiers, each a string, for compatibility. If `qualifiers_right` is given, these are
right qualifiers, otherwise left qualifiers. If both `qualifiers` and `q`/`qq` (depending on the value of
`qualifiers_right`) are non-{nil}, `qualifiers` is ignored.
* `qualifiers_right`: If specified, qualifiers in `qualifiers` are placed to the right, otherwise the left. See above.
* `a`: List of left accent qualifiers, each a string.
* `aa`: List of right accent qualifiers, each a string.
* `l`: List of left labels, each a string.
* `ll`: List of right labels, each a string.
* `refs`: {nil} or a list of references or reference specs to add directly after the text; the value of a list item
is either a string containing the reference text (typically a call to a citation template such as {{tl|cite-book}}, or
a template wrapping such a call), or an object with fields `text` (the reference text), `name` (the name of the
reference, as in {{cd|<nowiki><ref name="foo">...</ref></nowiki>}} or {{cd|<nowiki><ref name="foo" /></nowiki>}})
and/or `group` (the group of the reference, as in {{cd|<nowiki><ref name="foo" group="bar">...</ref></nowiki>}} or
{{cd|<nowiki><ref name="foo" group="bar"/></nowiki>}}); this uses a parser function to format the reference
appropriately and insert a footnote number that hyperlinks to the actual reference, located in the
{{cd|<nowiki><references /></nowiki>}} section.
* `lang`: Language object for accent qualifiers.
* `text`: The text to wrap with qualifiers.
*` raw`: Don't do any CSS wrapping of the formatted text.
The order of qualifiers and labels, on both the left and right, is (1) labels, (2) accent qualifiers, (3) regular
qualifiers. This goes in order of relative importance.
]==]
function export.format_qualifiers(data)
if not data.text then
error("Missing `data.text`; did you try to pass `text` or `qualifiers_right` as separate params?")
end
if not data.lang then
track("nolang")
end
local text = data.text
-- Format the qualifiers and labels that go either before or after the main text. They are ordered as follows, on
-- both the left and the right: (1) labels, (2) accent qualifiers, (3) regular qualifiers. This puts the different
-- types of qualifiers/labels in order of relative importance. Return nil if no qualifiers or labels, otherwise
-- a string containing all formatted qualifiers and labels surrounded by parens.
local function format_qualifier_like(labels, accent_qualifiers, qualifiers)
local has_qualifiers = qualifiers and qualifiers[1]
local has_accent_qualifiers = accent_qualifiers and accent_qualifiers[1]
local has_labels = labels and labels[1]
if not has_qualifiers and not has_accent_qualifiers and not has_labels then
return nil
end
local qualifier_like_parts = {}
local function ins(part)
table.insert(qualifier_like_parts, part)
end
local function format_label_like(labels, mode)
return require(labels_module).show_labels {
lang = data.lang,
labels = labels,
nocat = true,
mode = mode,
open = false,
close = false,
no_ib_content = true,
no_track_already_seen = true,
ok_to_destructively_modify = true, -- doesn't apply to `labels`
raw = data.raw,
}
end
local m_qualifier = require(qualifier_module)
if has_labels then
ins(format_label_like(labels))
end
if has_accent_qualifiers then
ins(format_label_like(accent_qualifiers, "accent"))
end
if has_qualifiers then
ins(m_qualifier.format_qualifiers {
qualifiers = qualifiers,
open = false,
close = false,
no_ib_content = true,
raw = data.raw,
})
end
local qualifier_inside
local function wrap_qualifier_css(txt, suffix)
if data.raw then
return txt
else
return m_qualifier.wrap_qualifier_css(txt, suffix)
end
end
if qualifier_like_parts[2] then
qualifier_inside = table.concat(qualifier_like_parts, wrap_qualifier_css(",", "comma") .. " ")
else
qualifier_inside = qualifier_like_parts[1]
end
qualifier_like_parts = {}
ins(wrap_qualifier_css("(", "brac"))
ins(wrap_qualifier_css(qualifier_inside, "content"))
ins(wrap_qualifier_css(")", "brac"))
return table.concat(qualifier_like_parts)
end
if data.refs then
text = text .. require(references_module).format_references(data.refs)
end
local leftq = format_qualifier_like(data.l, data.a, data.q or not data.qualifiers_right and data.qualifiers)
local rightq = format_qualifier_like(data.ll, data.aa, data.qq or data.qualifiers_right and data.qualifiers)
if leftq then
text = leftq .. " " .. text
end
if rightq then
text = text .. " " .. rightq
end
return text
end
return export
nkakbwx2we31h7ak7pqnd0ng4a55308
मॉड्यूल:template parser/templates
828
306946
487768
2026-09-02T16:36:17Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487768
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local m_template_parser = require("Module:template parser")
local display_parameter = m_template_parser.displayParameter
local process_params = require("Module:parameters").process
local template_link = m_template_parser.templateLink
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local wikitag_link = m_template_parser.wikitagLink
local function get_offset_template_args(frame)
-- Process parameters with the return_unknown flag set. `title` contains
-- the title at key 1; everything else goes in `args`.
local title, args = process_params(frame:getParent().args, {
[1] = {required = true, allow_empty = true, no_trim = true}
}, true)
title = title[1]
-- Shift all implicit arguments down by 1. Non-sequential numbered
-- parameters don't get shifted; however, this offset means that if the
-- input contains (e.g.) {{tl|l|en|3=alt}}, representing {{l|en|3=alt}},
-- the parameter at 3= is instead treated as sequential by this module,
-- because it's indistinguishable from {{tl|l|en|alt}}, which represents
-- {{l|en|alt}}. On the other hand, {{tl|l|en|4=tr}} is handled correctly,
-- because there's still a gap before 4=.
-- Unfortunately, there's no way to know the original input, so
-- there's no clear way to fix this; the only difference is that explicit
-- parameters have whitespace trimmed from their values while implicit ones
-- don't, but we can't assume that every input with no whitespace was given
-- with explicit numbering.
-- This also causes bigger problems for any parser functions which treat
-- their inputs as arrays, or in some other nonstandard way (e.g.
-- {{#IF:foo|bar=baz|qux}} treats "bar=baz" as parameter 1). Without
-- knowing the original input, these can't be reconstructed accurately.
-- The way around this is to use <nowiki> tags in the input, since this
-- module won't unstrip them by design.
local i = 2
repeat
local arg = args[i]
args[i - 1] = arg
i = i + 1
until arg == nil
return title, args
end
function export.template_link_t(frame)
local iargs = process_params(frame.args, {
["annotate"] = true,
["nolink"] = {type = "boolean"},
})
-- iargs.annotate allows a template to specify the title, so the input
-- arguments will match the output.
local title = iargs.annotate
if title then
return template_link(title, frame:getParent().args, iargs.nolink)
end
-- Otherwise, get template arguments offset by 1.
local args
title, args = get_offset_template_args(frame)
return template_link(title, args, iargs.nolink)
end
function export.template_demo_t(frame)
local title, args = get_offset_template_args(frame)
return template_link(title, args) .. " ⇒<br style=\"line-height: 200%;\" />" .. frame:expandTemplate{title = title, args = args}
end
function export.parameter_t(frame)
return display_parameter(unpack(process_params(frame:getParent().args, {
[1] = {required = true, allow_empty = true, no_trim = true},
[2] = {allow_empty = true, no_trim = true},
})))
end
function export.wikitag_link_t(frame)
return wikitag_link(process_params(frame:getParent().args, {
[1] = {required = true, allow_empty = true, no_trim = true}
})[1])
end
return export
gmu9dpbh2ydrhfx4p61dfx6c72aig0i
मॉड्यूल:table/length
828
306947
487771
2026-09-02T16:39:00Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487771
Scribunto
text/plain
local ipairs_default_iter = ipairs{}
return function(t, raw)
local n = 0
if raw then
for i in ipairs_default_iter, t, 0 do
n = i
end
return n
end
repeat
n = n + 1
until t[n] == nil
return n - 1
end
tryk70hxgidgdgqrb7utnj2sub9w656
मॉड्यूल:code
828
306948
487772
2026-09-02T16:40:29Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487772
Scribunto
text/plain
local decode_entities = require("Module:string utilities").decode_entities
local gsub = string.gsub
local insert = table.insert
local match = string.match
local process_params = require("Module:parameters").process
local tonumber = tonumber
local unstripNoWiki = mw.text.unstripNoWiki
local yesno = require("Module:yesno")
local export = {}
local function get_args(frame)
local params = {
[1] = {required = true, default = "code"},
[""] = {alias_of = 1},
["line"] = true,
["highlight"] = true,
["inline"] = {type = "boolean"},
["class"] = true,
["style"] = true,
}
local lang = process_params(frame.args, {
["lang"] = true
}).lang
local args = frame:getParent().args
-- Specialised language templates (e.g. {{lua}}).
if lang then
args = process_params(args, params)
return args, lang, args[1]
end
params["lang"] = {default = "text"}
-- If 2= or "=..." are given, treat 1= as an alias of lang=.
if args[2] or args[""] then
insert(params, 1, {alias_of = "lang"})
params[""].alias_of = 2
args = process_params(args, params)
return args, args.lang, args[2]
end
-- Otherwise, 1= is just the input text.
args = process_params(args, params)
return args, args.lang, args[1]
end
function export.show(frame)
local args, lang, text = get_args(frame)
local inline, line, start, highlight = args.inline
if not inline then
-- If `line` is a boolean, start at line 1; otherwise, if it's a number,
-- start at that line.
line = args.line
if line then
start = match(line, "^%d+$")
if start == nil then
line = yesno(line) or nil
end
end
-- Offset `highlight` based on `start`.
highlight = args.highlight
if highlight and start then
local offset = tonumber(start) - 1
highlight = gsub(highlight, "%d+", function(n)
return tonumber(n) - offset
end)
end
-- If `inline` isn't specified, default to false if `line` or
-- `highlight` are given; otherwise, default to true.
inline = inline == nil and not (line or highlight) or nil
end
-- Unstrip nowiki tags and decode any HTML entities, because
-- syntaxhighlight won't decode them on display.
return frame:extensionTag(
"syntaxhighlight",
decode_entities(unstripNoWiki(text)), {
lang = lang,
line = line,
start = start,
highlight = highlight,
inline = inline,
class = args.class,
style = args.style or inline and "white-space:pre-wrap;" or nil
})
end
return export
nwb4osef670b9grczjn0ua50bnmbng5
অখাদ্য
0
306949
487780
2026-09-02T17:12:25Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487780
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अखाद्य]]
# [[अभक्ष्य]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
न खाने योग्य, अभक्ष्य।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
tviwd95l4iiahpkbv8mgzs44o0vyreh
অখিল
0
306950
487783
2026-09-02T17:14:18Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487783
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अखिल]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
संपूर्ण, सारा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
7myd3h3ew58qwgki68te7f1tgaeqksq
साँचा:pagename
10
306951
487784
2026-09-02T17:14:43Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487784
wikitext
text/x-wiki
<includeonly>{{safesubst:<noinclude/>#invoke:pages/templates|pagename_t}}</includeonly><noinclude><!--
-->{{documentation}}</noinclude>
5eyxwd521bez42cgt9zhe8dipmghpbi
অগম্য
0
306952
487786
2026-09-02T17:18:20Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487786
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अगम्य]]
# [[अगम]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# पहुँच के बाहर, दुर्गम;
# अप्राप्य;
# अज्ञेय;
# जिससे सहवास न किया जा सके।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
fmaeramwkpyy602gjetmblo61ytgqll
मॉड्यूल:pages/templates
828
306953
487790
2026-09-02T17:21:39Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487790
Scribunto
text/plain
-- Prevent substitution.
if mw.isSubsting() then
return require("Module:unsubst")
end
local export = {}
local en_utilities_module = "Module:en-utilities"
local headword_data_module = "Module:headword/data"
local headword_page_module = "Module:headword/page"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local links_module = "Module:links"
local pages_module = "Module:pages"
local parameters_module = "Module:parameters"
--[==[
Implementation of {{tl|pagename}}.
]==]
function export.pagename_t(frame)
local args = require(parameters_module).process(frame:getParent().args, {
["title"] = true,
})
local title = args.title
if not title then
return mw.loadData(headword_data_module).pagename
end
return require(headword_page_module).process_page(title, "no_fetch_content").pagename
end
--[==[
Implementation of {{tl|pagetype}}.
]==]
function export.pagetype_t(frame)
local args = require(parameters_module).process(frame:getParent().args, {
["article"] = {type = "boolean"},
["pagename"] = {demo = true},
})
local pagename = args.pagename
local pagetype = require(pages_module).get_pagetype(
pagename == nil and mw.title.getCurrentTitle() or
mw.title.new(pagename) or
error(("%s is not a valid page name"):format(mw.dumpObject(pagename)))
)
return args.article and (
pagetype:match("^user%f[%W]") and "a " .. pagetype or -- avoids "an user"
require(en_utilities_module).add_indefinite_article(pagetype)
) or pagetype
end
--[==[
Implementation of {{tl|page is large}}.
]==]
function export.page_is_large_t(frame)
local args = require(parameters_module).process(frame:getParent().args, {
[1] = true,
})
local pagename = args[1] or mw.loadData(headword_data_module).pagename
return require(headword_data_module).large_pages[pagename] and "true" or ""
end
--[==[
Implementation of {{tl|page exists}}.
]==]
function export.page_exists_t(frame)
local args = require(parameters_module).process(frame:getParent().args, {
[1] = {required = true, template_default = "a"},
use_exists = {type = "boolean"},
})
-- Here, we convert logical to physical not directly by calling logicalToPhysical(), which will not handle
-- non-mainspace pages correctly, but get_link_page(), which will do the same handling as full_link() does.
-- This will strip italics, bold, HTML comments, strip markers and soft hyphens (FIXME: this may or may not
-- be what we want), and normally will do diacritic stripping, but we turn this off by specifying Translingual
-- with script None. Specifying Translingual also has the effect that mammoth pages return the base page rather
-- than one of the splits.
local mul = require(languages_module).getByCode("mul", true)
local None = require(scripts_module).getByCode("None", true)
local physical_page = require(links_module).get_link_page(args[1], mul, None)
if not physical_page then
-- weird cases like a triple-brace parameter in the pagename
return ""
end
local title = mw.title.new(physical_page)
return title and (args.use_exists and title.exists or title:getContent()) and "true" or ""
end
--[==[
Adapted from [[Module:ugly hacks]], which will be going away. Meant to be invoked directly.
Returns the string {"valid"} if the page name in {{para|1}} is a valid pagename, otherwise a blank string.
]==]
function export.is_valid_pagename(frame)
local iargs = require(parameters_module).process(frame.args, {
[1] = true,
})
return require(pages_module).is_valid_page_name(iargs[1]) and "valid" or ""
end
--[==[
Alternative entry point for {{cd|is_valid_pagename}}.
]==]
function export.is_valid_page_name(frame)
return export.is_valid_pagename(frame)
end
return export
6d98vkd0tevo098gptnbvy7put65ui8
অঘোন
0
306954
487791
2026-09-02T17:25:00Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487791
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[अगहन]]
# कार्तिक के बाद, वर्ष का नौवाँ महीना।
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
कार्तिक और पोस [पौष] के बीच का महीना, मार्गशीर्ष, अग्रहायण।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
omzd50dwa5eswmqxkwgapry54vxaez6
অদাহ্য
0
306955
487792
2026-09-02T17:27:46Z
अजीत कुमार तिवारी
4887
+असमिया से शब्द.
487792
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[अग्निसह]]
# [[अदाह्य]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
जो अग्नि में पड़कर भी न जलता हो, आग के प्रभाव से रहित।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
gtkssvexpgydiz5gkwib6zv6wrdrpzt
श्रेणी:ग़लत क्रम वाली भाषा हेडिंग वाले पृष्ठ
14
306956
487799
2026-09-02T17:54:15Z
SM7
6218
नई रखरखाव श्रेणी निर्मित
487799
wikitext
text/x-wiki
[[श्रेणी:विक्षनरी रखरखाव|हेड]]
3s3o5nuw7ujc2gijt5sylwksr67nnbr
मॉड्यूल:category tree/entry maintenance
828
306957
487806
2026-09-02T19:09:04Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487806
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local functions_module = "Module:fun"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local table_module = "Module:table"
local extend = require(table_module).extend
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["प्रविष्टि रखरखाव"] = {
description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "मूलभूत श्रेणी",
}
labels["entries with incorrect language header"] = {
description = "{{{langname}}} entries that have been placed under the wrong language header.",
additional = "This can happen for several reasons:\n" ..
"* Typos.\n" ..
"* Vandalism.\n" ..
"* Using the wrong language code.\n" ..
"* Using an alternative name for the language.\n" ..
"* Using special characters which haven't been used in the name given in the language data modules.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References header"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References or Further reading header"] = {
description = "{{{langname}}} entries without a References or Further reading header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries that don't exist"] = {
description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.",
parents = {"entry maintenance"},
umbrella_parents = "Fundamental",
}
labels["entries with etymology trees"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology texts"] = {
description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymon"] = {
description = "{{{langname}}} entries that use the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology text stop language not in chain"] = {
description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing ambiguous etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with mismatched IDs"] = {
description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with multiple etymons missing IDs"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with etymology sections missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without this term in Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with language name categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with topic categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with outdated source"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"entry maintenance"},
}
labels["entries with inflection not matching pagename"] = {
description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.",
additional = "This is usually the result of incorrect or missing parameters.",
breadcrumb_and_first_sort_key = "inflection not matching pagename",
parents = {"entry maintenance"},
hidden = true,
can_be_empty = true,
}
labels["undefined derivations"] = {
description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["descendants to be fixed in desctree"] = {
description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["term requests"] = {
description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["redlinks"] = {
description = "Links to {{{langname}}} entries that have not been created yet.",
parents = {"entry maintenance"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["terms with IPA pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of IPA.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with enPR pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of enPR.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with Indic pronunciation"] = {
description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["IPA pronunciations with invalid separators"] = {
description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"entry maintenance"},
}
labels["terms with audio pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.",
additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with nonstandard or incorrect audio pronunciations"] = {
description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.",
parents = {"terms with audio pronunciation"},
can_be_empty = true,
hidden = true,
}
labels["entries missing Template:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation)
labels[label] = {
description = desc or "Pages containing {{{langname}}} " .. label .. ".",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Note that the pages in this category are not necessarily the same as the actual term in question. This " ..
"frequently happens, for example, with English pages with translation sections, where the term that " ..
"triggers the addition of the category is one of the translations."),
parents = {"entry maintenance"},
-- Set catfix = false because the page will have a mixture of native-language and
-- non-native-language pages, but include the normal native-language table of contents headers
-- because most pages are in the native language.
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
end
add_manual_param_category("terms in nonstandard scripts", nil,
"Pages are placed here if they contain terms written in a script that isn't in the language's " ..
"list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.",
true)
add_manual_param_category("terms with non-redundant manual transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with redundant transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant manual script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.",
true)
add_manual_param_category("terms with redundant script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant non-automated sortkeys",
"{{{langname}}} terms with non-redundant non-automated sortkeys.",
"Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " ..
"generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " ..
"parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " ..
"sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " ..
"page will also be added here.")
add_manual_param_category("terms with redundant sortkeys",
"{{{langname}}} terms with redundant sortkeys.",
"Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " ..
"as the one which is automatically generated.")
add_manual_param_category("links with redundant target parameters",
"Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " ..
"separately.",
"This occurs when the only difference between the link target and the alt text is that the alt text contains " ..
"diacritics (or other characters) which would have been ignored anyway had they been included in the link " ..
"target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " ..
"({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " ..
"displayed.")
add_manual_param_category("links with ignored alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.",
"This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " ..
"({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).")
add_manual_param_category("links with ignored id parameters",
"Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant wikilinks",
"Pages containing {{{langname}}} links which contain a redundant wikilink.",
"This occurs if link target consists of a single wikilink, which should instead be entered in the " ..
"conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " ..
"is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " ..
"{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " ..
"unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}")
add_manual_param_category("links with manual fragments",
"Pages containing {{{langname}}} links where a manual link fragment has been given.",
"This occurs when the link fragment has been specified using {{code|#}} after the term, " ..
"which overrides the normal fragment generated by link templates that points to the relevant " ..
"language section.\n\nLink fragments are used to point to a specific section on a target page, and " ..
"it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " ..
"additional content is added to the target page: for example, the fragment {{code|#Adjective}} " ..
"will start pointing to the wrong section if another language with an adjective section is added above " ..
"the intended language.")
labels["descendant hubs"] = {
description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.",
parents = {"entry maintenance"},
}
labels["terms needing to be assigned to a sense"] = {
description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
--[=[
labels["terms with inflection tables"] = {
description = "{{{langname}}} entries that contain inflection tables.".
additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
]=]
labels["terms with collocations"] = {
description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.",
additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Collocation maintenance",
}
labels["terms with usage examples"] = {
description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.",
additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Usage example maintenance",
}
labels["terms with quotations"] = {
description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.",
additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Quotation maintenance",
}
labels["terms with interlinear glossed text"] = {
description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.",
parents = {"entry maintenance"},
}
labels["terms with redundant head parameter"] = {
description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).",
additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their headword lines"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their inflection tables"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["requests for English equivalent term"] = {
description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance"
labels[quot_type .. " with omitted translation"] = {
description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.",
parents = {"entry maintenance"},
umbrella = {
parents = {name = umbrella_parent, sort = "omitted translation"},
breadcrumb = "with omitted translation",
},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do
labels[pos .. " with red links in their headword lines"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"terms with red links in their headword lines"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " with red links in their inflection tables"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"terms with red links in their inflection tables"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
local label = pos .. " with unknown or uncertain plurals"
labels[label] = {
description = "{{{langname}}} " .. label .. ".",
additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " ..
"is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " ..
"using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " ..
"that a plural cannot be attested but the noun is theoretically countable.",
breadcrumb = "with unknown or uncertain plurals",
parents = {
{name = pos, sort = "unknown or uncertain plurals"},
"entry maintenance",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if data.umbrella == nil and data.umbrella_parents == nil then
data.umbrella_parents = "Entry maintenance subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Entry maintenance subcategories by language"] = {
description = "Umbrella categories covering topics related to entry maintenance.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "entry maintenance", is_label = true, sort = " "},
},
}
raw_categories["Citation maintenance"] = {
description = "Categories for maintaining citations specified using {{tl|cite-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "citations",
}
raw_categories["Collocation maintenance"] = {
description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "collocations",
}
raw_categories["Quotation maintenance"] = {
description = "Categories for maintaining quotations specified using {{tl|quote-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "quotations",
}
raw_categories["Usage example maintenance"] = {
description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "usage examples",
}
raw_categories["Citations using nocat parameter"] = {
description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Citation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotation templates to be cleaned"] = {
description = "Instances of quotations using {{tl|quote-text}}.",
additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.",
parents = {"Quotation maintenance"},
breadcrumb_base = "to be cleaned",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using nocat parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Quotation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using quoted-in parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.",
additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.",
parents = {{name = "Quotation maintenance", sort = "quoted-in"}},
breadcrumb = "using quoted-in parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Category:Wiktionary"},
}
raw_categories["Requests by language"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Request subcategories by language", sort = " "},
{name = "Requests", sort = " "},
},
breadcrumb = "By language",
}
raw_categories["Request subcategories by language"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Requests", sort = " "},
},
}
raw_categories["Requests for quotations by source"] = {
description = "Categories with requests for quotation, broken out by the source of the quotation.",
additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].",
parents = {{name = "Requests for quotations", sort = "source"}},
breadcrumb = "By source",
}
raw_categories["Requests for quotations"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"},
breadcrumb = "Quotations",
}
raw_categories["Requests for date"] = {
description = "Requests for a date to be added to a quotation.",
additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " ..
"Please remove the template from the article once the date has been provided.",
parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"},
breadcrumb = "Date",
}
raw_categories["Requests for translations in user-competency categories by number of users"] = {
description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.",
parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}},
breadcrumb = "Translations in user-competency categories by number of users",
}
raw_categories["Requests for translations in user-competency categories by language"] = {
description = "Requests for translations to be added to user-competency categories, sorted by language.",
parents = {{name = "Requests", sort = "translations in user-competency categories by language"}},
breadcrumb = "Translations in user-competency categories by language",
hidden = true,
}
raw_categories["Terms with translations by language"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}},
breadcrumb = "Translations",
}
raw_categories["Entries using missing taxonomic names"] = {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." ..
"\n\nSee [[:Category:mul:Taxonomic names]].",
parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}},
breadcrumb = "Missing taxonomic names",
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function script_name_to_code(name)
local sc = require(scripts_module).getByCanonicalName(name)
if not sc then
error("Unrecognized script name '" .. name .. "'")
end
return sc:getCode()
end
--[=[
This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings
that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an
`items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at
least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in
other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in
functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in
turn references a third property).
If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing
group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in
which case there is no language name associated with the category name. The language name must be the canonical name of
a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name
may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and
`language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional
properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full
language of the etymology-only language.
If the `regex` values of multiple category specs match, the first one takes precedence.
Recognized or predefined properties:
`pagename`: Current pagename.
`regex`: See above.
`1`, `2`, `3`, ...: See above.
`language_name`, `language_code`, `language_object`: See above.
`parent_language_name`, `parent_language_code`, `parent_language_object`: See above.
`nolang`: See above.
`allow_etym_lang`: Language names may be etymology-only languages. See above.
`description`: Override the description (normally taken directly from the pagename).
`template_name`: Name of template which generates this category.
`template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to
display an example template call and the output of this call.
`template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when
generating example template output (but not when displaying an example template call) and is intended for a template
call that uses the |nocat=1 parameter.
`template_example_output`: Override the text that displays example template output (see `template_sample_call`).
`additional_template_description`: Extra text to be displayed after the example template output.
`parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and
sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have
{{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO
by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any
parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the
parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case
`etym_parents` is used instead.
`etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as
`parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name
replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests
concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
`umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language
is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated
language is an etymology-only language); otherwise there will be no umbrella category.
`additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with
"Request subcategories by language".
`breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the
pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be
"FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from
the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only
language is associated with the category, in which case `etym_breadcrumb` is used instead.
`etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value
of `language_name`.
`not_hidden_category`: Don't hide the category.
`catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is
expanded.
`toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that
request-specific {{{PROPERTY}}} syntax is expanded.
In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately
expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the
`template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when
inserted, so template references are not expanded. Triple-brace property references are still expanded in these
properties; but beware that if any of those property references contain template references, they won't be expanded.
(This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references
{{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this
property using a function.)
]=]
local requests_categories = {
{
regex = "^Requests concerning (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "entry maintenance", is_label = true, sort = "requests"}},
etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"},
{name = "{{{1}}}", sort = "Requests"}},
umbrella = "Requests by language",
breadcrumb = "Requests",
not_hidden_category = true,
},
{
regex = "^Requests for etymologies in (.+) entries$",
allow_etym_lang = true,
umbrella = "Requests for etymologies by language",
template_name = "rfe",
},
{
regex = "^Requests for expansion of etymologies in (.+) entries$",
umbrella = "Requests for expansion of etymologies by language",
template_name = "etystub",
},
{
regex = "^Requests for pronunciation in (.+) entries$",
umbrella = "Requests for pronunciation by language",
template_name = "rfp",
},
{
regex = "^Requests for audio pronunciation in (.+) entries$",
umbrella = "Requests for audio pronunciation by language",
template_name = "rfap",
},
{
regex = "^Requests for definitions in (.+) entries$",
umbrella = "Requests for definitions by language",
template_name = "rfdef",
},
{
regex = "^Requests for clarification of definitions in (.+) entries$",
umbrella = "Requests for clarification of definitions by language",
template_name = "rfclarify",
},
}
for _, spec_with_pos in ipairs {
{"inflections", "rfinfl"},
{"plural forms"},
{"tone", "rftone"},
{"accents"},
{"aspect", "rfaspect"},
{"animacy"},
{"gender", "rfgender"},
{"noun class"},
} do
local property, rftemplate = unpack(spec_with_pos)
table.insert(requests_categories,
{
-- This is for part-of-speech-specific categories such as
-- "Requests for inflections in Northern Ndebele noun entries" or
-- "Requests for accents in Ukrainian proper noun entries".
-- Here and below, we assume that the part of speech is begins with
-- a lowercase letter, while the preceding language name ends in a
-- capitalized word. Note that this entry comes before the
-- following one and takes precedence over it.
regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property),
parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}},
umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property),
breadcrumb = "{{{2}}}",
template_name = rftemplate,
template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s in (.+) entries$"):format(property),
umbrella = ("Requests for %s by language"):format(property),
template_name = rftemplate,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s of (.+) by language$"):format(property),
nolang = true,
}
)
end
extend(requests_categories, {
{
regex = "^Requests for example sentences in (.+)$",
umbrella = "Requests for example sentences by language",
template_name = "rfex",
},
{
regex = "^Requests for quotations in (.+)$",
umbrella = "Requests for quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfquote",
},
{
regex = "^Requests for translations into (.+)$",
allow_etym_lang = true,
umbrella = "Requests for translations by language",
template_name = "t-needed",
catfix = "en",
},
{
regex = "^Requests for translations of (.+) usage examples$",
allow_etym_lang = true,
umbrella = "Requests for translations of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|usex}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}",
additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for translations of (.+) quotations$",
allow_etym_lang = true,
umbrella = "Requests for translations of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|quote}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}",
additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for review of (.+) translations$",
allow_etym_lang = true,
umbrella = "Requests for review of translations by language",
template_name = "t-check",
template_sample_call = "{{t-check|{{{language_code}}}|example}}",
template_example_output = "",
catfix = "en",
},
{
regex = "^Requests for transliteration of (.+) terms$",
umbrella = "Requests for transliteration by language",
template_name = "rftranslit",
additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " ..
"the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " ..
"automated transliteration, such as Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) usage examples$",
umbrella = "Requests for transliteration of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rftranslit",
template_sample_call = "{{rftranslit|{{{language_code}}}}}",
template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) quotations$",
umbrella = "Requests for transliteration of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for native script for (.+) terms$",
allow_etym_lang = true,
etym_parents = {
{name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "native script"},
},
umbrella = "Requests for native script by language",
template_name = "rfscript",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for native script in (.+) usage examples$",
umbrella = "Requests for native script in usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied."
},
{
regex = "^Requests for native script in (.+) quotations$",
umbrella = "Requests for native script in quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied."
},
{
regex = "^Requests for (.+) script for (.+) terms$",
language_name = "{{{2}}}",
allow_etym_lang = true,
parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}},
etym_parents = {
{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"},
},
umbrella = "Requests for {{{1}}} script by language",
breadcrumb = "{{{1}}}",
etym_breadcrumb = "{{{1}}}",
template_name = "rfscript",
-- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the
-- conversion of script name to script code needs to be done using an inline function like this, instead of
-- a {{#invoke:...}} template call.
script_code = function(items)
return script_name_to_code(items["1"])
end,
template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for (.+) script by language$",
parents = {{name = "Requests for script by language", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
},
{
regex = "^Requests for script by language$",
nolang = true,
},
{
regex = "^Requests for images in (.+) entries$",
umbrella = "Requests for images by language",
template_name = "rfi",
},
{
regex = "^Requests for references for (.+) terms$",
umbrella = "Requests for references by language",
template_name = "rfref",
},
{
regex = "^Requests for references for etymologies in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}},
umbrella = "Requests for references for etymologies by language",
breadcrumb = "Etymologies",
template_name = "rfv-etym",
},
{
regex = "^Requests for references for pronunciations in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}},
umbrella = "Requests for references for pronunciations by language",
breadcrumb = "Pronunciations",
template_name = "rfv-pron",
},
{
regex = "^Requests for attention concerning (.+)$",
umbrella = "Requests for attention by language",
breadcrumb = "Attention",
template_name = "attention",
template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}",
template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.",
-- These pages typically contain a mixture of English and native-language entries, so disable catfix.
catfix = false,
-- Setting catfix = false will normally trigger the English table of contents template.
-- We still want the native-language table of contents template, though.
toc_template = "{{{language_code}}}-categoryTOC",
toc_template_full = "{{{language_code}}}-categoryTOC/full",
},
{
regex = "^Requests for cleanup in (.+) entries$",
umbrella = "Requests for cleanup by language",
template_name = "rfc",
template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$",
umbrella = "Requests for cleanup of Pronunciation N headers by language",
template_name = "rfc-pron-n",
template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}",
template_example_output = "This template does not generate any text in entries.",
additional_template_description = [=[
The purpose of this category is to tag entries that use headers with "Pronunciation" and a number.
While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header.
[[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed.
This category is hidden.]=],
},
{
regex = "^Requests for deletion in (.+) entries$",
umbrella = "Requests for deletion by language",
template_name = "rfd",
template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for verification in (.+) entries$",
umbrella = "Requests for verification by language",
template_name = "rfv",
},
{
regex = "^Requests for attention in (.+) etymologies$",
umbrella = "Requests for attention by language"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfquotek",
template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}",
},
{
regex = "^Requests for date in (.+) entries$",
umbrella = "Requests for date by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfdate",
additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " ..
"automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " ..
"parameter in each case on the page automatically removes the article from this category. See " ..
"[[Wiktionary:Quotations]] for information about formatting dates and quotations.",
},
{
regex = "^Requests for date/(.+)$",
description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.",
parents = {{name = "Requests for date by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfdatek",
template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}",
},
{
regex = "^Requests for attestation of (.+) terms$",
umbrella = "Requests for attestation of terms by language",
breadcrumb = "Attestation",
additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)."
},
})
local user_competency_additional_template_description = "This is added by user-competency categories such as " ..
"[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " ..
"the native-language text indicating this fact is missing. The appropriate translation should mirror the " ..
"English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " ..
"level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " ..
"language in the text should be surrounded by double angle brackets, e.g. \"<<français>>\", which " ..
"causes it to be automatically linked to the appropriate parent category."
local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}",
nolang = true,
}
})
table.insert(raw_handlers, function(data)
local items
local function init_items()
items = {pagename = data.category}
end
local function expand_value(item, val)
if not val then
return val
elseif is_callable(val) then
return expand_value(item .. " ⇒ function", val(items))
elseif type(val) == "table" then
for k, v in pairs(val) do
val[k] = expand_value(item .. " ⇒ " .. k, v)
end
return val
elseif type(val) == "number" then
val = tostring(val)
end
if type(val) ~= "string" then
error(("The item '%s' on page %s is of type %s and can't be concatenated"):format(
item, items.pagename, type(val)))
end
-- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done
-- recursively, since some of the items are nested:
-- {{{template_sample_call_with_temp}}}
-- ⇓
-- {{{{{template_name}}}|{{{language_code}}}}}
-- ⇓
-- {{attention|en}}
if val:find("{{{") then
val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop)
local propval = items[prop]
if not propval then
error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"):
format(prop, item, items.pagename))
end
return expand_value(item .. " ⇒ " .. prop, propval)
end
)
end
return val
end
local function expand_items_value(item)
return expand_value(item, items[item])
end
local function convert_items_to_category_data(items)
if not items.nolang then
items.language_name = items.language_name or "{{{1}}}"
items.language_name = expand_items_value("language_name")
items.language_object = require(languages_module).getByCanonicalName(items.language_name, true,
items.allow_etym_lang)
items.language_code = items.language_object:getCode()
items.is_etym_lang = items.language_object:hasType("etymology-only")
if items.is_etym_lang then
items.parent_language_object = items.language_object:getFull()
-- Reject weird cases where etymology language has no parent.
if not items.parent_language_object then
return nil
end
items.parent_language_code = items.parent_language_object:getCode()
items.parent_language_name = items.parent_language_object:getCanonicalName()
-- Reject weird cases where the parent language has the same name as the child etymology language. In
-- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and
-- Bashkardi.
if items.parent_language_name == items.language_name then
return nil
end
else
end
end
if items.template_name then
items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}"
items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>"
if items.template_example_output then
items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output
else
items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call
items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}"
end
if items.additional_template_description then
items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description
end
else
items.full_text_about_the_template = items.additional_template_description
end
local parents, breadcrumb
if items.is_etym_lang then
parents = items.etym_parents
breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name
else
parents = items.parents
breadcrumb = expand_items_value("breadcrumb")
end
if parents then
for _, parent in ipairs(parents) do
parent.name = expand_value("parent.name", parent.name)
parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"}
end
else
local umbrella_type = items.pagename:match("^Requests for (.+) by language$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Request subcategories by language", sort = umbrella_type}}
if items.additional_umbrella_parents then
extend(parents, items.additional_umbrella_parents)
end
elseif not items.language_name then
error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'")
else
local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "")
requests_concerning_breadcrumb =
requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Requests concerning " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "en"}
}
if items.is_etym_lang then
local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name))
parents = {
{name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}},
requests_concerning_parent
}
else
breadcrumb = breadcrumb or requests_concerning_breadcrumb
parents = {requests_concerning_parent}
end
end
end
if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then
table.insert(parents, {
name = expand_items_value("umbrella"),
sort = {sort_base = items.language_name, lang = "en"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" by language$") then
additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "")
end
return {
description = expand_items_value("description") or items.pagename .. ".",
lang = items.parent_language_code or items.language_code,
additional = additional,
parents = parents,
-- If no breadcrumb= and not an etym-only language, it will default to the category name
breadcrumb = breadcrumb,
catfix = expand_items_value("catfix"),
toc_template = expand_items_value("toc_template"),
toc_template_full = expand_items_value("toc_template_full"),
hidden = not items.nolang and not items.not_hidden_category,
can_be_empty = true,
}
end
-- First look for a regular (usually language or script-specific) category.
for _, category in ipairs(requests_categories) do
local matchvals = {mw.ustring.match(data.category, category.regex)}
if #matchvals > 0 then
init_items()
for key, value in pairs(category) do
items[key] = value
end
for key, value in ipairs(matchvals) do
items["" .. key] = value
end
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
-- Now look for umbrella categories.
for _, category in ipairs(requests_categories) do
if data.category == category.umbrella then
init_items()
items.nolang = true
items.additional_umbrella_parents = category.additional_umbrella_parents
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
return nil
end)
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Terms with (.+) translations$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
local langcode = lang:getCode()
local parents, breadcrumb_and_first_sort_key
if lang:hasType("etymology-only") then
parents = {
"Terms with " .. lang:getFullName() .. " translations",
{name = langname, sort = "Translations"},
}
breadcrumb_and_first_sort_key = lang:getCanonicalName()
else
parents = {
{name = "entry maintenance", is_label = true, lang = langcode},
{
name = "Terms with translations by language",
sort = {sort_base = langname, lang = "en"}
},
}
breadcrumb_and_first_sort_key = "Translations"
end
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.",
parents = parents,
breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key,
catfix = false,
can_be_empty = true,
hidden = true,
}
end
end)
local recognized_taxtypes = require(table_module).listToSet {
"ambiguous",
"binomial",
"branch",
"clade",
"cladus",
"class",
"cohort",
"convariety",
"cultivar group",
"cultivar",
"division",
"empire",
"epifamily",
"epithet",
"family",
"form taxon",
"form",
"genus",
"grade",
"grandorder",
"group",
"hybrid",
"informal group",
"infraclass",
"infracohort",
"infrakingdom",
"infraorder",
"infraphylum",
"infraspecies",
"kingdom",
"magnorder",
"megacohort",
"mirorder",
"morph",
"nothogenus",
"nothospecies",
"nothosubspecies",
"nothovariety",
"obsolete",
"oofamily",
"order",
"parvclass",
"parvorder",
"phylum",
"section",
"series",
"serovar",
"species group",
"species",
"stem",
"stirps",
"strain",
"subclass",
"subcohort",
"subdivision",
"subfamily",
"subgenus",
"subgroup",
"subinfraorder",
"subkingdom",
"suborder",
"subphylum",
"subsection",
"subspecies",
"subterclass",
"subtribe",
"superclass",
"supercohort",
"superfamily",
"supergroup",
"superorder",
"superphylum",
"supertribe",
"taxon",
"tribe",
"trinomial",
"undescribed species",
"unknown",
"unranked group",
"variety",
"virus complex",
}
table.insert(raw_handlers, function(data)
local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$")
if taxtype and recognized_taxtypes[taxtype] then
return {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.",
parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
ovy8bjegcqic9ds39g3cox2dyck130i
487807
487806
2026-09-02T19:09:31Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/प्रविष्टि रखरखाव]] को [[मॉड्यूल:category tree/entry maintenance]] पर स्थानांतरित किया
487806
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local functions_module = "Module:fun"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local table_module = "Module:table"
local extend = require(table_module).extend
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["प्रविष्टि रखरखाव"] = {
description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "मूलभूत श्रेणी",
}
labels["entries with incorrect language header"] = {
description = "{{{langname}}} entries that have been placed under the wrong language header.",
additional = "This can happen for several reasons:\n" ..
"* Typos.\n" ..
"* Vandalism.\n" ..
"* Using the wrong language code.\n" ..
"* Using an alternative name for the language.\n" ..
"* Using special characters which haven't been used in the name given in the language data modules.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References header"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References or Further reading header"] = {
description = "{{{langname}}} entries without a References or Further reading header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries that don't exist"] = {
description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.",
parents = {"entry maintenance"},
umbrella_parents = "Fundamental",
}
labels["entries with etymology trees"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology texts"] = {
description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymon"] = {
description = "{{{langname}}} entries that use the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology text stop language not in chain"] = {
description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing ambiguous etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with mismatched IDs"] = {
description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with multiple etymons missing IDs"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with etymology sections missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without this term in Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with language name categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with topic categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with outdated source"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"entry maintenance"},
}
labels["entries with inflection not matching pagename"] = {
description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.",
additional = "This is usually the result of incorrect or missing parameters.",
breadcrumb_and_first_sort_key = "inflection not matching pagename",
parents = {"entry maintenance"},
hidden = true,
can_be_empty = true,
}
labels["undefined derivations"] = {
description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["descendants to be fixed in desctree"] = {
description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["term requests"] = {
description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["redlinks"] = {
description = "Links to {{{langname}}} entries that have not been created yet.",
parents = {"entry maintenance"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["terms with IPA pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of IPA.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with enPR pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of enPR.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with Indic pronunciation"] = {
description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["IPA pronunciations with invalid separators"] = {
description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"entry maintenance"},
}
labels["terms with audio pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.",
additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with nonstandard or incorrect audio pronunciations"] = {
description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.",
parents = {"terms with audio pronunciation"},
can_be_empty = true,
hidden = true,
}
labels["entries missing Template:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation)
labels[label] = {
description = desc or "Pages containing {{{langname}}} " .. label .. ".",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Note that the pages in this category are not necessarily the same as the actual term in question. This " ..
"frequently happens, for example, with English pages with translation sections, where the term that " ..
"triggers the addition of the category is one of the translations."),
parents = {"entry maintenance"},
-- Set catfix = false because the page will have a mixture of native-language and
-- non-native-language pages, but include the normal native-language table of contents headers
-- because most pages are in the native language.
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
end
add_manual_param_category("terms in nonstandard scripts", nil,
"Pages are placed here if they contain terms written in a script that isn't in the language's " ..
"list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.",
true)
add_manual_param_category("terms with non-redundant manual transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with redundant transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant manual script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.",
true)
add_manual_param_category("terms with redundant script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant non-automated sortkeys",
"{{{langname}}} terms with non-redundant non-automated sortkeys.",
"Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " ..
"generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " ..
"parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " ..
"sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " ..
"page will also be added here.")
add_manual_param_category("terms with redundant sortkeys",
"{{{langname}}} terms with redundant sortkeys.",
"Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " ..
"as the one which is automatically generated.")
add_manual_param_category("links with redundant target parameters",
"Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " ..
"separately.",
"This occurs when the only difference between the link target and the alt text is that the alt text contains " ..
"diacritics (or other characters) which would have been ignored anyway had they been included in the link " ..
"target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " ..
"({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " ..
"displayed.")
add_manual_param_category("links with ignored alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.",
"This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " ..
"({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).")
add_manual_param_category("links with ignored id parameters",
"Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant wikilinks",
"Pages containing {{{langname}}} links which contain a redundant wikilink.",
"This occurs if link target consists of a single wikilink, which should instead be entered in the " ..
"conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " ..
"is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " ..
"{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " ..
"unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}")
add_manual_param_category("links with manual fragments",
"Pages containing {{{langname}}} links where a manual link fragment has been given.",
"This occurs when the link fragment has been specified using {{code|#}} after the term, " ..
"which overrides the normal fragment generated by link templates that points to the relevant " ..
"language section.\n\nLink fragments are used to point to a specific section on a target page, and " ..
"it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " ..
"additional content is added to the target page: for example, the fragment {{code|#Adjective}} " ..
"will start pointing to the wrong section if another language with an adjective section is added above " ..
"the intended language.")
labels["descendant hubs"] = {
description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.",
parents = {"entry maintenance"},
}
labels["terms needing to be assigned to a sense"] = {
description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
--[=[
labels["terms with inflection tables"] = {
description = "{{{langname}}} entries that contain inflection tables.".
additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
]=]
labels["terms with collocations"] = {
description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.",
additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Collocation maintenance",
}
labels["terms with usage examples"] = {
description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.",
additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Usage example maintenance",
}
labels["terms with quotations"] = {
description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.",
additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Quotation maintenance",
}
labels["terms with interlinear glossed text"] = {
description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.",
parents = {"entry maintenance"},
}
labels["terms with redundant head parameter"] = {
description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).",
additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their headword lines"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their inflection tables"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["requests for English equivalent term"] = {
description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance"
labels[quot_type .. " with omitted translation"] = {
description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.",
parents = {"entry maintenance"},
umbrella = {
parents = {name = umbrella_parent, sort = "omitted translation"},
breadcrumb = "with omitted translation",
},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do
labels[pos .. " with red links in their headword lines"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"terms with red links in their headword lines"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " with red links in their inflection tables"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"terms with red links in their inflection tables"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
local label = pos .. " with unknown or uncertain plurals"
labels[label] = {
description = "{{{langname}}} " .. label .. ".",
additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " ..
"is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " ..
"using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " ..
"that a plural cannot be attested but the noun is theoretically countable.",
breadcrumb = "with unknown or uncertain plurals",
parents = {
{name = pos, sort = "unknown or uncertain plurals"},
"entry maintenance",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if data.umbrella == nil and data.umbrella_parents == nil then
data.umbrella_parents = "Entry maintenance subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Entry maintenance subcategories by language"] = {
description = "Umbrella categories covering topics related to entry maintenance.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "entry maintenance", is_label = true, sort = " "},
},
}
raw_categories["Citation maintenance"] = {
description = "Categories for maintaining citations specified using {{tl|cite-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "citations",
}
raw_categories["Collocation maintenance"] = {
description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "collocations",
}
raw_categories["Quotation maintenance"] = {
description = "Categories for maintaining quotations specified using {{tl|quote-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "quotations",
}
raw_categories["Usage example maintenance"] = {
description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "usage examples",
}
raw_categories["Citations using nocat parameter"] = {
description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Citation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotation templates to be cleaned"] = {
description = "Instances of quotations using {{tl|quote-text}}.",
additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.",
parents = {"Quotation maintenance"},
breadcrumb_base = "to be cleaned",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using nocat parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Quotation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using quoted-in parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.",
additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.",
parents = {{name = "Quotation maintenance", sort = "quoted-in"}},
breadcrumb = "using quoted-in parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Category:Wiktionary"},
}
raw_categories["Requests by language"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Request subcategories by language", sort = " "},
{name = "Requests", sort = " "},
},
breadcrumb = "By language",
}
raw_categories["Request subcategories by language"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Requests", sort = " "},
},
}
raw_categories["Requests for quotations by source"] = {
description = "Categories with requests for quotation, broken out by the source of the quotation.",
additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].",
parents = {{name = "Requests for quotations", sort = "source"}},
breadcrumb = "By source",
}
raw_categories["Requests for quotations"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"},
breadcrumb = "Quotations",
}
raw_categories["Requests for date"] = {
description = "Requests for a date to be added to a quotation.",
additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " ..
"Please remove the template from the article once the date has been provided.",
parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"},
breadcrumb = "Date",
}
raw_categories["Requests for translations in user-competency categories by number of users"] = {
description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.",
parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}},
breadcrumb = "Translations in user-competency categories by number of users",
}
raw_categories["Requests for translations in user-competency categories by language"] = {
description = "Requests for translations to be added to user-competency categories, sorted by language.",
parents = {{name = "Requests", sort = "translations in user-competency categories by language"}},
breadcrumb = "Translations in user-competency categories by language",
hidden = true,
}
raw_categories["Terms with translations by language"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}},
breadcrumb = "Translations",
}
raw_categories["Entries using missing taxonomic names"] = {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." ..
"\n\nSee [[:Category:mul:Taxonomic names]].",
parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}},
breadcrumb = "Missing taxonomic names",
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function script_name_to_code(name)
local sc = require(scripts_module).getByCanonicalName(name)
if not sc then
error("Unrecognized script name '" .. name .. "'")
end
return sc:getCode()
end
--[=[
This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings
that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an
`items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at
least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in
other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in
functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in
turn references a third property).
If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing
group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in
which case there is no language name associated with the category name. The language name must be the canonical name of
a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name
may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and
`language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional
properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full
language of the etymology-only language.
If the `regex` values of multiple category specs match, the first one takes precedence.
Recognized or predefined properties:
`pagename`: Current pagename.
`regex`: See above.
`1`, `2`, `3`, ...: See above.
`language_name`, `language_code`, `language_object`: See above.
`parent_language_name`, `parent_language_code`, `parent_language_object`: See above.
`nolang`: See above.
`allow_etym_lang`: Language names may be etymology-only languages. See above.
`description`: Override the description (normally taken directly from the pagename).
`template_name`: Name of template which generates this category.
`template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to
display an example template call and the output of this call.
`template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when
generating example template output (but not when displaying an example template call) and is intended for a template
call that uses the |nocat=1 parameter.
`template_example_output`: Override the text that displays example template output (see `template_sample_call`).
`additional_template_description`: Extra text to be displayed after the example template output.
`parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and
sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have
{{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO
by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any
parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the
parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case
`etym_parents` is used instead.
`etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as
`parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name
replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests
concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
`umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language
is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated
language is an etymology-only language); otherwise there will be no umbrella category.
`additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with
"Request subcategories by language".
`breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the
pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be
"FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from
the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only
language is associated with the category, in which case `etym_breadcrumb` is used instead.
`etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value
of `language_name`.
`not_hidden_category`: Don't hide the category.
`catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is
expanded.
`toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that
request-specific {{{PROPERTY}}} syntax is expanded.
In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately
expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the
`template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when
inserted, so template references are not expanded. Triple-brace property references are still expanded in these
properties; but beware that if any of those property references contain template references, they won't be expanded.
(This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references
{{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this
property using a function.)
]=]
local requests_categories = {
{
regex = "^Requests concerning (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "entry maintenance", is_label = true, sort = "requests"}},
etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"},
{name = "{{{1}}}", sort = "Requests"}},
umbrella = "Requests by language",
breadcrumb = "Requests",
not_hidden_category = true,
},
{
regex = "^Requests for etymologies in (.+) entries$",
allow_etym_lang = true,
umbrella = "Requests for etymologies by language",
template_name = "rfe",
},
{
regex = "^Requests for expansion of etymologies in (.+) entries$",
umbrella = "Requests for expansion of etymologies by language",
template_name = "etystub",
},
{
regex = "^Requests for pronunciation in (.+) entries$",
umbrella = "Requests for pronunciation by language",
template_name = "rfp",
},
{
regex = "^Requests for audio pronunciation in (.+) entries$",
umbrella = "Requests for audio pronunciation by language",
template_name = "rfap",
},
{
regex = "^Requests for definitions in (.+) entries$",
umbrella = "Requests for definitions by language",
template_name = "rfdef",
},
{
regex = "^Requests for clarification of definitions in (.+) entries$",
umbrella = "Requests for clarification of definitions by language",
template_name = "rfclarify",
},
}
for _, spec_with_pos in ipairs {
{"inflections", "rfinfl"},
{"plural forms"},
{"tone", "rftone"},
{"accents"},
{"aspect", "rfaspect"},
{"animacy"},
{"gender", "rfgender"},
{"noun class"},
} do
local property, rftemplate = unpack(spec_with_pos)
table.insert(requests_categories,
{
-- This is for part-of-speech-specific categories such as
-- "Requests for inflections in Northern Ndebele noun entries" or
-- "Requests for accents in Ukrainian proper noun entries".
-- Here and below, we assume that the part of speech is begins with
-- a lowercase letter, while the preceding language name ends in a
-- capitalized word. Note that this entry comes before the
-- following one and takes precedence over it.
regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property),
parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}},
umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property),
breadcrumb = "{{{2}}}",
template_name = rftemplate,
template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s in (.+) entries$"):format(property),
umbrella = ("Requests for %s by language"):format(property),
template_name = rftemplate,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s of (.+) by language$"):format(property),
nolang = true,
}
)
end
extend(requests_categories, {
{
regex = "^Requests for example sentences in (.+)$",
umbrella = "Requests for example sentences by language",
template_name = "rfex",
},
{
regex = "^Requests for quotations in (.+)$",
umbrella = "Requests for quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfquote",
},
{
regex = "^Requests for translations into (.+)$",
allow_etym_lang = true,
umbrella = "Requests for translations by language",
template_name = "t-needed",
catfix = "en",
},
{
regex = "^Requests for translations of (.+) usage examples$",
allow_etym_lang = true,
umbrella = "Requests for translations of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|usex}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}",
additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for translations of (.+) quotations$",
allow_etym_lang = true,
umbrella = "Requests for translations of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|quote}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}",
additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for review of (.+) translations$",
allow_etym_lang = true,
umbrella = "Requests for review of translations by language",
template_name = "t-check",
template_sample_call = "{{t-check|{{{language_code}}}|example}}",
template_example_output = "",
catfix = "en",
},
{
regex = "^Requests for transliteration of (.+) terms$",
umbrella = "Requests for transliteration by language",
template_name = "rftranslit",
additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " ..
"the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " ..
"automated transliteration, such as Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) usage examples$",
umbrella = "Requests for transliteration of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rftranslit",
template_sample_call = "{{rftranslit|{{{language_code}}}}}",
template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) quotations$",
umbrella = "Requests for transliteration of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for native script for (.+) terms$",
allow_etym_lang = true,
etym_parents = {
{name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "native script"},
},
umbrella = "Requests for native script by language",
template_name = "rfscript",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for native script in (.+) usage examples$",
umbrella = "Requests for native script in usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied."
},
{
regex = "^Requests for native script in (.+) quotations$",
umbrella = "Requests for native script in quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied."
},
{
regex = "^Requests for (.+) script for (.+) terms$",
language_name = "{{{2}}}",
allow_etym_lang = true,
parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}},
etym_parents = {
{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"},
},
umbrella = "Requests for {{{1}}} script by language",
breadcrumb = "{{{1}}}",
etym_breadcrumb = "{{{1}}}",
template_name = "rfscript",
-- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the
-- conversion of script name to script code needs to be done using an inline function like this, instead of
-- a {{#invoke:...}} template call.
script_code = function(items)
return script_name_to_code(items["1"])
end,
template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for (.+) script by language$",
parents = {{name = "Requests for script by language", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
},
{
regex = "^Requests for script by language$",
nolang = true,
},
{
regex = "^Requests for images in (.+) entries$",
umbrella = "Requests for images by language",
template_name = "rfi",
},
{
regex = "^Requests for references for (.+) terms$",
umbrella = "Requests for references by language",
template_name = "rfref",
},
{
regex = "^Requests for references for etymologies in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}},
umbrella = "Requests for references for etymologies by language",
breadcrumb = "Etymologies",
template_name = "rfv-etym",
},
{
regex = "^Requests for references for pronunciations in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}},
umbrella = "Requests for references for pronunciations by language",
breadcrumb = "Pronunciations",
template_name = "rfv-pron",
},
{
regex = "^Requests for attention concerning (.+)$",
umbrella = "Requests for attention by language",
breadcrumb = "Attention",
template_name = "attention",
template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}",
template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.",
-- These pages typically contain a mixture of English and native-language entries, so disable catfix.
catfix = false,
-- Setting catfix = false will normally trigger the English table of contents template.
-- We still want the native-language table of contents template, though.
toc_template = "{{{language_code}}}-categoryTOC",
toc_template_full = "{{{language_code}}}-categoryTOC/full",
},
{
regex = "^Requests for cleanup in (.+) entries$",
umbrella = "Requests for cleanup by language",
template_name = "rfc",
template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$",
umbrella = "Requests for cleanup of Pronunciation N headers by language",
template_name = "rfc-pron-n",
template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}",
template_example_output = "This template does not generate any text in entries.",
additional_template_description = [=[
The purpose of this category is to tag entries that use headers with "Pronunciation" and a number.
While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header.
[[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed.
This category is hidden.]=],
},
{
regex = "^Requests for deletion in (.+) entries$",
umbrella = "Requests for deletion by language",
template_name = "rfd",
template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for verification in (.+) entries$",
umbrella = "Requests for verification by language",
template_name = "rfv",
},
{
regex = "^Requests for attention in (.+) etymologies$",
umbrella = "Requests for attention by language"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfquotek",
template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}",
},
{
regex = "^Requests for date in (.+) entries$",
umbrella = "Requests for date by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfdate",
additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " ..
"automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " ..
"parameter in each case on the page automatically removes the article from this category. See " ..
"[[Wiktionary:Quotations]] for information about formatting dates and quotations.",
},
{
regex = "^Requests for date/(.+)$",
description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.",
parents = {{name = "Requests for date by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfdatek",
template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}",
},
{
regex = "^Requests for attestation of (.+) terms$",
umbrella = "Requests for attestation of terms by language",
breadcrumb = "Attestation",
additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)."
},
})
local user_competency_additional_template_description = "This is added by user-competency categories such as " ..
"[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " ..
"the native-language text indicating this fact is missing. The appropriate translation should mirror the " ..
"English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " ..
"level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " ..
"language in the text should be surrounded by double angle brackets, e.g. \"<<français>>\", which " ..
"causes it to be automatically linked to the appropriate parent category."
local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}",
nolang = true,
}
})
table.insert(raw_handlers, function(data)
local items
local function init_items()
items = {pagename = data.category}
end
local function expand_value(item, val)
if not val then
return val
elseif is_callable(val) then
return expand_value(item .. " ⇒ function", val(items))
elseif type(val) == "table" then
for k, v in pairs(val) do
val[k] = expand_value(item .. " ⇒ " .. k, v)
end
return val
elseif type(val) == "number" then
val = tostring(val)
end
if type(val) ~= "string" then
error(("The item '%s' on page %s is of type %s and can't be concatenated"):format(
item, items.pagename, type(val)))
end
-- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done
-- recursively, since some of the items are nested:
-- {{{template_sample_call_with_temp}}}
-- ⇓
-- {{{{{template_name}}}|{{{language_code}}}}}
-- ⇓
-- {{attention|en}}
if val:find("{{{") then
val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop)
local propval = items[prop]
if not propval then
error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"):
format(prop, item, items.pagename))
end
return expand_value(item .. " ⇒ " .. prop, propval)
end
)
end
return val
end
local function expand_items_value(item)
return expand_value(item, items[item])
end
local function convert_items_to_category_data(items)
if not items.nolang then
items.language_name = items.language_name or "{{{1}}}"
items.language_name = expand_items_value("language_name")
items.language_object = require(languages_module).getByCanonicalName(items.language_name, true,
items.allow_etym_lang)
items.language_code = items.language_object:getCode()
items.is_etym_lang = items.language_object:hasType("etymology-only")
if items.is_etym_lang then
items.parent_language_object = items.language_object:getFull()
-- Reject weird cases where etymology language has no parent.
if not items.parent_language_object then
return nil
end
items.parent_language_code = items.parent_language_object:getCode()
items.parent_language_name = items.parent_language_object:getCanonicalName()
-- Reject weird cases where the parent language has the same name as the child etymology language. In
-- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and
-- Bashkardi.
if items.parent_language_name == items.language_name then
return nil
end
else
end
end
if items.template_name then
items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}"
items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>"
if items.template_example_output then
items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output
else
items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call
items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}"
end
if items.additional_template_description then
items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description
end
else
items.full_text_about_the_template = items.additional_template_description
end
local parents, breadcrumb
if items.is_etym_lang then
parents = items.etym_parents
breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name
else
parents = items.parents
breadcrumb = expand_items_value("breadcrumb")
end
if parents then
for _, parent in ipairs(parents) do
parent.name = expand_value("parent.name", parent.name)
parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"}
end
else
local umbrella_type = items.pagename:match("^Requests for (.+) by language$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Request subcategories by language", sort = umbrella_type}}
if items.additional_umbrella_parents then
extend(parents, items.additional_umbrella_parents)
end
elseif not items.language_name then
error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'")
else
local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "")
requests_concerning_breadcrumb =
requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Requests concerning " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "en"}
}
if items.is_etym_lang then
local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name))
parents = {
{name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}},
requests_concerning_parent
}
else
breadcrumb = breadcrumb or requests_concerning_breadcrumb
parents = {requests_concerning_parent}
end
end
end
if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then
table.insert(parents, {
name = expand_items_value("umbrella"),
sort = {sort_base = items.language_name, lang = "en"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" by language$") then
additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "")
end
return {
description = expand_items_value("description") or items.pagename .. ".",
lang = items.parent_language_code or items.language_code,
additional = additional,
parents = parents,
-- If no breadcrumb= and not an etym-only language, it will default to the category name
breadcrumb = breadcrumb,
catfix = expand_items_value("catfix"),
toc_template = expand_items_value("toc_template"),
toc_template_full = expand_items_value("toc_template_full"),
hidden = not items.nolang and not items.not_hidden_category,
can_be_empty = true,
}
end
-- First look for a regular (usually language or script-specific) category.
for _, category in ipairs(requests_categories) do
local matchvals = {mw.ustring.match(data.category, category.regex)}
if #matchvals > 0 then
init_items()
for key, value in pairs(category) do
items[key] = value
end
for key, value in ipairs(matchvals) do
items["" .. key] = value
end
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
-- Now look for umbrella categories.
for _, category in ipairs(requests_categories) do
if data.category == category.umbrella then
init_items()
items.nolang = true
items.additional_umbrella_parents = category.additional_umbrella_parents
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
return nil
end)
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Terms with (.+) translations$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
local langcode = lang:getCode()
local parents, breadcrumb_and_first_sort_key
if lang:hasType("etymology-only") then
parents = {
"Terms with " .. lang:getFullName() .. " translations",
{name = langname, sort = "Translations"},
}
breadcrumb_and_first_sort_key = lang:getCanonicalName()
else
parents = {
{name = "entry maintenance", is_label = true, lang = langcode},
{
name = "Terms with translations by language",
sort = {sort_base = langname, lang = "en"}
},
}
breadcrumb_and_first_sort_key = "Translations"
end
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.",
parents = parents,
breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key,
catfix = false,
can_be_empty = true,
hidden = true,
}
end
end)
local recognized_taxtypes = require(table_module).listToSet {
"ambiguous",
"binomial",
"branch",
"clade",
"cladus",
"class",
"cohort",
"convariety",
"cultivar group",
"cultivar",
"division",
"empire",
"epifamily",
"epithet",
"family",
"form taxon",
"form",
"genus",
"grade",
"grandorder",
"group",
"hybrid",
"informal group",
"infraclass",
"infracohort",
"infrakingdom",
"infraorder",
"infraphylum",
"infraspecies",
"kingdom",
"magnorder",
"megacohort",
"mirorder",
"morph",
"nothogenus",
"nothospecies",
"nothosubspecies",
"nothovariety",
"obsolete",
"oofamily",
"order",
"parvclass",
"parvorder",
"phylum",
"section",
"series",
"serovar",
"species group",
"species",
"stem",
"stirps",
"strain",
"subclass",
"subcohort",
"subdivision",
"subfamily",
"subgenus",
"subgroup",
"subinfraorder",
"subkingdom",
"suborder",
"subphylum",
"subsection",
"subspecies",
"subterclass",
"subtribe",
"superclass",
"supercohort",
"superfamily",
"supergroup",
"superorder",
"superphylum",
"supertribe",
"taxon",
"tribe",
"trinomial",
"undescribed species",
"unknown",
"unranked group",
"variety",
"virus complex",
}
table.insert(raw_handlers, function(data)
local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$")
if taxtype and recognized_taxtypes[taxtype] then
return {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.",
parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
ovy8bjegcqic9ds39g3cox2dyck130i
487851
487807
2026-09-02T20:16:51Z
SM7
6218
"Fundamental"
487851
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local raw_handlers = {}
local functions_module = "Module:fun"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local table_module = "Module:table"
local extend = require(table_module).extend
local is_callable = require(functions_module).is_callable
local pattern_escape = require(string_pattern_escape_module)
local replacement_escape = require(string_replacement_escape_module)
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["प्रविष्टि रखरखाव"] = {
description = "{{{langname}}} entries, or entries in other languages containing {{{langname}}} terms, that are being tracked for attention and improvement by editors.",
parents = {{name = "{{{langcat}}}", raw = true}},
umbrella_parents = "मूलभूत श्रेणी",
}
labels["entries with incorrect language header"] = {
description = "{{{langname}}} entries that have been placed under the wrong language header.",
additional = "This can happen for several reasons:\n" ..
"* Typos.\n" ..
"* Vandalism.\n" ..
"* Using the wrong language code.\n" ..
"* Using an alternative name for the language.\n" ..
"* Using special characters which haven't been used in the name given in the language data modules.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References header"] = {
description = "{{{langname}}} entries without a References header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries without References or Further reading header"] = {
description = "{{{langname}}} entries without a References or Further reading header.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries that don't exist"] = {
description = "{{{langname}}} terms that do not meet the [[Wiktionary:Criteria for inclusion|criteria for inclusion]] (CFI). They are added to the category with the template {{tl|no entry|{{{langcode}}}}}.",
parents = {"entry maintenance"},
umbrella_parents = "मूलभूत श्रेणी",
}
labels["entries with etymology trees"] = {
description = "{{{langname}}} entries that display an etymology tree generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology texts"] = {
description = "{{{langname}}} entries that display an etymology generated by the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymon"] = {
description = "{{{langname}}} entries that use the template {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with etymology text stop language not in chain"] = {
description = "{{{langname}}} entries where {{tl|etymon}} is used with {{para|text}} set to stop at a language but that language never appears in the rendered etymology chain.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon that cannot be found, either because the target page does not exist (redlink) or because it has no {{tl|etymon}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing ambiguous etymons"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon without the ID, when the target page contains multiple {{tl|etymon}} templates, and an ID is therefore required to select the correct {{tl|etymon}}.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons with mismatched IDs"] = {
description = "Entries which use the {{tl|etymon}} template with a mismatched ID. For example, {{code|lang:entry<id:mismatched ID>}}",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with multiple etymons missing IDs"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one {{tl|etymon}} template for the same language, where at least one of those templates has no {{para|id}}. When several {{tl|etymon}} templates share a language section, each must have a distinct {{para|id}} so that links and descendants logic can tell them apart.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing pages with etymology sections missing etymons"] = {
description = "Entries which use the {{tl|etymon}} template to link to a page that has more than one etymology section for the same language, where at least one section contains a {{tl|etymon}} template for that language and at least one other etymology section does not.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries referencing etymons without this term in Descendants sections"] = {
description = "Entries which use the {{tl|etymon}} template to reference an etymon whose source entry has a Descendants section, but does not list the current term there.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with language name categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a language name category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langname}}} ...]]}}). They should be added using {{tl|cln|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with topic categories using raw markup"] = {
description = "{{{langname}}} entries that have been placed in a topic category using raw wiki markup (i.e. {{code|[[<nowiki/>Category:{{{langcode}}}:...]]}}). They should be added using {{tl|C|{{{langcode}}}|...}} instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["entries with outdated source"] = {
description = "{{{langname}}} entries that have been partly or fully imported from an outdated source.",
parents = {"entry maintenance"},
}
labels["entries with inflection not matching pagename"] = {
description = "{{{langname}}} entries which have an inflection table whose lemma form does not match the page name.",
additional = "This is usually the result of incorrect or missing parameters.",
breadcrumb_and_first_sort_key = "inflection not matching pagename",
parents = {"entry maintenance"},
hidden = true,
can_be_empty = true,
}
labels["undefined derivations"] = {
description = "{{{langname}}} etymologies using {{tl|undefined derivation}}, where a more specific template such as {{tl|borrowed}} or {{tl|inherited}} should be used instead.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["descendants to be fixed in desctree"] = {
description = "Entries that use {{tl|desctree}} to link to {{{langname}}} entries with no Descendants section.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["term requests"] = {
description = "Entries with [[Template:der]], [[Template:inh]], [[Template:m]] and similar templates lacking the parameter for linking to {{{langname}}} terms.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["redlinks"] = {
description = "Links to {{{langname}}} entries that have not been created yet.",
parents = {"entry maintenance"},
catfix = false,
can_be_empty = true,
hidden = true,
}
labels["terms with IPA pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of IPA.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with enPR pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of enPR.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with Indic pronunciation"] = {
description = "{{langname}} terms that include the pronunciation in the form of ISO 15919.",
additional = "For requests related to this category, see [[:Category:Requests for pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["IPA pronunciations with invalid separators"] = {
description = "{{{langname}}} terms with IPA using invalid separators such as /.ˈ/, /.ˌ/, a dot followed by primary or secondary stress; or /ˈ / or /ˌ /, primary or secondary stress followed by a space.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with hyphenation"] = {
description = "{{{langname}}} terms that include hyphenation.",
parents = {"entry maintenance"},
}
labels["terms with audio pronunciation"] = {
description = "{{{langname}}} terms that include the pronunciation in the form of an audio file.",
additional = "For requests related to this category, see [[:Category:Requests for audio pronunciation in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
labels["terms with nonstandard or incorrect audio pronunciations"] = {
description = "{{{langname}}} terms which have been tagged as having pronunciations which are nonstandard or incorrect.",
parents = {"terms with audio pronunciation"},
can_be_empty = true,
hidden = true,
}
labels["entries missing Template:reconstructed"] = {
description = "Reconstructed {{{langname}}} entries which do not have the {{tl|reconstructed}} template.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
local function add_manual_param_category(label, desc, addl_intro, include_addl_continuation)
labels[label] = {
description = desc or "Pages containing {{{langname}}} " .. label .. ".",
additional = addl_intro .. (not include_addl_continuation and "" or "\n\n" ..
"Note that the pages in this category are not necessarily the same as the actual term in question. This " ..
"frequently happens, for example, with English pages with translation sections, where the term that " ..
"triggers the addition of the category is one of the translations."),
parents = {"entry maintenance"},
-- Set catfix = false because the page will have a mixture of native-language and
-- non-native-language pages, but include the normal native-language table of contents headers
-- because most pages are in the native language.
catfix = false,
toc_template = "{{{langcode}}}-categoryTOC",
toc_template_full = "{{{langcode}}}-categoryTOC/full",
can_be_empty = true,
hidden = true,
}
end
add_manual_param_category("terms in nonstandard scripts", nil,
"Pages are placed here if they contain terms written in a script that isn't in the language's " ..
"list of scripts in the language data. This may mean the script should be added to the list, or that the wrong language code has been used.",
true)
add_manual_param_category("terms with non-redundant manual transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is different from the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with redundant transliterations", nil,
"Pages are placed here if they contain terms whose transliteration has been specified manually using " ..
"{{para|tr}} or a similar parameter and is the same as the transliteration which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant manual script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is different from the script code which is automatically generated.",
true)
add_manual_param_category("terms with redundant script codes", nil,
"Pages are placed here if they contain terms whose script code has been specified manually using " ..
"{{para|sc}} or a similar parameter and is the same as the script code which is automatically generated.",
true)
add_manual_param_category("terms with non-redundant non-automated sortkeys",
"{{{langname}}} terms with non-redundant non-automated sortkeys.",
"Terms are placed here if they have been sorted using a sortkey other than the one which is automatically " ..
"generated. This can happen for two reasons:\n# A different sortkey has been specified using the {{para|sort}} " ..
"parameter.\n# One or more categories have been added using raw wikitext, which means the page's default " ..
"sortkey is used for that category. If that default sortkey is different from the automatic sortkey, then the " ..
"page will also be added here.")
add_manual_param_category("terms with redundant sortkeys",
"{{{langname}}} terms with redundant sortkeys.",
"Terms are placed here if their sortkey has been specified using the {{para|sort}} parameter, and it the same " ..
"as the one which is automatically generated.")
add_manual_param_category("links with redundant target parameters",
"Pages containing {{{langname}}} links where the alt text could replace the link target, instead of being given " ..
"separately.",
"This occurs when the only difference between the link target and the alt text is that the alt text contains " ..
"diacritics (or other characters) which would have been ignored anyway had they been included in the link " ..
"target. For example, {{tl|l|la|amo|amō}} ({{l|la|amo|amō}}) is exactly the same as {{tl|l|la|amō}} " ..
"({{l|la|amō}}), because macrons are automatically stripped from Latin link targets, even though they're still " ..
"displayed.")
add_manual_param_category("links with ignored alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant alt parameters",
"Pages containing {{{langname}}} links where the {{para|alt}} parameter is redundant.",
"This occurs when the alt text makes no difference to the output. For example, {{tl|l|en|foo|foo}} " ..
"({{l|en|foo|foo}}) is exactly the same as {{tl|l|en|foo}} ({{l|en|foo}}).")
add_manual_param_category("links with ignored id parameters",
"Pages containing {{{langname}}} links where the {{para|id}} parameter has been ignored.",
"This occurs when the main linked text includes a wikilink.")
add_manual_param_category("links with redundant wikilinks",
"Pages containing {{{langname}}} links which contain a redundant wikilink.",
"This occurs if link target consists of a single wikilink, which should instead be entered in the " ..
"conventional manner without link brackets. For example, {{tl|l|en|<nowiki>[[foo]]</nowiki>}} " ..
"is the same as {{tl|l|en|foo}}, and {{tl|l|en|<nowiki>[[foo|bar]]</nowiki>}} is the same as " ..
"{{tl|l|en|foo|bar}}.\n\nThis also occurs when link templates are nested inside each other " ..
"unnecessarily: e.g. {{tl|l|en|{{tl|l|en|foo}}}}")
add_manual_param_category("links with manual fragments",
"Pages containing {{{langname}}} links where a manual link fragment has been given.",
"This occurs when the link fragment has been specified using {{code|#}} after the term, " ..
"which overrides the normal fragment generated by link templates that points to the relevant " ..
"language section.\n\nLink fragments are used to point to a specific section on a target page, and " ..
"it is preferable to use the {{para|id}} parameter to do this, since it is less likely to break if " ..
"additional content is added to the target page: for example, the fragment {{code|#Adjective}} " ..
"will start pointing to the wrong section if another language with an adjective section is added above " ..
"the intended language.")
labels["descendant hubs"] = {
description = "{{{langname}}} terms that do not mean more than the sum of their parts but exist for listing two or more inclusion-worthy descendants.",
parents = {"entry maintenance"},
}
labels["terms needing to be assigned to a sense"] = {
description = "{{{langname}}} entries that have terms under headers such as \"Synonyms\" or \"Antonyms\" not assigned to a specific sense of the entry in which they appear. Use [[Template:syn]] or [[Template:ant]] to fix these.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
--[=[
labels["terms with inflection tables"] = {
description = "{{{langname}}} entries that contain inflection tables.".
additional = "For requests related to this category," see [[:Category:Requests for inflections in {{{langname}}} entries]].",
parents = {"entry maintenance"},
}
]=]
labels["terms with collocations"] = {
description = "{{{langname}}} entries that contain [[collocation]]s that were added using templates such as {{tl|co}}.",
additional = "For requests related to this category, see [[:Category:Requests for collocations in {{{langname}}}]]. See also [[:Category:Requests for quotations in {{{langname}}}]] and [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Collocation maintenance",
}
labels["terms with usage examples"] = {
description = "{{{langname}}} entries that contain usage examples that were added using templates such as {{tl|ux}}.",
additional = "For requests related to this category, see [[:Category:Requests for example sentences in {{{langname}}}]]. See also [[:Category:Requests for collocations in {{{langname}}}]] and [[:Category:Requests for quotations in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Usage example maintenance",
}
labels["terms with quotations"] = {
description = "{{{langname}}} entries that contain quotes that were added using templates such as {{tl|quote}}, {{tl|quote-book}}, {{tl|quote-journal}}, etc.",
additional = "For requests related to this category, see [[:Category:Requests for quotations in {{{langname}}}]]. See also [[:Category:Requests for example sentences in {{{langname}}}]].",
parents = {"entry maintenance"},
umbrella_parents = "Quotation maintenance",
}
labels["terms with interlinear glossed text"] = {
description = "{{{langname}}} entries that contain interlinear glossed text added using {{tl|interlinear}}.",
parents = {"entry maintenance"},
}
labels["terms with redundant head parameter"] = {
description = "{{{langname}}} terms that contain a redundant head= parameter in their headword (called using {{tl|head}} or a language-specific equivalent).",
additional = "Individual languages can prevent terms from being added to this category by setting `data.no_redundant_head_cat`.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their headword lines"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["terms with red links in their inflection tables"] = {
description = "{{{langname}}} terms that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"redlinks"},
can_be_empty = true,
hidden = true,
}
labels["requests for English equivalent term"] = {
description = "{{{langname}}} entries with definitions that have been tagged with {{tl|rfeq}}. Read the documentation of the template for more information.",
parents = {"entry maintenance"},
can_be_empty = true,
hidden = true,
}
for _, quot_type in ipairs { "quotations", "usage examples" } do
local umbrella_parent = quot_type == "quotations" and "Quotation maintenance" or "Usage example maintenance"
labels[quot_type .. " with omitted translation"] = {
description = "{{{langname}}} " .. quot_type .. " where a translation would normally be required but the translation has explicitly been omitted by specifying {{code|-}}. The translation should be supplied instead.",
parents = {"entry maintenance"},
umbrella = {
parents = {name = umbrella_parent, sort = "omitted translation"},
breadcrumb = "with omitted translation",
},
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs({"nouns", "proper nouns", "verbs", "adjectives", "adverbs", "participles", "determiners", "pronouns", "numerals", "suffixes", "contractions"}) do
labels[pos .. " with red links in their headword lines"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their headword lines.",
parents = {"terms with red links in their headword lines"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
labels[pos .. " with red links in their inflection tables"] = {
description = "{{{langname}}} " .. pos .. " that contain red links (i.e. uncreated forms) in their inflection tables.",
parents = {"terms with red links in their inflection tables"},
breadcrumb = pos,
can_be_empty = true,
hidden = true,
}
end
for _, pos in ipairs { "nouns", "proper nouns", "pronouns" } do
local label = pos .. " with unknown or uncertain plurals"
labels[label] = {
description = "{{{langname}}} " .. label .. ".",
additional = "Terms are usually added to this category by specifying {{code|?}} as the plural. As much " ..
"is possible, a plural should be added or, if the noun is uncountable, indicated appropriately (usually " ..
"using {{code|-}} in place of the plural). Some languages support the value {{code|!}} to indicate " ..
"that a plural cannot be attested but the noun is theoretically countable.",
breadcrumb = "with unknown or uncertain plurals",
parents = {
{name = pos, sort = "unknown or uncertain plurals"},
"entry maintenance",
},
}
end
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
if data.umbrella == nil and data.umbrella_parents == nil then
data.umbrella_parents = "Entry maintenance subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Entry maintenance subcategories by language"] = {
description = "Umbrella categories covering topics related to entry maintenance.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "entry maintenance", is_label = true, sort = " "},
},
}
raw_categories["Citation maintenance"] = {
description = "Categories for maintaining citations specified using {{tl|cite-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "citations",
}
raw_categories["Collocation maintenance"] = {
description = "Categories for maintaining collocations specified using {{tl|co}}, {{tl|coi}} or {{tl|coa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "collocations",
}
raw_categories["Quotation maintenance"] = {
description = "Categories for maintaining quotations specified using {{tl|quote-*}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "quotations",
}
raw_categories["Usage example maintenance"] = {
description = "Categories for maintaining usage examples specified using {{tl|ux}}, {{tl|uxi}} or {{tl|uxa}}.",
parents = {"Wiktionary maintenance"},
breadcrumb = "usage examples",
}
raw_categories["Citations using nocat parameter"] = {
description = "Instances of {{tl|cite-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Citation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotation templates to be cleaned"] = {
description = "Instances of quotations using {{tl|quote-text}}.",
additional = "They should be converted to other '''[[:Category:Citation templates|quotation templates]]''' if relevant.",
parents = {"Quotation maintenance"},
breadcrumb_base = "to be cleaned",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using nocat parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|nocat}} parameter, which should be eliminated (?).",
parents = {{name = "Quotation maintenance", sort = "nocat"}},
breadcrumb = "using nocat parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Quotations using quoted-in parameter"] = {
description = "Instances of {{tl|quote-*}} templates using the {{para|quoted_in}} parameter.",
additional = "It is recommended to restructure these template calls using the {{para|newversion}} parameter along with associated parameters {{para|2ndauthor}}, {{para|title2}}, {{para|year2}}, {{para|publisher2}} and the like, as described in the documentation for {{tl|quote-book}}.",
parents = {{name = "Quotation maintenance", sort = "quoted-in"}},
breadcrumb = "using quoted-in parameter",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests"] = {
topright = "{{shortcut|WT:CR|WT:RQ}}",
description = "A parent category for the various request categories.",
parents = {"Category:Wiktionary"},
}
raw_categories["Requests by language"] = {
description = "Categories with requests in various specific languages.",
additional = "{{{umbrella_msg}}}",
parents = {
{name = "Request subcategories by language", sort = " "},
{name = "Requests", sort = " "},
},
breadcrumb = "By language",
}
raw_categories["Request subcategories by language"] = {
description = "Umbrella categories covering topics related to requests.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Requests", sort = " "},
},
}
raw_categories["Requests for quotations by source"] = {
description = "Categories with requests for quotation, broken out by the source of the quotation.",
additional = "Some abbreviated names of sources are explained at [[Wiktionary:Abbreviated Authorities in Webster]].",
parents = {{name = "Requests for quotations", sort = "source"}},
breadcrumb = "By source",
}
raw_categories["Requests for quotations"] = {
-- FIXME
description = "Words are added to this category by the inclusion in their entries of {{tl|rfv-quote}}.",
parents = {{name = "Requests", sort = "quotations"}, "Quotation maintenance"},
breadcrumb = "Quotations",
}
raw_categories["Requests for date"] = {
description = "Requests for a date to be added to a quotation.",
additional = "To add an article to this category, use {{tl|rfdate}} or {{tl|rfdatek}} to include the author. " ..
"Please remove the template from the article once the date has been provided.",
parents = {{name = "Requests", sort = "date"}, "Quotation maintenance"},
breadcrumb = "Date",
}
raw_categories["Requests for translations in user-competency categories by number of users"] = {
description = "Requests for translations to be added to user-competency categories, sorted by number of users with that competency.",
parents = {{name = "Requests", sort = "translations in user-competency categories by number of users"}},
breadcrumb = "Translations in user-competency categories by number of users",
}
raw_categories["Requests for translations in user-competency categories by language"] = {
description = "Requests for translations to be added to user-competency categories, sorted by language.",
parents = {{name = "Requests", sort = "translations in user-competency categories by language"}},
breadcrumb = "Translations in user-competency categories by language",
hidden = true,
}
raw_categories["Terms with translations by language"] = {
description = "Terms with translations, sorted by language.",
parents = {{name = "Entry maintenance subcategories by language", sort = "translations by language"}},
breadcrumb = "Translations",
}
raw_categories["Entries using missing taxonomic names"] = {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name." ..
"\n\nSee [[:Category:mul:Taxonomic names]].",
parents = {{name = "entry maintenance", is_label = true, lang = "mul", sort = "missing taxonomic names"}},
breadcrumb = "Missing taxonomic names",
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
local function script_name_to_code(name)
local sc = require(scripts_module).getByCanonicalName(name)
if not sc then
error("Unrecognized script name '" .. name .. "'")
end
return sc:getCode()
end
--[=[
This array consists of category match specs. Each spec contains one or more properties, whose values are (a) strings
that may contain references to other properties using the {{{PROPERTY}}} syntax; (b) functions of one argument, an
`items` table of the same properties that are accessible using the {{{PROPERTY}} syntax. Each such spec should have at
least a `regex` property that matches the name of the category. Capturing groups in this regex can be referenced in
other properties using {{{1}}} for the first group, {{{2}}} for the second group, etc. (or using keys "1", "2", etc. in
functions). Property expansion happens recursively if needed (i.e. a property can reference another property, which in
turn references a third property).
If there is a `language_name` propery, it specifies the language name (and will typically be a reference to a capturing
group from the `regex` property); if not specified, it defaults to "{{{1}}}" unless the `nolang` property is set, in
which case there is no language name associated with the category name. The language name must be the canonical name of
a recognized full language, or an error is thrown; however, if the `allow_etym_lang` property is set, the language name
may also be the canonical name of an etymology-only language. Based on the language name, the `language_code` and
`language_object` properties are automatically filled in. If `language_name` is an etymology-only language, additional
properties `parent_language_name`, `parent_language_code` and `parent_language_object` are set for the parent full
language of the etymology-only language.
If the `regex` values of multiple category specs match, the first one takes precedence.
Recognized or predefined properties:
`pagename`: Current pagename.
`regex`: See above.
`1`, `2`, `3`, ...: See above.
`language_name`, `language_code`, `language_object`: See above.
`parent_language_name`, `parent_language_code`, `parent_language_object`: See above.
`nolang`: See above.
`allow_etym_lang`: Language names may be etymology-only languages. See above.
`description`: Override the description (normally taken directly from the pagename).
`template_name`: Name of template which generates this category.
`template_sample_call`: Syntax for calling the template. Defaults to "{{{template_name}}}|{{{language_code}}}". Used to
display an example template call and the output of this call.
`template_actual_sample_call`: Syntax for calling the template. Takes precedence over `template_sample_call` when
generating example template output (but not when displaying an example template call) and is intended for a template
call that uses the |nocat=1 parameter.
`template_example_output`: Override the text that displays example template output (see `template_sample_call`).
`additional_template_description`: Extra text to be displayed after the example template output.
`parents`: Parent categories. Should be a list of elements, each of which is an object containing at least a name= and
sort= field (same format as parents= for regular raw categories, except that the name= and sort= field will have
{{{PROPERTY}}} references expanded). If no parents are specified, and the pagename is of the form "Requests for FOO
by language", the parents will be "Request subcategories by language" with FOO as the sort key, along with any
parents specified in `additional_umbrella_parents`. Otherwise, the `language_name` property must exist, and the
parent will be "Requests concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
Note that this does *NOT* apply if an etymology-only language is associated with the category, in which case
`etym_parents` is used instead.
`etym_parents`: Parent categories for categories with associated etymology-only languages. The format is the same as
`parents`. If omitted, there are two parents by default: (1) The pagename (i.e. category name) with the language name
replaced by the corresponding parent language name, with the value of `language_name` as the sort key; (2) "Requests
concerning LANGNAME", with the pagename minus any initial "Requests for " as the sort key.
`umbrella`: Parent all-language category. Sort key is based on the language name. This applies *ONLY* if a full language
is associated with the category name (i.e. not if `nolang` is set or if `allow_etym_lang` is set and the associated
language is an etymology-only language); otherwise there will be no umbrella category.
`additional_umbrella_parents`: Additional parents to add to the umbrella (all-language) category along with
"Request subcategories by language".
`breadcrumb`: Specify the breadcrumb. If `parents` is given, there is no default (i.e. it will end up being the
pagename). Otherwise, if the pagename is of the form "Requests for FOO by language", the default breadcrumb will be
"FOO". Otherwise it is computed by removing the language name from the pagename and chopping out "Requests for" from
the beginning and "in entries" and "for terms" from the end. Note that this does *NOT* apply if an etymology-only
language is associated with the category, in which case `etym_breadcrumb` is used instead.
`etym_breadcrumb`: Specify the breadcrumb for categories with associated etymology-only languages. Defaults to the value
of `language_name`.
`not_hidden_category`: Don't hide the category.
`catfix`: Same as `catfix` in regular labels and raw categories, except that request-specific {{{PROPERTY}}} syntax is
expanded.
`toc_template`, `toc_template_full`: Same as the corresponding fields in regular labels and raw categories, except that
request-specific {{{PROPERTY}}} syntax is expanded.
In general, properties can contain references to templates (e.g. {{tl}} and {{para}}), which will be appropriately
expanded (this expansion happens in the poscatboiler code, not in this module). The major exception is in the
`template_sample_call` and `template_actual_sample_call` properties, which are surrounded by <pre>...</pre> when
inserted, so template references are not expanded. Triple-brace property references are still expanded in these
properties; but beware that if any of those property references contain template references, they won't be expanded.
(This actually happens in the handlers for 'Request for SCRIPT script for LANG terms'; the sample call references
{{{script_code}}}, whose definition therefore cannot contain template references. The solution is to define this
property using a function.)
]=]
local requests_categories = {
{
regex = "^Requests concerning (.+)$",
allow_etym_lang = true,
description = "Categories with {{{1}}} entries that need the attention of experienced editors.",
parents = {{name = "entry maintenance", is_label = true, sort = "requests"}},
etym_parents = {{name = "Requests concerning {{{parent_language_name}}}", sort = "{{{1}}}"},
{name = "{{{1}}}", sort = "Requests"}},
umbrella = "Requests by language",
breadcrumb = "Requests",
not_hidden_category = true,
},
{
regex = "^Requests for etymologies in (.+) entries$",
allow_etym_lang = true,
umbrella = "Requests for etymologies by language",
template_name = "rfe",
},
{
regex = "^Requests for expansion of etymologies in (.+) entries$",
umbrella = "Requests for expansion of etymologies by language",
template_name = "etystub",
},
{
regex = "^Requests for pronunciation in (.+) entries$",
umbrella = "Requests for pronunciation by language",
template_name = "rfp",
},
{
regex = "^Requests for audio pronunciation in (.+) entries$",
umbrella = "Requests for audio pronunciation by language",
template_name = "rfap",
},
{
regex = "^Requests for definitions in (.+) entries$",
umbrella = "Requests for definitions by language",
template_name = "rfdef",
},
{
regex = "^Requests for clarification of definitions in (.+) entries$",
umbrella = "Requests for clarification of definitions by language",
template_name = "rfclarify",
},
}
for _, spec_with_pos in ipairs {
{"inflections", "rfinfl"},
{"plural forms"},
{"tone", "rftone"},
{"accents"},
{"aspect", "rfaspect"},
{"animacy"},
{"gender", "rfgender"},
{"noun class"},
} do
local property, rftemplate = unpack(spec_with_pos)
table.insert(requests_categories,
{
-- This is for part-of-speech-specific categories such as
-- "Requests for inflections in Northern Ndebele noun entries" or
-- "Requests for accents in Ukrainian proper noun entries".
-- Here and below, we assume that the part of speech is begins with
-- a lowercase letter, while the preceding language name ends in a
-- capitalized word. Note that this entry comes before the
-- following one and takes precedence over it.
regex = ("^Requests for %s in (.-) ([a-z]+[a-z ]*) entries$"):format(property),
parents = {{name = ("Requests for %s in {{{language_name}}} entries"):format(property), sort = "{{{2}}}"}},
umbrella = ("Requests for %s of {{pluralize|{{{2}}}}} by language"):format(property),
breadcrumb = "{{{2}}}",
template_name = rftemplate,
template_sample_call = rftemplate and ("{{%s|{{{language_code}}}|{{{2}}}}}"):format(rftemplate) or nil,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s in (.+) entries$"):format(property),
umbrella = ("Requests for %s by language"):format(property),
template_name = rftemplate,
}
)
table.insert(requests_categories,
{
regex = ("^Requests for %s of (.+) by language$"):format(property),
nolang = true,
}
)
end
extend(requests_categories, {
{
regex = "^Requests for example sentences in (.+)$",
umbrella = "Requests for example sentences by language",
template_name = "rfex",
},
{
regex = "^Requests for quotations in (.+)$",
umbrella = "Requests for quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfquote",
},
{
regex = "^Requests for translations into (.+)$",
allow_etym_lang = true,
umbrella = "Requests for translations by language",
template_name = "t-needed",
catfix = "en",
},
{
regex = "^Requests for translations of (.+) usage examples$",
allow_etym_lang = true,
umbrella = "Requests for translations of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|usex}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|usex|nocat=1}}",
additional_template_description = "The {{tl|ux}}, {{tl|uxi}}, {{tl|ja-usex}} and {{tl|zh-x}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for translations of (.+) quotations$",
allow_etym_lang = true,
umbrella = "Requests for translations of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "t-needed",
template_sample_call = "{{t-needed|{{{language_code}}}|quote}}",
template_actual_sample_call = "{{t-needed|{{{language_code}}}|quote|nocat=1}}",
additional_template_description = "The {{tl|quote}}, and {{tl|Q}} templates automatically add the page to this category if the example is in a foreign language and the translation is missing."
},
{
regex = "^Requests for review of (.+) translations$",
allow_etym_lang = true,
umbrella = "Requests for review of translations by language",
template_name = "t-check",
template_sample_call = "{{t-check|{{{language_code}}}|example}}",
template_example_output = "",
catfix = "en",
},
{
regex = "^Requests for transliteration of (.+) terms$",
umbrella = "Requests for transliteration by language",
template_name = "rftranslit",
additional_template_description = "The {{tl|head}} template, and the large number of language-specific variants of it, automatically add " ..
"the page to this category if the example is in a foreign language and no transliteration can be generated (particularly in languages without " ..
"automated transliteration, such as Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) usage examples$",
umbrella = "Requests for transliteration of usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rftranslit",
template_sample_call = "{{rftranslit|{{{language_code}}}}}",
template_actual_sample_call = "{{rftranslit|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for transliteration of (.+) quotations$",
umbrella = "Requests for transliteration of quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation " ..
"is in a foreign language and no transliteration can be generated (particularly in languages without automated transliteration, such as " ..
"Hebrew and Persian).",
},
{
regex = "^Requests for native script for (.+) terms$",
allow_etym_lang = true,
etym_parents = {
{name = "Requests for native script for {{{parent_language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "native script"},
},
umbrella = "Requests for native script by language",
template_name = "rfscript",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for native script in (.+) usage examples$",
umbrella = "Requests for native script in usage examples by language",
additional_umbrella_parents = {"Usage example maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|usex=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|usex=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|ux}} and {{tl|uxi}} templates automatically add the page to this category if the example itself is missing but the translation is supplied."
},
{
regex = "^Requests for native script in (.+) quotations$",
umbrella = "Requests for native script in quotations by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfscript",
template_sample_call = "{{rfscript|{{{language_code}}}|quote=1}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|quote=1|nocat=1}}",
catfix = false,
additional_template_description = "The {{tl|quote}} and {{code|<nowiki>{{quote-*}}</nowiki>}} templates automatically add the page to this category if the quotation itself is missing but the translation is supplied."
},
{
regex = "^Requests for (.+) script for (.+) terms$",
language_name = "{{{2}}}",
allow_etym_lang = true,
parents = {{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"}},
etym_parents = {
{name = "Requests for native script for {{{language_name}}} terms", sort = "{{{1}}}"},
{name = "Requests for {{{1}}} script for {{{parent_language_name}}} terms", sort = "{{{language_name}}}"},
{name = "Requests concerning {{{language_name}}}", sort = "{{{1}}} script"},
},
umbrella = "Requests for {{{1}}} script by language",
breadcrumb = "{{{1}}}",
etym_breadcrumb = "{{{1}}}",
template_name = "rfscript",
-- NOTE: The following is used in `template_sample_call` and `template_actual_sample_call`, meaning the
-- conversion of script name to script code needs to be done using an inline function like this, instead of
-- a {{#invoke:...}} template call.
script_code = function(items)
return script_name_to_code(items["1"])
end,
template_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}}}",
template_actual_sample_call = "{{rfscript|{{{language_code}}}|sc={{{script_code}}}|nocat=1}}",
catfix = false,
additional_template_description = "Many templates such as {{tl|l}}, {{tl|m}} and {{tl|t}} automatically place the page in this category when they are missing the term but have been provided with a transliteration."
},
{
regex = "^Requests for (.+) script by language$",
parents = {{name = "Requests for script by language", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
},
{
regex = "^Requests for script by language$",
nolang = true,
},
{
regex = "^Requests for images in (.+) entries$",
umbrella = "Requests for images by language",
template_name = "rfi",
},
{
regex = "^Requests for references for (.+) terms$",
umbrella = "Requests for references by language",
template_name = "rfref",
},
{
regex = "^Requests for references for etymologies in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "etymologies"}},
umbrella = "Requests for references for etymologies by language",
breadcrumb = "Etymologies",
template_name = "rfv-etym",
},
{
regex = "^Requests for references for pronunciations in (.+) entries$",
parents = {{name = "Requests for references for {{{language_name}}} terms", sort = "pronunciations"}},
umbrella = "Requests for references for pronunciations by language",
breadcrumb = "Pronunciations",
template_name = "rfv-pron",
},
{
regex = "^Requests for attention concerning (.+)$",
umbrella = "Requests for attention by language",
breadcrumb = "Attention",
template_name = "attention",
template_sample_call = "{{attention|{{{language_code}}}|insert a brief description of the request here}}",
template_example_output = "This template does not generate any text in entries, but can be visualised by enabling the Catch My Attention gadget. See {{section link|Template:attention#Visibility}}.",
-- These pages typically contain a mixture of English and native-language entries, so disable catfix.
catfix = false,
-- Setting catfix = false will normally trigger the English table of contents template.
-- We still want the native-language table of contents template, though.
toc_template = "{{{language_code}}}-categoryTOC",
toc_template_full = "{{{language_code}}}-categoryTOC/full",
},
{
regex = "^Requests for cleanup in (.+) entries$",
umbrella = "Requests for cleanup by language",
template_name = "rfc",
template_actual_sample_call = "{{rfc|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for cleanup of Pronunciation N headers in (.+) entries$",
umbrella = "Requests for cleanup of Pronunciation N headers by language",
template_name = "rfc-pron-n",
template_actual_sample_call = "{{rfc-pron-n|{{{language_code}}}|nocat=1}}",
template_example_output = "This template does not generate any text in entries.",
additional_template_description = [=[
The purpose of this category is to tag entries that use headers with "Pronunciation" and a number.
While these headers and structure are sometimes used, they are not specifically prescribed by [[WT:ELE]]. No complete proposal has yet been made on how they should work, what the semantics are, or how they interact with multiple etymologies. As a result they should generally be avoided. Instead, merge the entries (possibly under multiple Etymology sections, if appropriate), and list all pronunciations, appropriately tagged, under a Pronunciation header.
[[User:KassadBot|KassadBot]] tags these entries (or used to tag these entries, when the bot was operational). At some point if a proposal is made and adopted as policy, these entries should be reviewed.
This category is hidden.]=],
},
{
regex = "^Requests for deletion in (.+) entries$",
umbrella = "Requests for deletion by language",
template_name = "rfd",
template_actual_sample_call = "{{rfd|{{{language_code}}}|nocat=1}}",
},
{
regex = "^Requests for verification in (.+) entries$",
umbrella = "Requests for verification by language",
template_name = "rfv",
},
{
regex = "^Requests for attention in (.+) etymologies$",
umbrella = "Requests for attention by language"
},
{
regex = "^Requests for quotations/(.+)$",
description = "Requests for a quotation or for quotations from {{{1}}}.",
parents = {{name = "Requests for quotations by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfquotek",
template_sample_call = "{{rfquotek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfquotek|und|{{{1}}}}}",
},
{
regex = "^Requests for date in (.+) entries$",
umbrella = "Requests for date by language",
additional_umbrella_parents = {"Quotation maintenance"},
template_name = "rfdate",
additional_template_description = "The quotation templates, such as {{tl|quote-book}} and {{tl|quote-journal}}, " ..
"automatically add the page to this category if neither {{para|date}} nor {{para|year}} is provided. Providing the " ..
"parameter in each case on the page automatically removes the article from this category. See " ..
"[[Wiktionary:Quotations]] for information about formatting dates and quotations.",
},
{
regex = "^Requests for date/(.+)$",
description = "{{rfd|section=Category:Requests for date by source}}Requests for a date for a quotation or quotations from {{{1}}}.",
parents = {{name = "Requests for date by source", sort = "{{{1}}}"}},
breadcrumb = "{{{1}}}",
nolang = true,
template_name = "rfdatek",
template_sample_call = "{{rfdatek|LANGCODE|{{{1}}}}}",
template_example_output = "\n(where LANGCODE is the language code of the entry)\n\nIt results in the message below:\n\n{{rfdatek|und|{{{1}}}}}",
},
{
regex = "^Requests for attestation of (.+) terms$",
umbrella = "Requests for attestation of terms by language",
breadcrumb = "Attestation",
additional_template_description = "The {{tl|LDL}} template adds this category when a language code is supplied in {{para|1}} (as it should be)."
},
})
local user_competency_additional_template_description = "This is added by user-competency categories such as " ..
"[[:Category:User fr-4]], which groups users who speak French at level 4 (near-native proficiency), when " ..
"the native-language text indicating this fact is missing. The appropriate translation should mirror the " ..
"English text also displayed (e.g. in this case \"These users speak French at a '''near native''' " ..
"level.\"), and should be supplied to {{tl|auto cat}} using the {{para|text}} parameter. The mention of the " ..
"language in the text should be surrounded by double angle brackets, e.g. \"<<français>>\", which " ..
"causes it to be automatically linked to the appropriate parent category."
local user_competency_parents = {{name = "Requests for translations in user-competency categories by number of users",
sort = function(items)
return " " .. ("%010d"):format(items["1"])
end,
}}
extend(requests_categories, {
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+)%-([0-9]+) users$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}}-{{{2}}} users.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}-{{{2}}}",
nolang = true,
},
{
regex = "^Requests for translations in user%-competency categories with ([0-9]+) (users?)$",
description = "Requests for translation of phrases indicating user competencies for specific languages and specific competency levels, for categories with {{{1}}} {{{2}}}.",
additional_template_description = user_competency_additional_template_description,
parents = user_competency_parents,
breadcrumb = "{{{1}}}",
nolang = true,
}
})
table.insert(raw_handlers, function(data)
local items
local function init_items()
items = {pagename = data.category}
end
local function expand_value(item, val)
if not val then
return val
elseif is_callable(val) then
return expand_value(item .. " ⇒ function", val(items))
elseif type(val) == "table" then
for k, v in pairs(val) do
val[k] = expand_value(item .. " ⇒ " .. k, v)
end
return val
elseif type(val) == "number" then
val = tostring(val)
end
if type(val) ~= "string" then
error(("The item '%s' on page %s is of type %s and can't be concatenated"):format(
item, items.pagename, type(val)))
end
-- Replaces pseudo-template code {{{ }}} with the corresponding member of the "items" table. Has to be done
-- recursively, since some of the items are nested:
-- {{{template_sample_call_with_temp}}}
-- ⇓
-- {{{{{template_name}}}|{{{language_code}}}}}
-- ⇓
-- {{attention|en}}
if val:find("{{{") then
val = mw.ustring.gsub(val, "{{{([^%}%{]+)}}}", function(prop)
local propval = items[prop]
if not propval then
error(("The item '%s' (expanded from property '%s' on page %s) was not found in the 'items' table"):
format(prop, item, items.pagename))
end
return expand_value(item .. " ⇒ " .. prop, propval)
end
)
end
return val
end
local function expand_items_value(item)
return expand_value(item, items[item])
end
local function convert_items_to_category_data(items)
if not items.nolang then
items.language_name = items.language_name or "{{{1}}}"
items.language_name = expand_items_value("language_name")
items.language_object = require(languages_module).getByCanonicalName(items.language_name, true,
items.allow_etym_lang)
items.language_code = items.language_object:getCode()
items.is_etym_lang = items.language_object:hasType("etymology-only")
if items.is_etym_lang then
items.parent_language_object = items.language_object:getFull()
-- Reject weird cases where etymology language has no parent.
if not items.parent_language_object then
return nil
end
items.parent_language_code = items.parent_language_object:getCode()
items.parent_language_name = items.parent_language_object:getCanonicalName()
-- Reject weird cases where the parent language has the same name as the child etymology language. In
-- that case, we'll get an infinite parent-category loop. This actually happens, e.g. with Rudbari and
-- Bashkardi.
if items.parent_language_name == items.language_name then
return nil
end
else
end
end
if items.template_name then
items.template_sample_call = items.template_sample_call or "{{{{{template_name}}}|{{{language_code}}}}}"
items.full_text_about_the_template = "To make this request, in this specific language, use this code in the entry (see also the documentation at [[Template:{{{template_name}}}]]):\n\n<pre>{{{template_sample_call}}}</pre>"
if items.template_example_output then
items.full_text_about_the_template = items.full_text_about_the_template .. " " .. items.template_example_output
else
items.template_actual_sample_call = items.template_actual_sample_call or items.template_sample_call
items.full_text_about_the_template = items.full_text_about_the_template .. "\nIt results in the message below:\n\n{{{template_actual_sample_call}}}"
end
if items.additional_template_description then
items.full_text_about_the_template = items.full_text_about_the_template .. "\n\n" .. items.additional_template_description
end
else
items.full_text_about_the_template = items.additional_template_description
end
local parents, breadcrumb
if items.is_etym_lang then
parents = items.etym_parents
breadcrumb = expand_items_value("etym_breadcrumb") or items.language_name
else
parents = items.parents
breadcrumb = expand_items_value("breadcrumb")
end
if parents then
for _, parent in ipairs(parents) do
parent.name = expand_value("parent.name", parent.name)
parent.sort = {sort_base = expand_value("parent.sort", parent.sort), lang = "en"}
end
else
local umbrella_type = items.pagename:match("^Requests for (.+) by language$")
if umbrella_type then
breadcrumb = breadcrumb or umbrella_type
parents = {{name = "Request subcategories by language", sort = umbrella_type}}
if items.additional_umbrella_parents then
extend(parents, items.additional_umbrella_parents)
end
elseif not items.language_name then
error("Internal error: Don't know how to compute parents for non-language-specific category '" .. items.pagename .. "'")
else
local requests_concerning_breadcrumb = items.pagename:gsub(" " .. pattern_escape(items.language_name), "")
requests_concerning_breadcrumb =
requests_concerning_breadcrumb:gsub("^Requests for ", ""):gsub(" in entries$", ""):gsub(" for terms$", "")
local requests_concerning_parent =
{
name = "Requests concerning " .. items.language_name,
sort = {sort_base = requests_concerning_breadcrumb, lang = "en"}
}
if items.is_etym_lang then
local parent_lang_cat = items.pagename:gsub(pattern_escape(items.language_name), replacement_escape(items.parent_language_name))
parents = {
{name = parent_lang_cat, sort = {sort_base = items.language_name, lang = "en"}},
requests_concerning_parent
}
else
breadcrumb = breadcrumb or requests_concerning_breadcrumb
parents = {requests_concerning_parent}
end
end
end
if not items.nolang and not items.is_etym_lang and items.umbrella ~= false then
table.insert(parents, {
name = expand_items_value("umbrella"),
sort = {sort_base = items.language_name, lang = "en"}
})
end
local additional = expand_items_value("full_text_about_the_template")
if items.pagename:find(" by language$") then
additional = "{{{umbrella_msg}}}" .. (additional and "\n\n" .. additional or "")
end
return {
description = expand_items_value("description") or items.pagename .. ".",
lang = items.parent_language_code or items.language_code,
additional = additional,
parents = parents,
-- If no breadcrumb= and not an etym-only language, it will default to the category name
breadcrumb = breadcrumb,
catfix = expand_items_value("catfix"),
toc_template = expand_items_value("toc_template"),
toc_template_full = expand_items_value("toc_template_full"),
hidden = not items.nolang and not items.not_hidden_category,
can_be_empty = true,
}
end
-- First look for a regular (usually language or script-specific) category.
for _, category in ipairs(requests_categories) do
local matchvals = {mw.ustring.match(data.category, category.regex)}
if #matchvals > 0 then
init_items()
for key, value in pairs(category) do
items[key] = value
end
for key, value in ipairs(matchvals) do
items["" .. key] = value
end
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
-- Now look for umbrella categories.
for _, category in ipairs(requests_categories) do
if data.category == category.umbrella then
init_items()
items.nolang = true
items.additional_umbrella_parents = category.additional_umbrella_parents
local catdata = convert_items_to_category_data(items)
if catdata then
return catdata
end
end
end
return nil
end)
table.insert(raw_handlers, function(data)
local langname = data.category:match("^Terms with (.+) translations$")
local lang = langname and require(languages_module).getByCanonicalName(langname, true, true)
if lang then
local langcode = lang:getCode()
local parents, breadcrumb_and_first_sort_key
if lang:hasType("etymology-only") then
parents = {
"Terms with " .. lang:getFullName() .. " translations",
{name = langname, sort = "Translations"},
}
breadcrumb_and_first_sort_key = lang:getCanonicalName()
else
parents = {
{name = "entry maintenance", is_label = true, lang = langcode},
{
name = "Terms with translations by language",
sort = {sort_base = langname, lang = "en"}
},
}
breadcrumb_and_first_sort_key = "Translations"
end
return {
description = "Entries that contain translations into " .. langname .. " which were added using one of the translation templates, such as {{tl|t|" .. langcode .. "|...}}, {{tl|t+|" .. langcode .. "|...}}, etc.",
parents = parents,
breadcrumb_and_first_sort_key = breadcrumb_and_first_sort_key,
catfix = false,
can_be_empty = true,
hidden = true,
}
end
end)
local recognized_taxtypes = require(table_module).listToSet {
"ambiguous",
"binomial",
"branch",
"clade",
"cladus",
"class",
"cohort",
"convariety",
"cultivar group",
"cultivar",
"division",
"empire",
"epifamily",
"epithet",
"family",
"form taxon",
"form",
"genus",
"grade",
"grandorder",
"group",
"hybrid",
"informal group",
"infraclass",
"infracohort",
"infrakingdom",
"infraorder",
"infraphylum",
"infraspecies",
"kingdom",
"magnorder",
"megacohort",
"mirorder",
"morph",
"nothogenus",
"nothospecies",
"nothosubspecies",
"nothovariety",
"obsolete",
"oofamily",
"order",
"parvclass",
"parvorder",
"phylum",
"section",
"series",
"serovar",
"species group",
"species",
"stem",
"stirps",
"strain",
"subclass",
"subcohort",
"subdivision",
"subfamily",
"subgenus",
"subgroup",
"subinfraorder",
"subkingdom",
"suborder",
"subphylum",
"subsection",
"subspecies",
"subterclass",
"subtribe",
"superclass",
"supercohort",
"superfamily",
"supergroup",
"superorder",
"superphylum",
"supertribe",
"taxon",
"tribe",
"trinomial",
"undescribed species",
"unknown",
"unranked group",
"variety",
"virus complex",
}
table.insert(raw_handlers, function(data)
local taxtype = data.category:match("^Entries using missing taxonomic name %((.*)%)$")
if taxtype and recognized_taxtypes[taxtype] then
return {
description = "Entries that link to wikispecies because there is no corresponding Wiktionary entry for the taxonomic name in the template {{tl|taxlink}}.",
additional = "The missing name is one or more of those enclosed in {{tl|taxlink}}. The entries are sorted by the missing taxonomic name.",
parents = {{name = "Entries using missing taxonomic names", sort = {sort_base = taxtype, lang = "en"}}},
breadcrumb = taxtype,
hidden = true,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
o9abg0jm6bkj96u0bwk4596n3rvss1w
मॉड्यूल:category tree/प्रविष्टि रखरखाव
828
306958
487808
2026-09-02T19:09:31Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/प्रविष्टि रखरखाव]] को [[मॉड्यूल:category tree/entry maintenance]] पर स्थानांतरित किया
487808
Scribunto
text/plain
return require [[मॉड्यूल:category tree/entry maintenance]]
dmh2vp7oun97u03hqgbcmiz6wjjht27
मॉड्यूल:category tree/व्युत्पत्ति
828
306959
487809
2026-09-02T19:13:20Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487809
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["टर्म व्युत्पत्ति अनुसार"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["borrowed terms"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"terms by etymology"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["Sanskritic formations"] = {
description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.",
parents = {"terms by etymology", "terms derived from Sanskrit"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Root data from [[Module:roots]], which owns the separator, link target and
-- romanization for each language. Required on demand so that category pages
-- unrelated to roots do not load it.
local function get_root_data(lang)
return lang and require("Module:roots").get_data(lang:getCode()) or nil
end
-- Languages such as Hebrew have no automatic transliteration, but their root data
-- defines one; this keeps the category description matching the root entry.
local function root_translit(rdata, root)
if not (rdata and rdata.romanization) then
return nil
end
return require("Module:roots").transliterate(root, rdata.romanization)
end
-- Raises on a root that is not well-formed for its language. A language without root
-- data declares no radical structure, so nothing is checked.
local function assert_valid_root(lang, root)
return require("Module:roots").assert_root(lang, root)
end
-- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data
-- is the only authority: a language that does not declare `appendix_subpage` links to
-- the root in mainspace.
local function lang_uses_appendix_roots(lang)
local rdata = get_root_data(lang)
return rdata ~= nil and rdata.link_target == "appendix_subpage"
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form, term_tr
if term_type == "root" then
assert_valid_root(source, term)
local rdata = get_root_data(source)
term_tr = root_translit(rdata, term)
if lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
end
end
term_page = term_page or term
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
tr = term_tr,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
if data.lang then
assert_valid_root(data.lang, root)
end
local rdata = get_root_data(data.lang)
local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{
term = root_page,
alt = alt_form,
tr = root_translit(rdata, root),
lang = data.lang,
gloss = id,
id = id,
}, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
amspenxva9ysxyafikht7w0t3hcmpvg
487810
487809
2026-09-02T19:13:37Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/etymology]] को [[मॉड्यूल:category tree/व्युत्पत्ति]] पर स्थानांतरित किया
487809
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["टर्म व्युत्पत्ति अनुसार"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["borrowed terms"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"terms by etymology"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["Sanskritic formations"] = {
description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.",
parents = {"terms by etymology", "terms derived from Sanskrit"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Root data from [[Module:roots]], which owns the separator, link target and
-- romanization for each language. Required on demand so that category pages
-- unrelated to roots do not load it.
local function get_root_data(lang)
return lang and require("Module:roots").get_data(lang:getCode()) or nil
end
-- Languages such as Hebrew have no automatic transliteration, but their root data
-- defines one; this keeps the category description matching the root entry.
local function root_translit(rdata, root)
if not (rdata and rdata.romanization) then
return nil
end
return require("Module:roots").transliterate(root, rdata.romanization)
end
-- Raises on a root that is not well-formed for its language. A language without root
-- data declares no radical structure, so nothing is checked.
local function assert_valid_root(lang, root)
return require("Module:roots").assert_root(lang, root)
end
-- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data
-- is the only authority: a language that does not declare `appendix_subpage` links to
-- the root in mainspace.
local function lang_uses_appendix_roots(lang)
local rdata = get_root_data(lang)
return rdata ~= nil and rdata.link_target == "appendix_subpage"
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form, term_tr
if term_type == "root" then
assert_valid_root(source, term)
local rdata = get_root_data(source)
term_tr = root_translit(rdata, term)
if lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
end
end
term_page = term_page or term
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
tr = term_tr,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
if data.lang then
assert_valid_root(data.lang, root)
end
local rdata = get_root_data(data.lang)
local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{
term = root_page,
alt = alt_form,
tr = root_translit(rdata, root),
lang = data.lang,
gloss = id,
id = id,
}, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
amspenxva9ysxyafikht7w0t3hcmpvg
487883
487810
2026-09-03T10:18:52Z
SM7
6218
लोकलाइजेशन...
487883
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["टर्म व्युत्पत्ति अनुसार"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["आहरित टर्म"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"टर्म व्युत्पत्ति अनुसार"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["Sanskritic formations"] = {
description = "{{{langname}}} terms coined from [[tatsama]] [[word]]s and/or [[affix]]es.",
parents = {"terms by etymology", "terms derived from Sanskrit"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Root data from [[Module:roots]], which owns the separator, link target and
-- romanization for each language. Required on demand so that category pages
-- unrelated to roots do not load it.
local function get_root_data(lang)
return lang and require("Module:roots").get_data(lang:getCode()) or nil
end
-- Languages such as Hebrew have no automatic transliteration, but their root data
-- defines one; this keeps the category description matching the root entry.
local function root_translit(rdata, root)
if not (rdata and rdata.romanization) then
return nil
end
return require("Module:roots").transliterate(root, rdata.romanization)
end
-- Raises on a root that is not well-formed for its language. A language without root
-- data declares no radical structure, so nothing is checked.
local function assert_valid_root(lang, root)
return require("Module:roots").assert_root(lang, root)
end
-- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data
-- is the only authority: a language that does not declare `appendix_subpage` links to
-- the root in mainspace.
local function lang_uses_appendix_roots(lang)
local rdata = get_root_data(lang)
return rdata ~= nil and rdata.link_target == "appendix_subpage"
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form, term_tr
if term_type == "root" then
assert_valid_root(source, term)
local rdata = get_root_data(source)
term_tr = root_translit(rdata, term)
if lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
end
end
term_page = term_page or term
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
tr = term_tr,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
if data.lang then
assert_valid_root(data.lang, root)
end
local rdata = get_root_data(data.lang)
local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{
term = root_page,
alt = alt_form,
tr = root_translit(rdata, root),
lang = data.lang,
gloss = id,
id = id,
}, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
4t8q02abya6knepuy5kmp0bu0k21en3
487884
487883
2026-09-03T10:21:43Z
SM7
6218
लोकलाइजेशन...
487884
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local raw_handlers = {}
local en_utilities_module = "Module:en-utilities"
local m_str_utils = require("Module:string utilities")
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local full_link = require("Module:links").full_link
local get_lang_by_name = require("Module:languages").getByCanonicalName
local insert = table.insert
local pattern_escape = m_str_utils.pattern_escape
local plain_gsub = m_str_utils.plain_gsub
local pluralize_pos = require("Module:headword").pluralize_pos
local pos_lemma_or_nonlemma = require("Module:headword").pos_lemma_or_nonlemma
local serial_comma_join = require("Module:table").serialCommaJoin
local tag_text = require("Module:script utilities").tag_text
local umatch = mw.ustring.match
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["टर्म व्युत्पत्ति अनुसार"] = {
description = "{{{langname}}} terms categorized by their etymologies.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true}},
}
labels["AABB-type reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] in an AABB pattern.",
breadcrumb = "AABB-type",
parents = {"reduplications"},
}
labels["apophonic reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]] with only a change in a vowel sound.",
breadcrumb = "apophonic",
parents = {"reduplications"},
}
labels["back-formations"] = {
description = "{{{langname}}} terms formed by reversing a supposed regular formation, removing part of an older term.",
parents = {"terms by etymology"},
}
labels["blends"] = {
description = "{{{langname}}} terms formed by combinations of other words.",
parents = {"terms by etymology"},
}
labels["आहरित टर्म"] = {
description = "{{{langname}}} terms that are loanwords, i.e. terms that were directly incorporated from another language.",
parents = {"टर्म व्युत्पत्ति अनुसार"},
}
labels["catachreses"] = {
description = "{{{langname}}} terms derived from misuses or misapplications of other terms.",
parents = {"terms by etymology"},
}
labels["coinages"] = {
description = "{{{langname}}} terms coined by an identifiable person, organization or other such entity.",
parents = {"terms attributed to a specific source"},
umbrella_parents = {name = "terms attributed to a specific source", is_label = true, sort = " "},
}
labels["coordinated pairs"] = {
description = "Terms in {{{langname}}} consisting of a pair of terms joined by a [[coordinating conjunction]].",
parents = {"terms by etymology"},
}
labels["coordinated triples"] = {
description = "Terms in {{{langname}}} consisting of three terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quadruples"] = {
description = "Terms in {{{langname}}} consisting of four terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["coordinated quintuples"] = {
description = "Terms in {{{langname}}} consisting of five terms joined by one or more [[coordinating conjunction]]s.",
parents = {"terms by etymology"},
}
labels["denominals"] = {
description = "{{{langname}}} terms derived from a noun.",
parents = {"terms by etymology"},
}
labels["deverbals"] = {
description = "{{{langname}}} terms derived from a verb.",
parents = {"terms by etymology"},
}
labels["doublets"] = {
description = "{{{langname}}} terms that trace their etymology from ultimately the same source as other terms in the same language, but by different routes, and often with subtly or substantially different meanings.",
parents = {"terms by etymology"},
}
labels["elongated forms"] = {
description = "{{{langname}}} terms where one or more letters or sounds is repeated for emphasis or effect.",
parents = {"terms by etymology"},
}
labels["eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious individuals.",
parents = {"terms by etymology"},
}
labels["genericized trademarks"] = {
description = "{{{langname}}} terms that originate from [[trademark]]s, [[brand]]s and company names which have become [[genericized]]; that is, fallen into common usage in the target market's [[vernacular]], even when referring to other competing brands.",
parents = {"terms by etymology", "trademarks"},
}
labels["ghost words"] = {
description = "{{{langname}}} terms that were originally erroneous or fictitious, published in a reference work as if they were genuine as a result of typographical error, misreading, or misinterpretation, or as [[:w:Fictitious entry|fictitious entries]], jokes, or hoaxes.",
parents = {"terms by etymology"},
}
labels["gramograms"] = {
description = "{{{langname}}} [[gramogram]]s – terms that are partially or completely spelled with [[homophone|homophonous]] letters.",
parents = {"rebuses"},
}
labels["haplological words"] = {
description = "{{{langname}}} words that underwent [[haplology]]: thus, their origin involved a loss or omission of a repeated sequence of sounds.",
parents = {"terms by etymology"},
}
labels["homophonic translations"] = {
description = "{{{langname}}} terms that were borrowed by matching the etymon phonetically, without regard for the sense; compare [[phono-semantic matching]] and [[Hobson-Jobson]].",
parents = {"terms by etymology"}
}
labels["hybridisms"] = {
description = "{{{langname}}} terms formed by elements of different linguistic origins.",
parents = {"terms by etymology"},
}
labels["inherited terms"] = {
description = "{{{langname}}} terms that were inherited from an earlier stage of the language.",
parents = {"terms by etymology"},
}
labels["internationalisms"] = {
description = "{{{langname}}} loanwords which also exist in many other languages with the same or similar etymology.",
additional = "Terms should be here preferably only if the immediate source language is not known for certain. Entries are added into this category by [[Template:internationalism]]; see it for more information.",
parents = {"terms by etymology"},
}
labels["legal doublets"] = {
description = "{{{langname}}} legal [[doublet]]s – a legal doublet is a standardized phrase commonly used in legal documents, proceedings etc. which includes two words that are near synonyms.",
parents = {"coordinated pairs"},
}
labels["legal triplets"] = {
description = "{{{langname}}} legal [[triplet]]s – a legal triplet is a standardized phrase commonly used in legal documents, proceedings etc which includes three words that are near synonyms.",
parents = {"coordinated triples"},
}
labels["LLM coinages"] = {
description = "{{{langname}}} terms that have been coined by {{w|large language models}} rather than humans.",
parents = {"terms by etymology"},
}
labels["merisms"] = {
description = "{{{langname}}} [[merism]]s – terms that are [[coordinate]]s that, combined, are a synonym for a totality.",
parents = {"coordinated pairs"},
}
labels["metonyms"] = {
description = "{{{langname}}} terms whose origin involves calling a thing or concept not by its own name, but by the name of something intimately associated with that thing or concept.",
parents = {"terms by etymology"},
}
labels["neologisms"] = {
description = "{{{langname}}} terms that have been only recently acknowledged.",
parents = {"terms by etymology"},
}
labels["nominalizations"] = {
description = "{{{langname}}} terms formed by nominalization, a process where a word from another part of speech becomes a noun.",
parents = {"terms by etymology"},
}
labels["nonce terms"] = {
description = "{{{langname}}} terms that have been invented for a single occasion.",
parents = {"terms by etymology"},
}
labels["number homophones"] = {
description = "{{{langname}}} terms that are partially or completely spelled with [[homophone|homophonous]] numbers.",
parents = {"rebuses", "terms spelled with numbers"},
}
labels["numerical contractions"] = {
description = "{{{langname}}} numerical contractions. In these, the number either denotes omitted characters ({{m+|en|globalization}} → {{m|en|g11n}}) or duplication ({{m+|kne|Kankanaey}} → {{m|kne|Kan2aey}}).",
parents = {"contractions", "rebuses", "terms spelled with numbers"},
}
labels["onomatopoeias"] = {
description = "{{{langname}}} terms that were coined to sound like what they represent.",
parents = {"terms by etymology"},
}
labels["piecewise doublets"] = {
description = "{{{langname}}} terms that are [[Appendix:Glossary#piecewise doublet|piecewise doublets]].",
parents = {"terms by etymology"},
}
for _, ism_and_langname in ipairs({
{"anglicisms", "English"},
{"Arabisms", "Arabic"},
{"Gallicisms", "French"},
{"Germanisms", "German"},
{"Hispanisms", "Spanish"},
{"Italianisms", "Italian"},
{"Latinisms", "Latin"},
{"Japonisms", "Japanese"},
}) do
local ism, langname = unpack(ism_and_langname)
labels["pseudo-" .. ism] = {
description = "{{{langname}}} terms that appear to be " .. langname .. ", but are not used or have an unrelated meaning in " .. langname .. " itself.",
parents = {"pseudo-loans"},
umbrella_parents = {name = "pseudo-loans", is_label = true, sort = " "},
}
end
labels["rebracketings"] = {
description = "{{{langname}}} terms that have interacted with another word in such a way that the boundary between the words has been modified.",
parents = {"terms by etymology"}
}
labels["rebuses"] = {
description = "{{{langname}}} [[rebus]]es – terms that are partially or completely represented by images, symbols or numbers, often as a form of wordplay.",
parents = {"terms by etymology"},
}
labels["reconstructed terms"] = {
description = "{{{langname}}} terms that are not directly attested, but have been reconstructed through other evidence.",
parents = {"terms by etymology"}
}
labels["reduplicated coordinated pairs"] = {
description = "{{{langname}}} reduplicated coordinated pairs.",
breadcrumb = "reduplicated",
parents = {"coordinated pairs", "reduplications"},
}
labels["reduplicated coordinated triples"] = {
description = "{{{langname}}} reduplicated coordinated triples.",
breadcrumb = "reduplicated",
parents = {"coordinated triples", "reduplications"},
}
labels["reduplicated coordinated quadruples"] = {
description = "{{{langname}}} reduplicated coordinated quadruples.",
breadcrumb = "reduplicated",
parents = {"coordinated quadruples", "reduplications"},
}
labels["reduplicated coordinated quintuples"] = {
description = "{{{langname}}} reduplicated coordinated quintuples.",
breadcrumb = "reduplicated",
parents = {"coordinated quintuples", "reduplications"},
}
labels["reduplications"] = {
description = "{{{langname}}} terms that underwent [[reduplication]], so their origin involved a repetition of roots or stems.",
parents = {"terms by etymology"},
}
labels["retronyms"] = {
description = "{{{langname}}} terms that serve as new unique names for older objects or concepts whose previous names became ambiguous.",
parents = {"terms by etymology"},
}
labels["roots"] = {
description = "Basic morphemes from which {{{langname}}} words are formed.",
parents = {"terms by etymology", "morphemes"},
}
labels["संस्कृत निर्मितियाँ"] = {
description = "{{{langname}}} के टर्म जो तत्सम संस्कृत शब्दों अथवा/एवं संयोजनों ([[affix]]es) से बने हैं।",
parents = {"टर्म व्युत्पत्ति अनुसार", "टर्म संस्कृत से निर्मित"},
}
labels["sound-symbolic terms"] = {
description = "{{{langname}}} terms that use {{w|sound symbolism}} to express ideas but which are not necessarily strictly speaking [[onomatopoeic]].",
parents = {"terms by etymology"},
}
labels["spelled-out initialisms"] = {
description = "{{{langname}}} initialisms in which the letter names are spelled out.",
parents = {"terms by etymology"},
}
labels["spelling pronunciations"] = {
description = "{{{langname}}} terms whose pronunciation was historically or presently affected by their spelling.",
parents = {"terms by etymology"},
}
labels["spoonerisms"] = {
description = "{{{langname}}} terms in which the initial sounds of component parts have been exchanged, as in \"crook and nanny\" for \"nook and cranny\".",
parents = {"terms by etymology"},
}
labels["taxonomic eponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious people, used for [[taxonomy]].",
parents = {"eponyms"},
}
labels["terms attributed to a specific source"] = {
description = "{{{langname}}} terms coined by an identifiable person or deriving from a known work.",
parents = {"terms by etymology"},
}
labels["terms coined ex nihilo"] = {
description = "{{{langname}}} terms fabricated ''[[ex nihilo]]'', i.e. made up entirely rather than being derived from an existing source.",
parents = {"terms by etymology"},
}
labels["terms containing fossilized case endings"] = {
description = "{{{langname}}} terms which preserve case morphology which is no longer analyzable within the contemporary grammatical system or which has been entirely lost from the language.",
parents = {"terms by etymology"},
}
labels["terms derived from area codes"] = {
description = "{{{langname}}} terms derived from [[area code]]s.",
parents = {"terms by etymology"},
}
labels["terms derived from the shape of letters"] = {
description = "{{{langname}}} terms derived from the shape of letters. This can include terms derived from the shape of any letter in any alphabet.",
parents = {"terms by etymology"},
}
labels["terms by root"] = {
description = "{{{langname}}} terms categorized by the root they originate from.",
parents = {"terms by etymology", {name = "roots", sort = " "}},
}
labels["terms by word"] = {
description = "{{{langname}}} terms categorized by the word they originate from.",
parents = {"terms by etymology"},
}
labels["terms derived from fiction"] = {
description = "{{{langname}}} terms that originate from works of [[fiction]].",
breadcrumb = "fiction",
parents = {{name = "terms attributed to a specific source", sort = "fiction"}},
}
for _, data in ipairs {
{source="Dickensian works", desc="the works of [[w:Charles Dickens|Charles Dickens]]", topic_parent="Charles Dickens"},
{source="DC Comics", desc="[[w:DC Comics|DC Comics]]"},
{source="Doraemon", desc="[[w:Fujiko F. Fujio|Fujiko F. Fujio]]'s ''[[w:Doraemon|Doraemon]]''", displaytitle="''Doraemon''"},
{source="Dragon Ball", desc="[[w:Akira Toriyama|Akira Toriyama]]'s ''[[w:Dragon Ball|Dragon Ball]]''", displaytitle="''Dragon Ball''"},
{source="Duckburg and Mouseton", desc="[[w:The Walt Disney Company|Disney]]'s [[w:Duck universe|Duckburg]] and [[w:Mickey Mouse universe|Mouseton]] universe",
topic_parent="Disney"},
{source="Futurama", desc="the animated television series ''{{w|Futurama}}''", displaytitle = "''Futurama''"},
{source="Harry Potter", desc="the ''[[w:Harry Potter|Harry Potter]]'' series", displaytitle="''Harry Potter''",
topic_parent="Harry Potter"},
{source="Looney Tunes and Merrie Melodies", desc="''{{w|Looney Tunes}}'' and/or ''{{w|Merrie Melodies}}'', by {{w|Warner Bros. Animation}}", displaytitle = "''Looney Tunes'' and ''Merrie Melodies''"},
{source="Nineteen Eighty-Four", desc="[[w:George Orwell|George Orwell]]'s ''[[w:Nineteen Eighty-Four|Nineteen Eighty-Four]]''",
displaytitle="''Nineteen Eighty-Four''"},
{source="Seinfeld", desc="the American television sitcom ''{{w|Seinfeld}}'' (1989–1998)", displaytitle="''Seinfeld''"},
{source="Seussian works", desc="the works of [[w:Dr. Seuss|Dr. Seuss]]"},
{source="South Park", desc="the animated television series ''[[w:South Park|South Park]]''", displaytitle="''South Park''"},
{source="Star Trek", desc="''[[w:Star Trek|Star Trek]]''", displaytitle="''Star Trek''", topic_parent="Star Trek"},
{source="Star Wars", desc="''[[w:Star Wars|Star Wars]]''", displaytitle="''Star Wars''", topic_parent="Star Wars"},
{source="The Simpsons", desc="''[[w:The Simpsons|The Simpsons]]''", displaytitle="''The Simpsons''", topic_parent="The Simpsons", sort="Simpsons"},
{source="Tolkien's legendarium", desc="the [[legendarium]] of [[w:J. R. R. Tolkien|J. R. R. Tolkien]]", topic_parent="J. R. R. Tolkien"},
} do
local parents = {{name = "terms derived from fiction", sort = data.sort or data.source}}
local umbrella_parents = {"Terms by etymology subcategories by language"}
if data.topic_parent then
insert(parents, {name = "{{{langcode}}}:" .. data.topic_parent, raw = true})
insert(umbrella_parents, {name = data.topic_parent, raw = true})
end
labels["terms derived from " .. data.source] = {
description = "{{{langname}}} terms that originate from " .. data.desc .. ".",
breadcrumb = data.displaytitle or data.source,
parents = parents,
umbrella = {
parents = umbrella_parents,
displaytitle = data.displaytitle and "Terms derived from " .. data.displaytitle .. " by language" or nil,
breadcrumb = data.displaytitle and "Terms derived from " .. data.displaytitle,
},
displaytitle = data.displaytitle and "{{{langname}}} terms derived from " .. data.displaytitle or nil,
}
end
labels["terms derived from Greek mythology"] = {
description = "{{{langname}}} terms derived from Greek mythology which have acquired an idiomatic meaning.",
breadcrumb = "Greek mythology",
parents = {{name = "terms attributed to a specific source", sort = "Greek mythology"}},
}
labels["terms derived from occupations"] = {
description = "{{{langname}}} terms derived from names of occupations.",
parents = {"terms by etymology"},
}
labels["terms derived from other languages"] = {
description = "{{{langname}}} terms that originate from other languages.",
parents = {"terms by etymology"},
}
labels["terms derived from the Bible"] = {
description = "{{{langname}}} terms that originate from the [[Bible]].",
breadcrumb = {name = "the Bible", nocap = true},
parents = {{name = "terms attributed to a specific source", sort = "Bible"}},
}
labels["terms derived from Aesop's Fables"] = {
description = "{{{langname}}} terms that originate from [[Aesop]]'s Fables.",
breadcrumb = "Aesop's Fables",
parents = {{name = "terms attributed to a specific source", sort = "Aesop's Fables"}},
}
labels["terms derived from toponyms"] = {
description = "{{{langname}}} terms derived from names of real or fictitious places.",
parents = {"terms by etymology"},
}
labels["terms derived through romanized wordplay"] = {
description = "{{{langname}}} terms derived through romanized wordplay.",
parents = {"terms by etymology"},
}
labels["terms making reference to character shapes"] = {
description = "{{{langname}}} terms making reference to character shapes.",
parents = {"terms by etymology"},
}
labels["terms derived from sports"] = {
description = "{{{langname}}} terms that originate from sports.",
breadcrumb = "sports",
parents = {{name = "terms attributed to a specific source", sort = "sports"}},
}
labels["terms derived from baseball"] = {
description = "{{{langname}}} terms that originate from baseball.",
breadcrumb = "baseball",
parents = {{name = "terms derived from sports", sort = "baseball"}},
}
labels["terms with Indo-Aryan extensions"] = {
description = "{{{langname}}} terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
parents = {"terms by etymology"},
}
labels["terms with lemma and non-lemma form etymologies"] = {
description = "{{{langname}}} terms consisting of both a lemma and non-lemma form, of different origins.",
breadcrumb = "lemma and non-lemma form",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple etymologies"] = {
description = "{{{langname}}} terms that are derived from multiple origins.",
parents = {"terms by etymology"},
}
labels["terms with multiple lemma etymologies"] = {
description = "{{{langname}}} lemmas that are derived from multiple origins.",
breadcrumb = "multiple lemmas",
parents = {"terms with multiple etymologies"},
}
labels["terms with multiple non-lemma form etymologies"] = {
description = "{{{langname}}} non-lemma forms that are derived from multiple origins.",
breadcrumb = "multiple non-lemma forms",
parents = {"terms with multiple etymologies"},
}
labels["terms with unknown etymologies"] = {
description = "{{{langname}}} terms whose etymologies have not yet been established.",
parents = {{name = "terms by etymology", sort = "unknown etymology"}},
}
labels["univerbations"] = {
description = "{{{langname}}} terms that result from the agglutination of two or more words.",
parents = {"terms by etymology"},
}
labels["words derived through corruption"] = {
description = "{{{langname}}} words that result from a non-specific or sporadic change.",
parents = {{name = "terms by etymology", sort = "corruption"}},
}
labels["words derived through metathesis"] = {
description = "{{{langname}}} words that were created through [[metathesis]] from another word.",
parents = {{name = "terms by etymology", sort = "metathesis"}},
}
labels["words that have undergone semantic shift"] = {
description = "{{{langname}}} words that show senses explained by [[semantic shift]].",
parents = {{name = "terms by etymology", sort = "semantic shift"}},
}
labels["words that have undergone semantic broadening"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[broadening]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic broadening"}},
}
labels["words that have undergone semantic narrowing"] = {
description = "{{{langname}}} words that show senses explained by [[semantic]] [[narrowing]].",
parents = {{name = "words that have undergone semantic shift", sort = "semantic narrowing"}},
}
labels["words that have undergone amelioration"] = {
description = "{{{langname}}} words that have gained a positive [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "amelioration"}},
}
labels["words that have undergone pejoration"] = {
description = "{{{langname}}} words that have gained a negative [[connotation]] over time.",
parents = {{name = "words that have undergone semantic shift", sort = "pejoration"}},
}
labels["terms with origins in folklore"] = {
description = "{{{langname}}} terms that have an etymology rooted in folklore.",
breadcrumb = "Folklore",
parents = {{name = "terms by etymology", sort = "folklore"}, {name = "{{{langcode}}}:Folklore", raw = true}},
umbrella_parents = {{name = "Terms by etymology subcategories by language", raw = true}, {name = "Folklore", raw = true, sort = " "}}
}
-- Add 'umbrella_parents' key if not already present.
for _, data in pairs(labels) do
-- NOTE: umbrella.parents overrides umbrella_parents if both are given.
if not data.umbrella_parents then
data.umbrella_parents = "Terms by etymology subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Terms by etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms categorized by their etymologies, such as types of compounds or borrowings.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "terms by etymology", is_label = true, sort = " "},
},
}
raw_categories["Borrowed terms subcategories by language"] = {
description = "Umbrella categories covering topics related to borrowed terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "borrowed terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Inherited terms subcategories by language"] = {
description = "Umbrella categories covering topics related to inherited terms.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "inherited terms", is_label = true, sort = " "},
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Indo-Aryan extensions"] = {
description = "Umbrella categories covering terms extended with particular [[Indo-Aryan]] [[pleonastic]] affixes.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Multiple etymology subcategories by language"] = {
description = "Umbrella categories covering topics related to terms with multiple etymologies.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "Terms by etymology subcategories by language", sort = " "},
},
}
raw_categories["Terms borrowed back into the same language"] = {
description = "Categories with terms in specific languages that were borrowed from a second language that previously borrowed the term from the first language.",
additional = "A well-known example is {{m+|en|salaryman}}, a term borrowed from Japanese which in turn was borrowed from the English words [[salary]] and [[man]].\n\n{{{umbrella_msg}}}",
parents = "Terms by etymology subcategories by language",
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function get_source(source_name, allow_family, name_type)
local source = get_lang_by_name(source_name, nil, true, allow_family)
if source == nil then
return nil
end
-- Check that the source name matches the expected form (e.g. getCanonicalName, getDisplayForm etc).
if source[name_type](source) == source_name then
return source
end
end
local function get_source_and_type_desc(source, term_type)
if source:getCode() == "ine-pro" and term_type:find("^roots?$") then
return "[[w:Proto-Indo-European root|Proto-Indo-European " .. term_type .. "]]"
end
return "[[w:" .. source:getWikipediaArticle() .. "|" .. source:getCanonicalName() .. "]] " .. term_type
end
local function get_source_and_source_desc(source_name)
-- HACK! Map 'taxonomic names', as generated by [[Module:etymology]], back to its canonical name
-- before calling getByCanonicalName(). We need a more general solution here.
local source_desc
if source_name == "taxonomic names" then
source_name = "taxonomic name"
source_desc = "[[w:taxonomic nomenclature|taxonomic names]]"
end
local source = get_source(source_name, true, "getDisplayForm")
if source == nil then
return
end
source_desc = source_desc or source:makeCategoryLink()
if source:hasType("family") then
source_desc = "one of the " .. source_desc
end
return source, source_desc
end
-----------------------------------------------------------------------------
------------------------------- word handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE word word' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Root data from [[Module:roots]], which owns the separator, link target and
-- romanization for each language. Required on demand so that category pages
-- unrelated to roots do not load it.
local function get_root_data(lang)
return lang and require("Module:roots").get_data(lang:getCode()) or nil
end
-- Languages such as Hebrew have no automatic transliteration, but their root data
-- defines one; this keeps the category description matching the root entry.
local function root_translit(rdata, root)
if not (rdata and rdata.romanization) then
return nil
end
return require("Module:roots").transliterate(root, rdata.romanization)
end
-- Raises on a root that is not well-formed for its language. A language without root
-- data declares no radical structure, so nothing is checked.
local function assert_valid_root(lang, root)
return require("Module:roots").assert_root(lang, root)
end
-- Whether a language's roots live at `Appendix:<language> roots/<root>`. The root data
-- is the only authority: a language that does not declare `appendix_subpage` links to
-- the root in mainspace.
local function lang_uses_appendix_roots(lang)
local rdata = get_root_data(lang)
return rdata ~= nil and rdata.link_target == "appendix_subpage"
end
insert(handlers, function(data)
local labelpref, word_and_id = data.label:match("^(terms belonging to the word )(.+)$")
if not word_and_id then
return
end
local word, id = word_and_id:match("^(.+) %((.-)%)$")
if not word then
word = word_and_id
end
local is_semitic = data.lang:inFamily("sem")
local word_desc = is_semitic and "[[w:Semitic word|word]]" or "word"
local parents = {}
if id then
insert(parents, {name = labelpref .. word, sort = id})
end
insert(parents, {name = "terms by word", sort = word_and_id})
local separators = "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style words)
local word_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(word, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(word_no_prefix_suffix, not_separator_c, ""))
local linked_word = data.lang and full_link({ term = word, lang = data.lang, gloss = id, id = id }, "term") or word
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter words", sort = word_and_id})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, word, tag_text(word, lang, nil, "term"))
end
local breadcrumb = tag_text(word, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. word_desc .. " " .. linked_word .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) word$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian word]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source:getDisplayForm())
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "word") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
-----------------------------------------------------------------------------
------------------------------- Root handlers -------------------------------
-----------------------------------------------------------------------------
-- Handlers for 'terms derived from the SOURCE root ROOT' must go *BEFORE* the
-- more general 'terms derived from SOURCE' handler.
-- Handler for e.g. [[:Category:Yola terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Russian terms derived from the Proto-Indo-European word *swé]], and corresponding umbrella
-- categories [[:Category:Terms derived from the Proto-Indo-European root *h₂el- (grow)]] and
-- [[:Category:Terms derived from the Proto-Indo-European word *swé]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(handlers, function(data)
local source_name, term_type, term_and_id
for _, tt in ipairs{"root", "word", "term"} do
source_name, term_and_id = data.label:match("^terms derived from the (.+) " .. tt .. " (.+)$")
if source_name then
term_type = tt
break
end
end
if not source_name then
return
end
local term, id = term_and_id:match("^(.+) %((.-)%)$")
if not term then
term = term_and_id
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {
{
name = "terms by " .. source_name .. " " .. term_type,
sort = (source:makeSortKey(term)),
}
}
local umbrella_parents = {
{
name = "Terms derived from " .. source_name .. " " .. term_type .. "s",
sort = (source:makeSortKey(term)),
}
}
if id then
insert(parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
sort = " "
})
insert(umbrella_parents, {
name = "terms derived from the " .. source_name .. " " .. term_type .. " " .. term,
is_label = true,
sort = " "
})
end
-- Italicize the word/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, term, tag_text(term, source, nil, "term"))
end
local breadcrumb = tag_text(term, source, nil, "term") .. (id and " (" .. id .. ")" or "")
local term_page, alt_form, term_tr
if term_type == "root" then
assert_valid_root(source, term)
local rdata = get_root_data(source)
term_tr = root_translit(rdata, term)
if lang_uses_appendix_roots(source) then
term_page = ("Appendix:%s roots/%s"):format(source:getCanonicalName(), term)
alt_form = term
end
end
term_page = term_page or term
return {
description = "{{{langname}}} terms that originate ultimately from the " .. get_source_and_type_desc(source, term_type) .. " " .. full_link({
term = term_page,
alt = alt_form,
tr = term_tr,
lang = source,
gloss = id,
id = id
}, "term") .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
no_by_language = true,
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = umbrella_parents,
}
}
end)
insert(handlers, function(data)
local labelpref, root_and_id = data.label:match("^(terms belonging to the root )(.+)$")
if not root_and_id then
return
end
local root, id = root_and_id:match("^(.+) %((.-)%)$")
if not root then
root = root_and_id
end
local is_semitic = data.lang:inFamily("sem")
local root_desc = is_semitic and "[[w:Semitic root|root]]" or "root"
local parents = {}
if id then
insert(parents, {name = labelpref .. root, sort = id})
end
insert(parents, {name = "terms by root", sort = root_and_id})
if data.lang then
assert_valid_root(data.lang, root)
end
local rdata = get_root_data(data.lang)
local separators = rdata and rdata.separator and pattern_escape(rdata.separator) or "־ %-"
local separator_c = "[" .. separators .. "]"
local not_separator_c = "[^" .. separators .. "]"
-- remove any leading or trailing separators (e.g. in PIE-style roots)
local root_no_prefix_suffix =
mw.ustring.gsub(mw.ustring.gsub(root, separator_c .. "$", ""), "^" .. separator_c, "")
local num_sep = mw.ustring.len(mw.ustring.gsub(root_no_prefix_suffix, not_separator_c, ""))
local root_page, alt_form
if lang_uses_appendix_roots(data.lang) then
root_page = ("Appendix:%s roots/%s"):format(data.lang:getCanonicalName(), root)
alt_form = root
else
root_page = root
end
local linked_root = data.lang and full_link(
{
term = root_page,
alt = alt_form,
tr = root_translit(rdata, root),
lang = data.lang,
gloss = id,
id = id,
}, "term") or root_page
if num_sep > 0 then
insert(parents, {name = "" .. (num_sep + 1) .. "-letter roots", sort = root_and_id})
end
-- Italicize the root/word in the title.
local function displaytitle(title, lang)
return plain_gsub(title, root, tag_text(root, lang, nil, "term"))
end
local breadcrumb = tag_text(root, data.lang, nil, "term") .. (id and " (" .. id .. ")" or "")
return {
description = "{{{langname}}} terms that belong to the " .. root_desc .. " " .. linked_root .. ".",
displaytitle = displaytitle,
breadcrumb = breadcrumb,
parents = parents,
umbrella = false,
}
end)
insert(handlers, function(data)
local source_name = data.label:match("^terms by (.+) root$")
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
local parents = {"terms by etymology"}
-- In [[:Category:Proto-Indo-Iranian terms by Proto-Indo-Iranian root]],
-- don't add parent [[:Category:Proto-Indo-Iranian terms derived from Proto-Indo-Iranian]].
if not data.lang or data.lang:getCode() ~= source:getCode() then
insert(parents, "terms derived from " .. source_name)
end
return {
description = "{{{langname}}} terms categorized by the " .. get_source_and_type_desc(source, "root") .. " they originate from.",
parents = parents,
umbrella_parents = "Terms by etymology subcategories by language",
}
end)
insert(handlers, function(data)
local root_shape, post, additional = data.label:match("^(.+)([ -])shaped roots$")
if not root_shape then
return
elseif data.lang and data.lang:getCode() == "ine-pro" then
additional = [=[
* '''e''' stands for the vowel of the root.
* '''C''' stands for any stop or ''s''.
* '''R''' stands for any resonant.
* '''H''' stands for any laryngeal.
* '''M''' stands for ''m'' or ''w'', when followed by a resonant.
* '''s''' stands for ''s'', when next to a stop.]=]
end
if root_shape == "irregularly" and post == " " then
return {
breadcrumb = "irregular",
description = "{{{langname}}} roots with a shape that violates the {{w|Proto-Indo-European root#Shape of a root|known rules on root shapes}}.",
additional = additional,
parents = {{name = "roots by shape", sort = "*"}},
umbrella = false,
}
elseif post == " " then
return
end
return {
breadcrumb = root_shape,
description = "{{{langname}}} roots with the shape ''" .. root_shape .. "''.",
additional = additional,
parents = {{name = "roots by shape", sort = root_shape}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
-------------------- Derived/inherited/borrowed handlers --------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form "LANG terms derived from SOURCE", where SOURCE is a language, etymology language
-- or family (e.g. "Indo-European languages"), along with corresponding umbrella categories of the form
-- "Terms derived from SOURCE".
insert(handlers, function(data)
local source_name = data.label:match("^terms derived from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- Compute description.
local desc = "{{{langname}}} terms that originate from " .. source_desc .. "."
local additional
if source:hasType("family") then
additional = "This category should, ideally, contain only other categories. Entries can be categorized here, too, when the proper subcategory is unclear. " ..
"If you know the exact language from which an entry categorized here is derived, please edit its respective entry."
end
-- Compute parents.
local derived_from_variety_of_self = false
local parent
local sortkey = source:getDisplayForm()
if source:hasType("etymology-only") then
-- By default, `parent` is the source's parent.
parent = source:getParent()
-- Check if the source is a variety (or subvariety) of the language.
if data.lang and source:hasParent(data.lang) then
derived_from_variety_of_self = true
end
-- If the language is the direct parent of the source or the parent is "und", then we use the family of the source as `parent` instead.
if data.lang and (parent:getCode() == data.lang:getCode() or parent:getCode() == "und") then
parent = source:getFamily()
end
-- Regular language or family.
else
local fam = source:getFamily()
if fam then
parent = fam
end
end
-- If `parent` does not exist, is the same as `source`, or would be "isolate languages" or "not a family", then we discard it.
if (not parent) or parent:getCode() == source:getCode() or parent:getCode() == "qfa-iso" or parent:getCode() == "qfa-not" or
parent:getCode() == "qfa-unc" then
parent = nil
derived_from_variety_of_self = false
-- Otherwise, get the display form.
else
parent = parent:getDisplayForm()
end
parent = parent and "terms derived from " .. parent or "terms derived from other languages"
local parents = {{name = parent, sort = sortkey}}
if derived_from_variety_of_self then
insert(parents, "Category:Categories for terms in a language derived from a term in a subvariety of that language")
end
-- Compute umbrella parents.
local cat_name = source:getCode() == "mul-tax" and "Taxonomic names" or source:getCategoryName()
-- If the source is etymology-only, its category will be handled by the lect handler in
-- [[Module:category tree/lects]]. If it has a nonstandard name like 'Kölsch' (i.e. not a name like
-- 'American English' that has a language name in it), the lect handler won't handle it unless we tell it to do so
-- through the following call; this is an optimization to avoid expensive processing work on all manner of randomly
-- named categories.
if source:hasType("etymology-only") then
require("Module:category tree/lects").export.register_likely_lect_parent_cat(cat_name)
end
local umbrella_parents = {
(source:hasType("family") or source:getCode() == "mul-tax") and {name = cat_name, raw = true, sort = " "} or
{name = cat_name, raw = true, sort = "terms derived from"}
}
-- Without the following, the breadcrumb trail for e.g. [[Category:Javanese terms derived from French]] looks like
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages »
-- Indo-European languages » Italic languages » Romance languages » Italo-Western Romance languages »
-- Western Romance languages » Gallo-Romance languages » Gallo-Rhaetian languages » Oïl languages » French
-- To reduce the length, we truncate the "languages" part of the breadcrumbs as long as this does not create
-- ambiguity (i.e. unless there is a language with the same name as the family). Hence, for the Category
-- [[Category:Javanese terms derived from Arabic]], we end up with
-- Fundamental » All languages » Javanese » Terms by etymology » Terms derived from other languages » Afroasiatic »
-- Semitic » West Semitic » Central Semitic » Arabic languages » Arabic
-- because "Arabic" is ambiguous between family and language (and script, for that matter).
local breadcrumb = source_name
if source:hasType("family") and breadcrumb:find(" languages$") then
local truncated_breadcrumb = breadcrumb:gsub(" languages$", "")
if not get_lang_by_name(truncated_breadcrumb, nil, "allow etym") then
breadcrumb = truncated_breadcrumb
end
end
return {
description = desc,
additional = additional,
breadcrumb = breadcrumb,
parents = parents,
umbrella = {
description = "Categories with terms that originate from " .. source_desc .. ".",
parents = umbrella_parents,
},
}
end)
-- Handler for categories of the form "LANG terms inherited/borrowed from SOURCE", where SOURCE is a language,
-- etymology language or family (e.g. "Indo-European languages"). Also handles umbrella categories of the form
-- "Terms inherited/borrowed from SOURCE".
local function inherited_borrowed_handler(etymtype)
return function(data)
local source_name = data.label:match("^terms " .. etymtype .. " from (.+)$")
if not source_name then
return
end
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
return {
description = "{{{langname}}} terms " .. etymtype .. " from " .. source_desc .. ".",
breadcrumb = source_name,
parents = {
{name = etymtype .. " terms", sort = source_name},
{name = "terms derived from " .. source_name, sort = " "},
},
umbrella = {
parents = {
{ name = "terms derived from " .. source_name, is_label = true, sort = " " },
etymtype == "inherited" and
{ name = "Inherited terms subcategories by language", sort = source_name }
-- There are several types of borrowings mixed into the following holding category,
-- so keep these ones sorted under 'Terms borrowed from SOURCE_NAME' instead of just
-- 'SOURCE_NAME'.
or "Borrowed terms subcategories by language",
}
},
}
end
end
insert(handlers, inherited_borrowed_handler("borrowed"))
insert(handlers, inherited_borrowed_handler("inherited"))
-----------------------------------------------------------------------------
------------------------ Borrowing subtype handlers -------------------------
-----------------------------------------------------------------------------
-- General handler for specific borrowing subtypes, such as learned borrowings, calques and phono-semantic matchings.
local function borrowing_subtype_handler(dest, source_name, parent_cat, spec)
local source, source_desc = get_source_and_source_desc(source_name)
if not source then
return
end
-- normally uses of UNKNOWN should not show up to the end user
local dest_name = dest and dest:getCanonicalName() or "UNKNOWN"
local additional, umbrella_additional
if spec.additional then
if dest then
additional = spec.additional(source, dest)
else
umbrella_additional = spec.umbrella_additional(source)
end
else
if not spec.categorizing_templates then
error("Internal error: Must specify either `categorizing_templates` or the combination of `additional` and `umbrella_additional` in each borrowing subtype spec")
end
local extra_templates = {}
local extra_template_text
for i, template in ipairs(spec.categorizing_templates) do
if i > 1 then
insert(extra_templates, ("{{tl|%s|...}}"):format(template))
end
end
if #extra_templates > 0 then
extra_template_text = (" (or %s, using the same syntax)"):format(
serial_comma_join(extra_templates, {conj = "or"}))
else
extra_template_text = ""
end
if dest then
additional = ("To categorize a term into this category, use {{tl|%s|%s|%s|<var>source_term</var>}}%s, " ..
"where <code><var>source_term</var></code> is the %s term that the term in question " ..
"was borrowed from."):format(
spec.categorizing_templates[1], dest:getCode(), source:getCode(), extra_template_text, source_name)
else
umbrella_additional = ("To categorize a term into a language-specific subcategory, use " ..
"{{tl|%s|<var>destcode</var>|%s|<var>source_term</var>}}%s, where <code><var>destcode</var></code> " ..
"is the language code of the language in question (see [[Wiktionary:List of languages]]), and " ..
"<code><var>source_term</var></code> is the %s term that the term in question was " ..
"borrowed from."):format(spec.categorizing_templates[1], source:getCode(), extra_template_text, source_name)
end
end
return {
description = "{{{langname}}} " .. spec.from_source_desc:gsub("SOURCE", source_desc):gsub("DEST", dest_name),
additional = additional,
breadcrumb = source_name,
parents = {
{ name = parent_cat, sort = source_name },
{ name = "terms borrowed from " .. source_name, sort = " " },
},
umbrella = {
additional = umbrella_additional,
parents = {
{ name = "terms borrowed from " .. source_name, is_label = true, sort = " " },
"Borrowed terms subcategories by language",
}
},
}
end
-- Specs describing types of borrowings.
-- `from_source_desc` is the English description used in categories of the form "LANGUAGE BORTYPE from SOURCE",
-- e.g. "Arabic semantic loans from English". "SOURCE" in the description is replaced by the source language.
-- `umbrella_desc` is the English description used in categories of the form "LANGUAGE BORTYPE", e.g.
-- "Arabic semantic loans". This is an umbrella category grouping all the source-language-specific categories.
-- `uses_subtype_handler`, if true, means that the handler for "LANGUAGE BORTYPE from SOURCE" categories is
-- implemented by a generic "TYPE borrowings" handler (at the bottom of this section), so we don't need to
-- create a BORTYPE-specific handler.
-- `umbrella_parent`, if given, is the parent category of the umbrella categories of the form "LANGUAGE BORTYPE".
-- By default it is "borrowed terms". Some borrowing types replace this with "terms by etymology". (FIXME:
-- Review whether this is correct.)
-- `label_pattern`, if given, is a Lua pattern that matches the category name minus the language at the beginning.
-- It should have one capture, which is the source language. An example is "^terms partially calqued from (.+)$".
-- If omitted, it is generated from BORTYPE.
-- `categorizing_templates`, if given, is the list of templates that categorize into this category. They are assumed to
-- follow the syntax of {{bor}}. The first template in the list should be the preferred alias. The specified
-- templates are used to form the `additional` text displayed on the language-specific category page and
-- corresponding umbrella category page describing how to categorize into the category in question. In more complex
-- cases, you can omit this field and instead supply the `additional` and `umbrella_additional` fields (as is done
-- with adapted borrowings). You must either specify `categorizing_templates` or the combination of `additional` and
-- `umbrella_additional`.
-- `additional`, if given, is a function of two arguments (source and destination language objects) that will generate
-- the `additional` text displayed on the language-specific category page that describes how to categorize into the
-- category in question. This is an alternative to specifying `categorizing_templates`, used in more complex cases
-- (currently, with adapted borrowings).
-- `umbrella_additional`, if given, is a function of one argument (source language object) that will generate the
-- `additional` text displayed on the umbrella category page that describes how to categorize into the category in
-- question. This is an alternative to specifying `categorizing_templates`, used in more complex cases (currently,
-- with adapted borrowings).
local borrowing_specs = {
["learned borrowings"] = {
from_source_desc = "terms that are learned [[loanword]]s from SOURCE, that is, terms that were directly incorporated from SOURCE instead of through normal language contact.",
umbrella_desc = "terms that are learned [[loanword]]s, that is, terms that were directly incorporated from another language instead of through normal language contact.",
uses_subtype_handler = true,
categorizing_templates = {"lbor", "learned borrowing"},
},
["semi-learned borrowings"] = {
from_source_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s from SOURCE, that is, terms borrowed from SOURCE (a [[classical language]]) into DEST (a modern language) and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
umbrella_desc = "terms that are [[semi-learned borrowing|semi-learned]] [[loanword]]s, that is, terms borrowed from a [[classical language]] into a modern language and partly reshaped based on later [[sound change]]s or by analogy with [[inherit]]ed terms in the language.",
uses_subtype_handler = true,
categorizing_templates = {"slbor", "semi-learned borrowing"},
},
["orthographic borrowings"] = {
from_source_desc = "orthographic loans from SOURCE, i.e. terms that were borrowed from SOURCE in their script forms, not their pronunciations.",
umbrella_desc = "orthographic loans, i.e. terms that were borrowed in their script forms, not their pronunciations.",
uses_subtype_handler = true,
categorizing_templates = {"obor", "orthographic borrowing"},
},
["unadapted borrowings"] = {
from_source_desc = "[[loanword]]s from SOURCE that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of DEST.",
umbrella_desc = "[[loanword]]s that have not been conformed to the morpho-syntactic, phonological and/or phonotactical rules of the target language.",
uses_subtype_handler = true,
categorizing_templates = {"ubor", "unadapted borrowing"},
},
["adapted borrowings"] = {
from_source_desc = "[[loanwords]] from SOURCE formed with the addition of an affix to conform the term to the normal morphology of DEST.",
umbrella_desc = "[[loanword]]s formed with the addition of an affix to conform the term to the normal morphology of the target language.",
uses_subtype_handler = true,
additional = function(source, dest)
return ("To categorize a term into this category, use {{tl|af|%s|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|%s|3=type=abor|4=...}}, using the same syntax), where <code><var>source_term</var></code> is " ..
"the %s term that the term in question was borrowed from and <code><var>affix</var></code> " ..
"is the %s affix used to adapt the %s term. An example is " ..
"{{m+|pl|adresować||to address}}, which would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate " ..
"that is was formed from {{m+|fr|adresser}} with the addition of the Polish verb-forming affix " ..
"{{m|pl|-ować}}."):format(dest:getCode(), source:getCode(), dest:getCode(), source:getCanonicalName(), dest:getCanonicalName(),
source:getCanonicalName())
end,
umbrella_additional = function(source)
return ("To categorize a term into a language-specific subcategory, use {{tl|af|<var>destcode</var>|3=type=adap|4=%s:<var>source_term</var>|5=-<var>affix</var>}} " ..
"(or {{tl|af|<var>destcode</var>|3=type=abor|4=...}}, using the same syntax), where " ..
"<code><var>destcode</var></code> is the language code of the target language in question (see " ..
"[[Wiktionary:List of languages]]); <code><var>source_term</var></code> is the %s term " ..
"that the term in question was borrowed from; and <code><var>affix</var></code> is the target-language " ..
"affix used to adapt the %s term. An example is {{m+|pl|adresować||to address}}, which " ..
"would use {{tl|af|pl|3=type=adap|4=fr:adresser|5=-ować}} to indicate that is was formed from " ..
"{{m+|fr|adresser}} with the addition of the Polish verb-forming affix {{m|pl|-ować}}."):format(
source:getCode(), source:getCanonicalName(), source:getCanonicalName())
end,
},
["semantic loans"] = {
from_source_desc = "[[Appendix:Glossary#semantic loan|semantic loans]] from SOURCE, i.e. terms one or more of whose definitions was borrowed from a term in SOURCE.",
umbrella_desc = "[[Appendix:Glossary#semantic loan|semantic loans]], i.e. terms one or more of whose definitions was borrowed from a term in another language.",
umbrella_parent = "terms by etymology",
categorizing_templates = {"sl", "semantic loan"},
},
["partial calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#partial calque|partially calqued]] from SOURCE, i.e. terms formed partly by piece-by-piece translations of SOURCE terms and partly by direct borrowing.",
umbrella_desc = "[[Appendix:Glossary#partial calque|partial calques]], i.e. terms formed partly by piece-by-piece translations of terms from other languages and partly by direct borrowing.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms partially calqued from (.+)$",
categorizing_templates = {"pcal", "pclq", "partial calque"},
},
["calques"] = {
from_source_desc = "terms that were [[Appendix:Glossary#calque|calqued]] from SOURCE, i.e. terms formed by piece-by-piece translations of SOURCE terms.",
umbrella_desc = "[[Appendix:Glossary#calque|calques]], i.e. terms formed by piece-by-piece translations of terms from other languages.",
umbrella_parent = "terms by etymology",
label_pattern = "^terms calqued from (.+)$",
categorizing_templates = {"cal", "clq", "calque"},
},
["phono-semantic matchings"] = {
from_source_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]] from SOURCE, i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
umbrella_desc = "[[Appendix:Glossary#phono-semantic matching|phono-semantic matchings]], i.e. terms that were borrowed by matching the etymon phonetically and semantically.",
categorizing_templates = {"psm", "phono-semantic matching"},
},
["pseudo-loans"] = {
from_source_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]] from SOURCE, i.e. terms that appear to be SOURCE, but are not used or have an unrelated meaning in SOURCE itself.",
umbrella_desc = "[[Appendix:Glossary#pseudo-loan|pseudo-loans]], i.e. terms that appear to be derived from another language, but are not used or have an unrelated meaning in that language itself.",
categorizing_templates = {"pl", "pseudo-loan"},
},
}
for bortype, spec in pairs(borrowing_specs) do
labels[bortype] = {
description = "{{{langname}}} " .. spec.umbrella_desc,
parents = {spec.umbrella_parent or "borrowed terms"},
umbrella_parents = "Terms by etymology subcategories by language",
}
if not spec.uses_subtype_handler then
-- If the label pattern isn't specifically given, generate it from the `bortype`; but make sure to
-- escape hyphens in the pattern.
local label_pattern = spec.label_pattern or "^" .. pattern_escape(bortype) .. " from (.+)$"
insert(handlers, function(data)
local source_name = data.label:match(label_pattern)
if source_name then
return borrowing_subtype_handler(data.lang, source_name, bortype, spec)
end
end)
end
end
insert(handlers, function(data)
local borrowing_type, source_name = data.label:match("^(.+ borrowings) from (.+)$")
if borrowing_type then
local spec = borrowing_specs[borrowing_type]
return borrowing_subtype_handler(data.lang, source_name, borrowing_type, spec)
end
end)
-----------------------------------------------------------------------------
---------------------- Indo-Aryan extension handlers ------------------------
-----------------------------------------------------------------------------
-- FIXME: Put this in a family-specific module.
insert(handlers, function(data)
local labelpref, extension = data.label:match("^(terms extended with Indo%-Aryan )(.+)$")
if not extension then
return
end
local lang_inc_ash = require("Module:languages").getByCode("inc-ash")
local linked_term = full_link({lang = lang_inc_ash, term = extension}, "term")
local tagged_term = tag_text(extension, lang_inc_ash, nil, "term")
return {
description = "{{{langname}}} terms extended with the [[Indo-Aryan]] [[pleonastic]] affix " .. linked_term .. ".",
displaytitle = "{{{langname}}} " .. labelpref .. tagged_term,
breadcrumb = tagged_term,
parents = {{name = "terms with Indo-Aryan extensions", sort = extension}},
umbrella = {
no_by_language = true,
parents = "Indo-Aryan extensions",
displaytitle = "Terms extended with Indo-Aryan " .. tagged_term,
}
}
end)
-----------------------------------------------------------------------------
---------------------------- Coined-by handlers -----------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local coiner = data.label:match("^terms coined by (.+)$")
if not coiner then
return
end
-- Sort by last name per request from [[User:Metaknowledge]]
local last_name = umatch(coiner, ".-%s(%S+)$")
return {
description = "{{{langname}}} terms coined by " .. coiner .. ".",
breadcrumb = coiner,
parents = {{
name = "coinages",
sort = last_name and last_name .. ", " .. coiner or coiner,
}},
umbrella = false,
}
end)
-----------------------------------------------------------------------------
------------------------ Multiple etymology handlers ------------------------
-----------------------------------------------------------------------------
insert(handlers, function(data)
local pos = data.label:match("^terms with multiple (.+) etymologies$")
if not pos then
return
end
local plpos = pluralize_pos(pos)
local postype = pos_lemma_or_nonlemma(plpos)
if not postype then
return
end
return {
description = "{{{langname}}} " .. plpos .. " that are derived from multiple origins.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = "multiple " .. plpos,
parents = {{
name = "terms with multiple " .. postype .. " etymologies",
sort = pos,
}},
}
end)
insert(handlers, function(data)
local pos1, pos2 = data.label:match("^terms with (.+) and (.+) etymologies$")
if not pos1 then
return
end
local pos1type = pos_lemma_or_nonlemma(pluralize_pos(pos1))
local pos2type = pos_lemma_or_nonlemma(pluralize_pos(pos2))
if not (pos1type and pos2type) then
return
end
return {
description = "{{{langname}}} terms consisting of " .. add_indefinite_article(pos1) .." of one origin and " ..
add_indefinite_article(pos2) .. " of a different origin.",
umbrella_parents = "Multiple etymology subcategories by language",
breadcrumb = pos1 .. " and " .. pos2,
parents = {{
name = pos1type == pos2type and "terms with multiple " .. pos1type .. " etymologies" or
"terms with lemma and non-lemma form etymologies",
sort = pos1 .. " and " .. pos2,
}},
}
end)
-----------------------------------------------------------------------------
--------------------------- Borrowed-back handlers --------------------------
-----------------------------------------------------------------------------
-- Handler for categories of the form e.g. [[:Category:English terms borrowed back into English]]. We need to use a handler
-- because the category's language occurs inside the label itself. For the same reason, the umbrella category has a
-- nonstandard name "Terms borrowed back into the same language", so we handle it as a regular parent and disable the
-- built-in umbrella mechanism.
insert(handlers, function(data)
local lang = data.lang
if not lang then
return
end
local source_name = data.label:match("^terms borrowed back into (.+)$")
if not (source_name and source_name == lang:getDisplayForm()) then
return
end
return {
description = "{{{langname}}} terms that were borrowed from another language that originally borrowed the term from " .. source_name .. ".",
parents = {"terms by etymology", "borrowed terms", {
name = "Terms borrowed back into the same language",
raw = true,
sort = "{{{langname}}}"
}},
umbrella = false, -- Umbrella has a nonstandard name so we treat it as a raw category
}
end)
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for umbrella metacategories of the form e.g. [[:Category:Terms derived from Proto-Indo-Iranian roots]]
-- and [[:Category:Terms derived from Proto-Indo-European words]]. Replaces the former
-- [[Module:category tree/PIE root cat]], [[Module:category tree/root cat]] and [[Template:PIE word cat]].
insert(raw_handlers, function(data)
local source_name, terms_type
for _, tt in ipairs{"roots", "words", "terms"} do
source_name = data.category:match("^Terms derived from (.+) " .. tt .. "$")
if source_name then
terms_type = tt
break
end
end
if not source_name then
return
end
local source = get_source(source_name, false, "getCanonicalName")
if not source then
return
end
return {
description = "Umbrella categories covering terms derived from particular " .. get_source_and_type_desc(source, terms_type) .. ".",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{ name = terms_type == "roots" and "roots" or "lemmas", is_label = true, lang = source:getCode(), sort = " " },
{ name = "terms derived from " .. source_name, is_label = true, sort = " " .. terms_type },
},
}
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers, RAW_HANDLERS = raw_handlers}
ovuk2ym75trp1uty87zwvqzjehpta9e
मॉड्यूल:category tree/etymology
828
306960
487811
2026-09-02T19:13:37Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/etymology]] को [[मॉड्यूल:category tree/व्युत्पत्ति]] पर स्थानांतरित किया
487811
Scribunto
text/plain
return require [[मॉड्यूल:category tree/व्युत्पत्ति]]
06b4mrqdlmnssmtldmolsfs84wbhrxo
मॉड्यूल:category tree/families
828
306961
487813
2026-09-02T19:15:06Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/families]] को [[मॉड्यूल:category tree/परिवार]] पर स्थानांतरित किया
487813
Scribunto
text/plain
return require [[मॉड्यूल:category tree/परिवार]]
n2mfug66h11588kmv7abh4mplggry84
मॉड्यूल:category tree/भाषाएँ
828
306962
487815
2026-09-02T19:20:50Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित+ अल्पस्थानीयकृत
487815
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["सभी भाषाएँ"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"मूलभूत श्रेणी",
},
}
raw_categories["All extinct languages"] = {
description = "Categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"सभी भाषाएँ",
},
}
raw_categories["Unwritten languages"] = {
description = "Categories for every [[unwritten]] [[language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Unspecified script languages]], which contains categories for languages that may be written but where the appropriate script has not yet been specified in the language data.",
parents = {
"सभी भाषाएँ",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"All languages",
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page
-- defining the category, find the call to {{auto cat}} (if any),
-- and return a table of its arguments. If the category page doesn't exist
-- or doesn't have an {{auto cat}} invocation, return nil.
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and
-- canonicalizes them.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
local location_link = concat(bare_location_parts, ", ")
if location_no_the then location_link = "the " .. location_link end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle(true)
setwiki = not wikipediaArticle and "-"
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then track("setwikt/hyphen") end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(
wikimedialang:getCanonicalName() ~= canonicalName
and "(''" .. wikimedialang:getCanonicalName() .. "'') "
or ""
) .. (
"'''[[:" .. wikimedialang:getCode()
.. ":|" .. wikimedialang:getCode()
.. ".wiktionary.org]]'''"
)
)
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
-- Avoid showing Wiktionary links section for reconstructed languages,
-- as they are ineligible for Wiktionary editions
local wiktionarylinks_chunk = concat{
[=[|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
]=]}
if lang:hasType('reconstructed') then
wiktionarylinks_chunk = ''
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{ -- FIXME: Bare wikicode
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
]=], wiktionarylinks_chunk, [=[
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-placeholder (v2.6).svg|35px|none|Entry]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-placeholder (v2.6).svg|35px|none|Resources]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
</div>
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Other names</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Aliases</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, (
"<li><dl><dt>"
.. first_var .. "</dt>\n<dd><ul>"
.. concat(subvars, "\n")
.. "</ul></dd></dl></li>"
)
)
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Varieties</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
insert(ret, (
"<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>"
.. lang:getCode()
.. "</code></td>\n</tr>\n"
)
)
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>[[:Category:Unassigned languages|unassigned]]</td>")
elseif famCode == "qfa-dis" then
insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "qfa-unc" then
insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
local sc_catlink
if code == "Zxxx" then
sc_catlink = "[[:Category:Unwritten languages|unwritten]]"
else
sc_catlink = sc:makeCategoryLink(lang)
end
return sc_catlink
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[[d:' .. wikidataItem .. '|' .. wikidataItem .. ']]'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken",
prep, location_link_text
)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines"
local entry_guidelines = new_title(entry_guidelines_page)
if entry_guidelines.exists then
add = add .. "\n\n" ..
"Please see '''[[" .. entry_guidelines_page .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame_for_family_tree(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "en"}
local ret = {{name = "All languages", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unassigned languages", sort = sortkey})
elseif famCode == "qfa-dis" then
insert(ret, {name = "Category:Languages of disputed affiliation", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "qfa-unc" then
insert(ret, {name = "Category:Unclassifiable languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- 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.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "श्रेणी:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "श्रेणी:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
local catname
if sc:getCode() == "Zxxx" then
catname = "Unwritten languages"
else
catname = sc:getCategoryName(false, lang) .. " भाषाएँ"
end
insert(ret, {name = "श्रेणी:" .. catname, sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
insert(ret, {name = "Varieties of {{{langname}}}"})
insert(ret, {name = "Requests concerning {{{langname}}}"})
insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:find("[Ll]anguage$") or category:find("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^(.*) भाषाएँ$")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "श्रेणी:" .. locationcat, sort = " भाषाएँ"})
end
else
local location_cat = ("श्रेणी:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "भाषाएँ"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
ltzxlammj6zoj8zwoc0pe25y12a351k
487816
487815
2026-09-02T19:21:13Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/languages]] को [[मॉड्यूल:category tree/भाषाएँ]] पर स्थानांतरित किया
487815
Scribunto
text/plain
local new_title = mw.title.new
local ucfirst = require("Module:string utilities").ucfirst
local split = require("Module:string utilities").split
local raw_categories = {}
local raw_handlers = {}
local m_languages = require("Module:languages")
local m_sc_getByCode = require("Module:scripts").getByCode
local m_table = require("Module:table")
local parse_utilities_module = "Module:parse utilities"
local concat = table.concat
local insert = table.insert
local reverse_ipairs = m_table.reverseIpairs
local serial_comma_join = m_table.serialCommaJoin
local size = m_table.size
local sorted_pairs = m_table.sortedPairs
local to_json = require("Module:JSON").toJSON
local Hang = m_sc_getByCode("Hang")
local Hani = m_sc_getByCode("Hani")
local Hira = m_sc_getByCode("Hira")
local Hrkt = m_sc_getByCode("Hrkt")
local Kana = m_sc_getByCode("Kana")
local function track(page)
-- [[Special:WhatLinksHere/Wiktionary:Tracking/category tree/languages/PAGE]]
return require("Module:debug/track")("category tree/languages/" .. page)
end
-- This handles language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]]; categories like [[:Category:Languages of Indonesia]]; categories like
-- [[:Category:English-based creole or pidgin languages]]; and categories like
-- [[:Category:English-based constructed languages]].
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["सभी भाषाएँ"] = {
topright = "{{commonscat|Languages}}\n[[File:Languages world map-transparent background.svg|thumb|right|250px|Rough world map of language families]]",
description = "This category contains the categories for every language on Wiktionary.",
additional = "Not all languages that Wiktionary recognises may have a category here yet. There are many that have " ..
"not yet received any attention from editors, mainly because not all Wiktionary users know about every single " ..
"language. See [[Wiktionary:List of languages]] for a full list.",
parents = {
"मूलभूत श्रेणी",
},
}
raw_categories["All extinct languages"] = {
description = "Categories for every [[extinct language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Extinct languages]], which is an umbrella category for the names of extinct languages in specific other languages (e.g. {{m+|de|Langobardisch}} for the ancient [[Lombardic]] language).",
parents = {
"सभी भाषाएँ",
},
}
raw_categories["Unwritten languages"] = {
description = "Categories for every [[unwritten]] [[language]] on Wiktionary.",
additional = "Do not confuse this category with [[:Category:Unspecified script languages]], which contains categories for languages that may be written but where the appropriate script has not yet been specified in the language data.",
parents = {
"सभी भाषाएँ",
},
}
raw_categories["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"All languages",
},
}
raw_categories["Languages not sorted into a location category"] = {
description = "Languages which do not specify (in their {{tl|auto cat}} call) the location(s) where they are spoken.",
additional = "This excludes constructed and reconstructed languages; as a result, all languages in this category explicitly specify their location as {{cd|UNKNOWN}}.",
parents = {
{name = "Requests"},
},
hidden = true,
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Given a category (without the "Category:" prefix), look up the page
-- defining the category, find the call to {{auto cat}} (if any),
-- and return a table of its arguments. If the category page doesn't exist
-- or doesn't have an {{auto cat}} invocation, return nil.
-- FIXME: Duplicated in [[Module:category tree/lects]].
local function scrape_category_for_auto_cat_args(cat)
local cat_page = mw.title.new("Category:" .. cat)
if cat_page then
local contents = cat_page:getContent()
if contents then
for template in require("Module:template parser").find_templates(contents) do
-- The template parser automatically handles redirects and
-- canonicalizes them.
if template:get_name() == "auto cat" then
return template:get_arguments()
end
end
end
end
return nil
end
local function link_location(location)
local location_no_the = location:match("^the (.*)$")
local bare_location = location_no_the or location
local bare_location_parts = split(bare_location, ", ")
for i, part in ipairs(bare_location_parts) do
bare_location_parts[i] = ("[[%s]]"):format(part)
end
local location_link = concat(bare_location_parts, ", ")
if location_no_the then location_link = "the " .. location_link end
return location_link
end
local function linkbox(lang, setwiki, setwikt, setsister, entryname)
local wiktionarylinks = {}
local canonicalName = lang:getCanonicalName()
local wikimediaLanguages = lang:getWikimediaLanguages()
local wikipediaArticle = setwiki or lang:getWikipediaArticle(true)
setwiki = not wikipediaArticle and "-"
setsister = setsister and ucfirst(setsister) or nil
if setwikt then
track("setwikt")
if setwikt == "-" then track("setwikt/hyphen") end
end
if setwikt ~= "-" and wikimediaLanguages and wikimediaLanguages[1] then
for _, wikimedialang in ipairs(wikimediaLanguages) do
local check = new_title(wikimedialang:getCode() .. ":")
if check and check.isExternal then
insert(wiktionarylinks,
(
wikimedialang:getCanonicalName() ~= canonicalName
and "(''" .. wikimedialang:getCanonicalName() .. "'') "
or ""
) .. (
"'''[[:" .. wikimedialang:getCode()
.. ":|" .. wikimedialang:getCode()
.. ".wiktionary.org]]'''"
)
)
end
end
wiktionarylinks = concat(wiktionarylinks, "<br/>")
end
local wikt_plural = wikimediaLanguages[2] and "s" or ""
if #wiktionarylinks == 0 then
wiktionarylinks = "''None.''"
end
-- Avoid showing Wiktionary links section for reconstructed languages,
-- as they are ineligible for Wiktionary editions
local wiktionarylinks_chunk = concat{
[=[|-
| style="vertical-align: top; height: 35px; width: 40px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wiktionary-logo-v2.svg|35px|none|Wiktionary]]
|style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary edition''']=], wikt_plural, [=[ written in ]=], canonicalName, [=[:
<div style="padding: 5px 10px">]=], wiktionarylinks, [=[</div>
]=]}
if lang:hasType('reconstructed') then
wiktionarylinks_chunk = ''
end
if setsister then
track("setsister")
if setsister == "-" then
track("setsister/hyphen")
else
setsister = "Category:" .. setsister
end
else
setsister = lang:getCommonsCategory() or "-"
end
return concat{ -- FIXME: Bare wikicode
[=[<div class="wikitable" style="float: right; clear: right; margin: 0 0 0.5em 1em; width: 300px; padding: 5px;">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">''']=], canonicalName, [=[ language links'''</div>
{| style="font-size: 90%"
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''English Wikipedia''' has an article on:
<div style="padding: 5px 10px">]=], (setwiki == "-" and "''None.''" or "'''[[w:" .. wikipediaArticle .. "|" .. wikipediaArticle .. "]]'''"), [=[</div>
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Commons-logo.svg|35px|none|Wikimedia Commons]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wikimedia Commons''' has links to ]=], canonicalName, [=[-related content in sister projects:
<div style="padding: 5px 10px">]=], (setsister == "-" and "''None.''" or "'''[[commons:" .. setsister .. "|" .. setsister .. "]]'''"), [=[</div>
]=], wiktionarylinks_chunk, [=[
|-
| style="vertical-align: top; height: 35px; border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | [[File:Codex icon articles color-placeholder (v2.6).svg|35px|none|Entry]]
| style="border-bottom: 1px solid var(--wikt-palette-grey-4, lightgray);" | '''Wiktionary entry''' for the language's English name:
<div style="padding: 5px 10px">''']=], require("Module:links").full_link({lang = m_languages.getByCode("en"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-placeholder (v2.6).svg|35px|none|Resources]]
|| '''Wiktionary resources''' for editors contributing to ]=], canonicalName, [=[ entries:
<div style="padding: 5px 0">
* '''[[Wiktionary:]=], canonicalName, [=[ entry guidelines]]'''
* '''[[:Category:]=], canonicalName, [=[ reference templates|Reference templates]] ({{PAGESINCAT:]=], canonicalName, [=[ reference templates}})'''
* '''[[Appendix:]=], canonicalName, [=[ bibliography|Bibliography]]'''
</div>
|}
</div>]=]
}
end
local function edit_link(title, text)
return '<span class="plainlinks">['
.. tostring(mw.uri.fullUrl(title, { action = "edit" }))
.. ' ' .. text .. ']</span>'
end
-- Should perhaps use wiki syntax.
local function infobox(lang)
local ret = {}
insert(ret, '<table class="wikitable language-category-info"')
local raw_data = lang:getData("extra")
if raw_data then
local replacements = {
[1] = "canonical-name",
[2] = "wikidata-item",
[3] = "family",
[4] = "scripts",
}
local function replacer(letter1, letter2)
return letter1:lower() .. "-" .. letter2:lower()
end
-- For each key in the language data modules, returns a descriptive
-- kebab-case version (containing ASCII lowercase words separated
-- by hyphens).
local function kebab_case(key)
key = replacements[key] or key
key = key:gsub("(%l)(%u)", replacer):gsub("(%l)_(%l)", replacer)
return key
end
local compress = {compress = true}
local function html_attribute_encode(str)
str = to_json(str, compress)
:gsub('"', """)
-- & in attributes is automatically escaped.
-- :gsub("&", "&")
:gsub("<", "<")
:gsub(">", ">")
return str
end
insert(ret, ' data-code="' .. lang:getCode() .. '"')
for k, v in sorted_pairs(raw_data) do
insert(ret, " data-" .. kebab_case(k)
.. '="'
.. html_attribute_encode(v)
.. '"')
end
end
insert(ret, '>\n')
insert(ret, '<tr class="language-category-data">\n<th colspan="2">'
.. edit_link(lang:getDataModuleName(), "Edit language data")
.. "</th>\n</tr>\n")
insert(ret, "<tr>\n<th>Canonical name</th><td>" .. lang:getCanonicalName() .. "</td>\n</tr>\n")
local otherNames = lang:getOtherNames()
if otherNames then
local names = {}
for _, name in ipairs(otherNames) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Other names</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
local aliases = lang:getAliases()
if aliases then
local names = {}
for _, name in ipairs(aliases) do
insert(names, "<li>" .. name .. "</li>")
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Aliases</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
local varieties = lang:getVarieties()
if varieties then
local names = {}
for _, name in ipairs(varieties) do
if type(name) == "string" then
insert(names, "<li>" .. name .. "</li>")
else
assert(type(name) == "table")
local first_var
local subvars = {}
for i, var in ipairs(name) do
if i == 1 then
first_var = var
else
insert(subvars, "<li>" .. var .. "</li>")
end
end
if #subvars > 0 then
insert(names, (
"<li><dl><dt>"
.. first_var .. "</dt>\n<dd><ul>"
.. concat(subvars, "\n")
.. "</ul></dd></dl></li>"
)
)
elseif first_var then
insert(names, "<li>" .. first_var .. "</li>")
end
end
end
if #names > 0 then
insert(ret, (
"<tr>\n<th>Varieties</th><td><ul>"
.. concat(names, "\n")
.. "</ul></td>\n</tr>\n"
)
)
end
end
insert(ret, (
"<tr>\n<th>[[Wiktionary:Languages|Language code]]</th><td><code>"
.. lang:getCode()
.. "</code></td>\n</tr>\n"
)
)
insert(ret, "<tr>\n<th>[[Wiktionary:Families|Language family]]</th>\n")
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
if not fam then
insert(ret, "<td>[[:Category:Unassigned languages|unassigned]]</td>")
elseif famCode == "qfa-dis" then
insert(ret, "<td>[[:Category:Languages of disputed affiliation|disputed affiliation]]</td>")
elseif famCode == "qfa-iso" then
insert(ret, "<td>[[:Category:Language isolates|language isolate]]</td>")
elseif famCode == "qfa-mix" then
insert(ret, "<td>[[:Category:Mixed languages|mixed language]]</td>")
elseif famCode == "qfa-unc" then
insert(ret, "<td>[[:Category:Unclassifiable languages|unclassifiable language]]</td>")
elseif famCode == "sgn" then
insert(ret, "<td>[[:Category:Sign languages|sign language]]</td>")
elseif famCode == "crp" then
insert(ret, "<td>[[:Category:Creole or pidgin languages|creole or pidgin]]</td>")
elseif famCode == "art" then
insert(ret, "<td>[[:Category:Constructed languages|constructed language]]</td>")
else
insert(ret, "<td>" .. fam:makeCategoryLink() .. "</td>")
end
insert(ret, "\n</tr>\n<tr>\n<th>Ancestors</th>\n<td>")
local ancestors = lang:getAncestors()
if ancestors[2] then
local ancestorList = {}
for i, anc in ipairs(ancestors) do
ancestorList[i] = "<li>" .. anc:makeCategoryLink() .. "</li>"
end
insert(ret, "<ul>\n" .. concat(ancestorList, "\n") .. "</ul>")
else
local ancestorChain = lang:getAncestorChainOld()
if ancestorChain[1] then
local chain = {}
for _, anc in reverse_ipairs(ancestorChain) do
insert(chain, "<li>" .. anc:makeCategoryLink() .. "</li>")
end
insert(ret, "<ul>\n" .. concat(chain, "\n<ul>\n") .. ("</ul>"):rep(#chain))
else
insert(ret, "unknown")
end
end
insert(ret, "</td>\n</tr>\n")
local scripts = lang:getScripts()
if scripts[1] then
local script_text = {}
local function makeScriptLine(sc)
local code = sc:getCode()
local url = tostring(mw.uri.fullUrl('Special:Search', {
search = 'contentmodel:css insource:"' .. code
.. '" insource:/\\.' .. code .. '/',
ns8 = '1'
}))
local sc_catlink
if code == "Zxxx" then
sc_catlink = "[[:Category:Unwritten languages|unwritten]]"
else
sc_catlink = sc:makeCategoryLink(lang)
end
return sc_catlink
.. ' (<span class="plainlinks" title="Search for stylesheets referencing this script">[' .. url .. ' <code>' .. code .. '</code>]</span>)'
end
local function add_Hrkt(text)
insert(text, "<li>" .. makeScriptLine(Hrkt))
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hira) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Kana) .. "</li>")
insert(text, "</ul>")
insert(text, "</li>")
end
for _, sc in ipairs(scripts) do
local text = {}
local code = sc:getCode()
if code == "Hrkt" then
add_Hrkt(text)
else
insert(text, "<li>" .. makeScriptLine(sc))
if code == "Jpan" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
add_Hrkt(text)
insert(text, "</ul>")
elseif code == "Kore" then
insert(text, "<ul>")
insert(text, "<li>" .. makeScriptLine(Hang) .. "</li>")
insert(text, "<li>" .. makeScriptLine(Hani) .. "</li>")
insert(text, "</ul>")
end
insert(text, "</li>")
end
insert(script_text, concat(text, "\n"))
end
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td><ul>\n" .. concat(script_text, "\n") .. "</ul></td>\n</tr>\n")
else
insert(ret, "<tr>\n<th>[[Wiktionary:Scripts|Scripts]]</th>\n<td>not specified</td>\n</tr>\n")
end
local function add_module_info(raw_data, heading)
if raw_data then
local scripts = lang:getScriptCodes()
local module_info, add = {}, false
if type(raw_data) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data))
add = true
else
local raw_data_type = type(raw_data)
if raw_data_type == "table" and size(scripts) == 1 and type(raw_data[scripts[1]]) == "string" then
insert(module_info,
("[[Module:%s]]"):format(raw_data[scripts[1]]))
add = true
elseif raw_data_type == "table" then
insert(module_info, "<ul>")
for script, data in sorted_pairs(raw_data) do
if type(data) == "string" and m_sc_getByCode(script) then
insert(module_info, ("<li><code>%s</code>: [[Module:%s]]</li>"):format(script, data))
end
end
insert(module_info, "</ul>")
add = size(module_info) > 2
end
end
if add then
insert(ret, [=[
<tr>
<th>]=] .. heading .. [=[</th>
<td>]=] .. concat(module_info) .. [=[</td>
</tr>
]=])
end
end
end
add_module_info(raw_data.generate_forms, "Form-generating<br>module")
add_module_info(raw_data.translit, "[[Wiktionary:Transliteration and romanization|Transliteration<br>module]]")
add_module_info(raw_data.display_text, "Display text<br>module")
add_module_info(raw_data.entry_name, "Entry name<br>module")
add_module_info(raw_data.sort_key, "[[sortkey|Sortkey]]<br>module")
local wikidataItem = lang:getWikidataItem()
if lang:getWikidataItem() and mw.wikibase then
local URL = mw.wikibase.getEntityUrl(wikidataItem)
local link
if URL then
link = '[[d:' .. wikidataItem .. '|' .. wikidataItem .. ']]'
else
link = '<span class="error">Invalid Wikidata item: <code>' .. wikidataItem .. '</code></span>'
end
insert(ret, "<tr><th>Wikidata</th><td>" .. link .. "</td></tr>")
end
insert(ret, "</table>")
return concat(ret)
end
local function NavFrame_for_family_tree(content, title)
return '<div class="NavFrame"><div class="NavHead">'
.. (title or '{{{title}}}') .. '</div>'
.. '<div class="NavContent" style="text-align: left; font-size: calc(1em / 0.95); padding: 0.3em">'
.. content
.. '</div></div>'
end
local function get_description_topright_additional(lang, locations, extinct, setwiki, setwikt, setsister, entryname)
local nameWithLanguage = lang:getCategoryName("nocap")
if lang:getCode() == "und" then
local description =
"This is the main category of the '''" .. nameWithLanguage .. "''', represented in Wiktionary by the [[Wiktionary:Languages|code]] '''" .. lang:getCode() .. "'''. " ..
"This language contains terms in historical writing, whose meaning has not yet been determined by scholars."
return description, nil, nil
end
local canonicalName = lang:getCanonicalName()
local topright = linkbox(lang, setwiki, setwikt, setsister, entryname)
local the_prefix
if canonicalName:find(" Language$") then
the_prefix = ""
else
the_prefix = "the "
end
local description = "This is the main category of " .. the_prefix .. "'''" .. nameWithLanguage .. "'''."
local location_links = {}
local prep
local saw_embedded_comma = false
for _, location in ipairs(locations) do
local this_prep
if location == "the world" then
this_prep = "across"
insert(location_links, location)
elseif location ~= "UNKNOWN" then
this_prep = "in"
if location:find(",") then
saw_embedded_comma = true
end
insert(location_links, link_location(location))
end
if this_prep then
if prep and this_prep ~= prep then
error("Can't handle location 'the world' along with another location (clashing prepositions)")
end
prep = this_prep
end
end
local location_desc
if #location_links > 0 then
local location_link_text
if saw_embedded_comma and #location_links >= 3 then
location_link_text = mw.text.listToText(location_links, "; ", "; and ")
else
location_link_text = serial_comma_join(location_links)
end
location_desc = ("It is %s %s %s.\n\n"):format(
extinct and "an [[extinct language]] that was formerly spoken" or "spoken",
prep, location_link_text
)
elseif extinct then
location_desc = "It is an [[extinct language]].\n\n"
else
location_desc = ""
end
local add = location_desc .. "Information about " .. canonicalName .. ":\n\n" .. infobox(lang)
if lang:hasType("reconstructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a reconstructed language. Its words and roots are not directly attested in any written works, but have been reconstructed through the ''comparative method'', " ..
"which finds regular similarities between languages that cannot be explained by coincidence or word-borrowing, and extrapolates ancient forms from these similarities.\n\n" ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Reconstruction: namespace."
elseif lang:hasType("appendix-constructed") then
add = add .. "\n\n" ..
ucfirst(canonicalName) .. " is a constructed language that is only in sporadic use. " ..
"According to our [[Wiktionary:Criteria for inclusion|criteria for inclusion]], terms in " .. canonicalName ..
" should '''not''' be present in entries in the main namespace, but may be added to the Appendix: namespace. " ..
"All terms in this language may be available at [[Appendix:" .. ucfirst(canonicalName) .. "]]."
end
local entry_guidelines_page = "Wiktionary:" .. canonicalName .. " entry guidelines"
local entry_guidelines = new_title(entry_guidelines_page)
if entry_guidelines.exists then
add = add .. "\n\n" ..
"Please see '''[[" .. entry_guidelines_page .. "]]''' for information and special considerations for creating " .. nameWithLanguage .. " entries."
end
local ok, tree_of_descendants = pcall(
require("Module:family tree").print_children,
lang:getCode(), {
protolanguage_under_family = true,
must_have_descendants = true
})
if ok then
if tree_of_descendants then
add = add .. NavFrame_for_family_tree(
tree_of_descendants,
"Family tree")
else
add = add .. "\n\n" .. ucfirst(lang:getCanonicalName())
.. " has no descendants or varieties listed in Wiktionary's language data modules."
end
else
mw.log("error while generating tree: " .. tostring(tree_of_descendants))
end
return description, topright, add
end
local function get_parents(lang, locations, extinct)
local canonicalName = lang:getCanonicalName()
local sortkey = {sort_base = canonicalName, lang = "en"}
local ret = {{name = "All languages", sort = sortkey}}
local fam = lang:getFamily()
local famCode = fam and fam:getCode()
-- FIXME: Some of the following categories should be added to this module.
if not fam then
insert(ret, {name = "Category:Unassigned languages", sort = sortkey})
elseif famCode == "qfa-dis" then
insert(ret, {name = "Category:Languages of disputed affiliation", sort = sortkey})
elseif famCode == "qfa-iso" then
insert(ret, {name = "Category:Language isolates", sort = sortkey})
elseif famCode == "qfa-mix" then
insert(ret, {name = "Category:Mixed languages", sort = sortkey})
elseif famCode == "qfa-unc" then
insert(ret, {name = "Category:Unclassifiable languages", sort = sortkey})
elseif famCode == "sgn" then
insert(ret, {name = "Category:All sign languages", sort = sortkey})
elseif famCode == "crp" then
insert(ret, {name = "Category:Creole or pidgin languages", sort = sortkey})
for _, anc in ipairs(lang:getAncestors()) do
-- 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.
-- Use that ancestor's ancestors instead.
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based creole or pidgin languages", sort = sortkey})
end
end
elseif famCode == "art" then
if lang:hasType("appendix-constructed") then
insert(ret, {name = "Category:Appendix-only constructed languages", sort = sortkey})
else
insert(ret, {name = "Category:Constructed languages", sort = sortkey})
end
for _, anc in ipairs(lang:getAncestors()) do
if anc:getFullCode() == lang:getCode() then
for _, anc_extra in ipairs(anc:getAncestors()) do
insert(ret, {name = "Category:" .. ucfirst(anc_extra:getFullName()) .. "-based constructed languages", sort = sortkey})
end
else
insert(ret, {name = "Category:" .. ucfirst(anc:getFullName()) .. "-based constructed languages", sort = sortkey})
end
end
else
insert(ret, {name = "श्रेणी:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "श्रेणी:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
local catname
if sc:getCode() == "Zxxx" then
catname = "Unwritten languages"
else
catname = sc:getCategoryName(false, lang) .. " भाषाएँ"
end
insert(ret, {name = "श्रेणी:" .. catname, sort = sortkey})
end
local function add_Hrkt()
add_sc_cat(Hrkt)
add_sc_cat(Hira)
add_sc_cat(Kana)
end
for _, sc in ipairs(lang:getScripts()) do
if sc:getCode() == "Hrkt" then
add_Hrkt()
else
add_sc_cat(sc)
if sc:getCode() == "Jpan" then
add_sc_cat(Hani)
add_Hrkt()
elseif sc:getCode() == "Kore" then
add_sc_cat(Hang)
add_sc_cat(Hani)
end
end
end
if lang:hasTranslit() then
insert(ret, {name = "Category:Languages with automatic transliteration", sort = sortkey})
end
local function insert_location_language_cat(location)
local cat = "Languages of " .. location
insert(ret, {name = "Category:" .. cat, sort = sortkey})
local auto_cat_args = scrape_category_for_auto_cat_args(cat)
local location_parent = auto_cat_args and auto_cat_args.parent
if location_parent then
local split_parents = require(parse_utilities_module).split_on_comma(location_parent)
for _, parent in ipairs(split_parents) do
parent = parent:match("^(.-):.*$") or parent
insert_location_language_cat(parent)
end
end
end
local saw_location = false
for _, location in ipairs(locations) do
if location ~= "UNKNOWN" then
saw_location = true
insert_location_language_cat(location)
end
end
if extinct then
insert(ret, {name = "Category:All extinct languages", sort = sortkey})
end
if not saw_location and not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
-- Constructed and reconstructed languages don't need a location specified and often won't have one,
-- so don't put them in this maintenance category.
insert(ret, {name = "Category:Languages not sorted into a location category", sort = sortkey})
end
return ret
end
local function get_children()
local ret = {}
-- FIXME: We should work on the children mechanism so it isn't necessary to manually specify these.
for _, label in ipairs({"appendices", "entry maintenance", "lemmas", "names", "phrases", "rhymes", "symbols", "templates", "terms by etymology", "terms by usage"}) do
insert(ret, {name = label, is_label = true})
end
insert(ret, {name = "terms derived from {{{langname}}}", is_label = true, lang = false})
insert(ret, {name = "{{{langcode}}}:All topics", sort = "all topics"})
insert(ret, {name = "Varieties of {{{langname}}}"})
insert(ret, {name = "Requests concerning {{{langname}}}"})
insert(ret, {name = "Rhymes:{{{langname}}}", description = "Lists of {{{langname}}} words by their rhymes."})
insert(ret, {name = "User {{{langcode}}}", description = "Wiktionary users categorized by fluency levels in {{{langdisp}}}."})
return ret
end
-- Handle language categories of the form e.g. [[:Category:French language]] and
-- [[:Category:British Sign Language]].
insert(raw_handlers, function(data)
local category = data.category
if not (category:find("[Ll]anguage$") or category:find("[Ll]ect$")) then
return nil
end
local lang = m_languages.getByCanonicalName(category)
if not lang then
local langname = category:match("^(.*) भाषाएँ$")
if langname then
lang = m_languages.getByCanonicalName(langname)
end
if not lang then
return nil
end
end
local args = require("Module:parameters").process(data.args, {
[1] = {list = true},
["setwiki"] = true,
["setwikt"] = true,
["setsister"] = true,
["entryname"] = true,
["extinct"] = {type = "boolean"},
})
-- If called from inside, don't require any arguments, as they can't be known
-- in general and aren't needed just to generate the first parent (used for
-- breadcrumbs).
if #args[1] == 0 and not data.called_from_inside then
-- At least one location must be specified unless the language is constructed (e.g. Esperanto) or reconstructed (e.g. Proto-Indo-European).
local fam = lang:getFamily()
if not (lang:hasType("reconstructed") or (fam and fam:getCode() == "art")) then
error("At least one location (param 1=) must be specified for language '" .. lang:getCanonicalName() .. "' (code '" .. lang:getCode() .. "'). " ..
"Use the value UNKNOWN if the language's location is truly unknown.")
end
end
local description, topright, additional = "", "", ""
-- If called from inside the category tree system, it's called when generating
-- parents or children, and we don't need to generate the description or additional
-- text (which is very expensive in terms of memory because it calls [[Module:family tree]],
-- which calls [[Module:languages/data/all]]).
if not data.called_from_inside then
description, topright, additional = get_description_topright_additional(
lang, args[1], args.extinct, args.setwiki, args.setwikt, args.setsister, args.entryname
)
end
return {
canonical_name = lang:getCategoryName(),
description = description,
lang = lang:getCode(),
topright = topright,
additional = additional,
breadcrumb = lang:getCanonicalName(),
parents = get_parents(lang, args[1], args.extinct),
extra_children = get_children(lang),
umbrella = false,
can_be_empty = true,
}, true
end)
-- Handle categories such as [[:Category:Languages of Indonesia]].
insert(raw_handlers, function(data)
local location = data.category:match("^Languages of (.*)$")
if location then
local args = require("Module:parameters").process(data.args, {
["flagfile"] = true,
["commonscat"] = true,
["wp"] = true,
["basename"] = true,
["parent"] = true,
["locationcat"] = true,
["locationlink"] = true,
})
local topright
local basename = args.basename or location:gsub(", .*", "")
if args.flagfile ~= "-" then
local flagfile_arg = args.flagfile or ("Flag of %s.svg"):format(basename)
local files = require(parse_utilities_module).split_on_comma(flagfile_arg)
local topright_parts = {}
for _, file in ipairs(files) do
local flagfile = "File:" .. file
local flagfile_page = new_title(flagfile)
if flagfile_page and flagfile_page.file.exists then
insert(topright_parts, ("[[%s|right|100px|border]]"):format(flagfile))
elseif args.flagfile then
error(("Explicit flagfile '%s' doesn't exist"):format(flagfile))
end
end
topright = concat(topright_parts)
end
if args.wp then
local wp = require("Module:yesno")(args.wp, "+")
if wp == "+" or wp == true then
wp = data.category
end
if wp then
local wp_topright = ("{{wikipedia|%s}}"):format(wp)
if topright then
topright = topright .. wp_topright
else
topright = wp_topright
end
end
end
if args.commonscat then
local commonscat = require("Module:yesno")(args.commonscat, "+")
if commonscat == "+" or commonscat == true then
commonscat = data.category
end
if commonscat then
local commons_topright = ("{{commonscat|%s}}"):format(commonscat)
if topright then
topright = topright .. commons_topright
else
topright = commons_topright
end
end
end
local bare_location = location:match("^the (.*)$") or location
local location_link = args.locationlink or link_location(location)
local bare_basename = basename:match("^the (.*)$") or basename
local parents = {}
if args.parent then
local explicit_parents = require(parse_utilities_module).split_on_comma(args.parent)
for i, parent in ipairs(explicit_parents) do
local actual_parent, sort_key = parent:match("^(.-):(.*)$")
if actual_parent then
parent = actual_parent
sort_key = sort_key:gsub("%+", bare_location)
else
sort_key = " " .. bare_location
end
insert(parents, {name = "Languages of " .. parent, sort = sort_key})
end
else
insert(parents, {name = "Languages by country", sort = {sort_base = bare_location, lang = "en"}})
end
if args.locationcat then
local explicit_location_cats = require(parse_utilities_module).split_on_comma(args.locationcat)
for i, locationcat in ipairs(explicit_location_cats) do
insert(parents, {name = "श्रेणी:" .. locationcat, sort = " भाषाएँ"})
end
else
local location_cat = ("श्रेणी:%s"):format(bare_location)
local location_page = new_title(location_cat)
if location_page and location_page.exists then
insert(parents, {name = location_cat, sort = "भाषाएँ"})
end
end
local description = ("Categories for languages of %s (including sublects)."):format(location_link)
return {
topright = topright,
description = description,
parents = parents,
breadcrumb = bare_basename,
additional = "{{{umbrella_msg}}}",
}, true
end
end)
-- Handle categories such as [[:Category:English-based creole or pidgin languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based creole or pidgin languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Languages which developed as a [[creole]] or [[pidgin]] from " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Creole or pidgin languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
-- Handle categories such as [[:Category:English-based constructed languages]].
insert(raw_handlers, function(data)
local langname = data.category:match("(.*)%-based constructed languages$")
if langname then
local lang = m_languages.getByCanonicalName(langname)
if lang then
return {
lang = lang:getCode(),
description = "Constructed languages which are based on " .. lang:makeCategoryLink() .. ".",
parents = {{name = "Constructed languages", sort = {sort_base = "*" .. langname, lang = "en"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
ltzxlammj6zoj8zwoc0pe25y12a351k
मॉड्यूल:category tree/languages
828
306963
487817
2026-09-02T19:21:13Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/languages]] को [[मॉड्यूल:category tree/भाषाएँ]] पर स्थानांतरित किया
487817
Scribunto
text/plain
return require [[मॉड्यूल:category tree/भाषाएँ]]
4anad9goztj9z7agrp6fp7gquqljih7
मॉड्यूल:category tree/लेम्मा
828
306964
487818
2026-09-02T19:24:28Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित+ अल्प स्थानीयकृत
487818
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"विशेषण",
"क्रियाविशेषण",
"डेटरमाइनर",
"विस्मयादिबोधक",
"संज्ञाएँ",
"अंक",
"उपसर्ग",
"नामवाचक संज्ञाएँ",
"सर्वनाम",
"परसर्ग",
"क्रियाएँ"
}
labels["लेम्मा"] = {
description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true, sort = " "}},
}
labels["action nouns"] = {
description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.",
parents = {"nouns"},
}
labels["act-related adverbs"] = {
description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.",
parents = {"adverbs"},
}
labels["adjective concords"] = {
description = "{{{langname}}} concords that are prefixed to adjective stems.",
parents = {"concords"},
}
labels["विशेषण"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"लेम्मा"},
}
labels["adjectivized participles"] = {
description = "{{{langname}}} participles that are used as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjectivized past participles"] = {
description = "{{{langname}}} past participles that are used as adjectives.",
parents = {"past participles", "adjectivized participles", "adjectives"},
}
labels["adjectivized present participles"] = {
description = "{{{langname}}} present participles that are used as adjectives.",
parents = {"present participles", "adjectivized participles", "adjectives"},
}
labels["adverbial accusatives"] = {
description = "Accusative case-forms in {{{langname}}} used as adverbs.",
parents = {"adverbs"},
}
labels["adverbs"] = {
description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.",
parents = {"lemmas"},
}
labels["affixes"] = {
description = "Morphemes attached to existing {{{langname}}} words.",
parents = {"morphemes"},
}
labels["agent nouns"] = {
description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.",
parents = {"nouns"},
}
labels["ambipositions"] = {
description = "{{{langname}}} adpositions that can occur either before or after their objects.",
parents = {"lemmas"},
}
labels["ambitransitive verbs"] = {
description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.",
parents = {"verbs", "transitive verbs", "intransitive verbs"},
}
labels["animal commands"] = {
description = "{{{langname}}} words used to communicate with animals.",
parents = {"interjections"},
}
labels["articles"] = {
description = "{{{langname}}} terms that indicate and specify nouns.",
parents = {"determiners"},
}
labels["aspect adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.",
parents = {"adverbs"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["augmentative " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.",
parents = {pos},
}
end
labels["attenuative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.",
parents = {"verbs"},
}
labels["autobenefactive verbs"] = {
description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.",
parents = {"verbs"},
}
labels["automative verbs"] = {
description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.",
parents = {"verbs"},
}
labels["auxiliary verbs"] = {
description = "{{{langname}}} verbs that provide additional conjugations for other verbs.",
parents = {"verbs"},
}
labels["biaspectual verbs"] = {
description = "{{{langname}}} verbs that can be both imperfective and perfective.",
parents = {"verbs"},
}
labels["causative verbs"] = {
description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.",
parents = {"verbs"},
}
labels["circumfixes"] = {
description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.",
parents = {"morphemes"},
}
labels["circumpositions"] = {
description = "{{{langname}}} adpositions that appear on both sides of their objects.",
parents = {"lemmas"},
}
labels["classifiers"] = {
description = "{{{langname}}} terms that classify nouns according to their meanings.",
parents = {"lemmas"},
}
labels["clitics"] = {
description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.",
parents = {"morphemes"},
}
for _, pos in ipairs { "nouns", "suffixes" } do
labels["collective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.",
parents = {pos},
}
end
labels["combining forms"] = {
description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.",
parents = {"morphemes"},
}
labels["comparable adjectives"] = {
description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["comparable adverbs"] = {
description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["completive verbs"] = {
description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.",
parents = {"verbs"},
}
labels["concords"] = {
description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.",
parents = {"prefixes"},
}
labels["conjunctions"] = {
description = "{{{langname}}} terms that connect words, phrases or clauses together.",
parents = {"lemmas"},
}
labels["conjunctive adverbs"] = {
description = "{{{langname}}} adverbs that connect two independent clauses together.",
parents = {"adverbs"},
}
labels["continuative verbs"] = {
description = "{{{langname}}} verbs that express continuing action.",
parents = {"imperfective verbs", "verbs"},
}
labels["control verbs"] = {
description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.",
parents = {"verbs"},
}
labels["cooperative verbs"] = {
description = "{{{langname}}} verbs that indicate cooperation",
parents = {"verbs"},
}
labels["coordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.",
parents = {"conjunctions"},
}
labels["copulative verbs"] = {
description = "{{{langname}}} verbs that may take adjectives as their complement.",
parents = {"verbs"},
}
for _, pos in ipairs { "nouns", "proper nouns" } do
labels["countable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.",
parents = {pos},
}
end
labels["countable numerals"] = {
description = "{{{langname}}} numerals that can be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["countable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["counters"] = {
description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.",
parents = {"lemmas"},
}
labels["cumulative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.",
parents = {"verbs"},
}
labels["degree adverbs"] = {
description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.",
parents = {"adverbs"},
}
labels["delimitative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.",
parents = {"imperfective verbs", "verbs"},
}
labels["demonstrative adjectives"] = {
description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.",
parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}},
}
labels["demonstrative adverbs"] = {
description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.",
parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}},
}
labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent?
description = "{{{langname}}} verbs that derive from nouns.",
parents = { "verbs" },
}
labels["demonstrative determiners"] = {
description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.",
parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}},
}
labels["demonstrative pronouns"] = {
description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.",
parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}},
}
labels["deponent verbs"] = {
description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.",
parents = {"verbs"},
}
labels["derivational prefixes"] = {
description = "{{{langname}}} prefixes that are used to create new words.",
parents = {"prefixes"},
}
labels["derivational suffixes"] = {
description = "{{{langname}}} suffixes that are used to create new words.",
parents = {"suffixes"},
}
labels["derivative verbs"] = {
description = "{{{langname}}} verbs that are derived from nouns and adjectives.",
parents = {"verbs"},
}
labels["desiderative verbs"] = {
description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.",
parents = {"verbs"},
}
labels["determinatives"] = {
description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.",
parents = {"lemmas"},
}
labels["determiners"] = {
description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.",
parents = {"lemmas"},
}
labels["diminutiva tantum"] = {
description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.",
parents = {"nouns"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["diminutive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.",
parents = {pos},
}
end
labels["discourse particles"] = {
description = "{{{langname}}} particles that manage the flow and structure of discourse.",
parents = {"particles"},
}
labels["distributive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.",
parents = {"imperfective verbs", "verbs"},
}
labels["ditransitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.",
parents = {"verbs", "transitive verbs"},
}
labels["dualia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.",
parents = {"nouns"},
}
labels["duration adverbs"] = {
description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].",
parents = {"time adverbs"},
}
labels["ergative verbs"] = {
description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.",
parents = {"verbs", "intransitive verbs", "transitive verbs"},
}
labels["excessive verbs"] = {
description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.",
parents = {"verbs"},
}
labels["enclitics"] = {
description = "{{{langname}}} clitics that attach to the preceding word.",
parents = {"clitics"},
}
labels["nouns with other-gender equivalents"] = {
description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.",
parents = {"nouns"},
}
labels["female equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["neuter equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["female equivalent suffixes"] = {
description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.",
parents = {"noun-forming suffixes"},
}
labels["focus adverbs"] = {
description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.",
parents = {"adverbs"},
}
labels["frequency adverbs"] = {
description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].",
parents = {"time adverbs"},
}
labels["frequentative verbs"] = {
description = "{{{langname}}} verbs that express repeated action.",
parents = {"imperfective verbs", "verbs"},
}
labels["general pronouns"] = {
description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.",
parents = {"pronouns"},
}
labels["generational moieties"] = {
description = "{{{langname}}} moieties that alternate every generation.",
parents = {"moieties"},
}
labels["ideophones"] = {
description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.",
parents = {"lemmas"},
}
labels["imperfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.",
parents = {"verbs"},
}
labels["impersonal verbs"] = {
description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.",
parents = {"verbs"},
}
labels["inchoative verbs"] = {
description = "{{{langname}}} verbs that indicate the beginning of an action or event.",
parents = {"verbs"},
}
labels["indefinite adjectives"] = {
description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.",
parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}},
}
labels["indefinite adverbs"] = {
description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.",
parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}},
}
labels["indefinite determiners"] = {
description = "{{{langname}}} determiners that designate an unidentified noun.",
parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}},
}
labels["indefinite pronouns"] = {
description = "{{{langname}}} pronouns that refer to unspecified nouns.",
parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}},
}
labels["infixes"] = {
description = "Affixes inserted inside {{{langname}}} words.",
parents = {"morphemes"},
}
labels["inflectional prefixes"] = {
description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.",
parents = {"prefixes"},
}
labels["inflectional suffixes"] = {
description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.",
parents = {"suffixes"},
}
labels["intensive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.",
parents = {"verbs"},
}
labels["interfixes"] = {
description = "Affixes used to join two {{{langname}}} words or morphemes together.",
parents = {"morphemes"},
}
labels["interjections"] = {
description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.",
parents = {"lemmas"},
}
labels["interrogative adjectives"] = {
description = "{{{langname}}} adjectives that indicate questions.",
parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}},
}
labels["interrogative adverbs"] = {
description = "{{{langname}}} adverbs that indicate questions.",
parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}},
}
labels["interrogative determiners"] = {
description = "{{{langname}}} determiners that indicate questions.",
parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}},
}
labels["interrogative particles"] = {
description = "{{{langname}}} particles that indicate questions.",
parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}},
}
labels["interrogative pronouns"] = {
description = "{{{langname}}} pronouns that indicate questions.",
parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}},
}
labels["intransitive verbs"] = {
description = "{{{langname}}} verbs that don't require any grammatical objects.",
parents = {"verbs"},
}
labels["iterative verbs"] = {
description = "{{{langname}}} verbs that express the repetition of an event.",
parents = {"imperfective verbs", "verbs"},
}
labels["location adverbs"] = {
description = "{{{langname}}} adverbs that indicate location.",
parents = {"adverbs"},
}
labels["male equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["manner adverbs"] = {
description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.",
parents = {"adverbs"},
}
labels["modal adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.",
parents = {"sentence adverbs"},
}
labels["modal particles"] = {
description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.",
parents = {"particles"},
}
labels["modal verbs"] = {
description = "{{{langname}}} verbs that indicate [[grammatical mood]].",
parents = {"auxiliary verbs"},
}
labels["moieties"] = {
description = "{{{langname}}} pairs of abstract categories separating people and the environment.",
parents = {"lemmas"},
}
labels["momentane verbs"] = {
description = "{{{langname}}} verbs that express a sudden and brief action.",
parents = {"perfective verbs", "verbs"},
}
labels["morphemes"] = {
description = "{{{langname}}} word-elements used to form full words.",
parents = {"lemmas"},
}
labels["movement adverbs"] = {
description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].",
additional = "Compare [[:Category:{{{langname}}} position adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Position adverbs by language]].",
},
}
labels["multiword terms"] = {
description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.",
parents = {"lemmas"},
}
labels["negative verbs"] = {
description = "{{{langname}}} verbs that indicate the lack of an action.",
parents = {"verbs"},
}
labels["negative particles"] = {
description = "{{{langname}}} particles that indicate negation.",
parents = {"particles"},
}
labels["negative pronouns"] = {
description = "{{{langname}}} pronouns that refer to negative or non-existent references.",
parents = {"pronouns"},
}
labels["nominalized adjectives"] = {
description = "{{{langname}}} adjectives that are used as nouns.",
parents = {"nouns", "adjectives"},
}
labels["nominalized present participles"] = {
description = "{{{langname}}} present participles that are used as nouns.",
parents = {"nouns", "present participles"},
}
labels["non-constituents"] = {
description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.",
parents = {"phrases"},
}
labels["noun prefixes"] = {
description = "{{{langname}}} prefixes attached to a noun that display its noun class.",
parents = {"prefixes"},
}
labels["nouns"] = {
description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.",
parents = {"lemmas"},
}
labels["nouns by classifier"] = {
description = "{{{langname}}} nouns organized by the classifier they are used with.",
parents = {{name = "nouns", sort = "classifier"}},
}
labels["numerals"] = {
description = "{{{langname}}} terms that quantify nouns.",
parents = {"lemmas"},
}
labels["object concords"] = {
description = "{{{langname}}} concords used to show the grammatical object.",
parents = {"concords"},
}
labels["object pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical objects.",
parents = {"pronouns"},
}
labels["particles"] = {
description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.",
parents = {"lemmas"},
}
labels["perfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.",
parents = {"verbs"},
}
labels["personal pronouns"] = {
description = "{{{langname}}} pronouns that are used as substitutes for known nouns.",
parents = {"pronouns"},
}
labels["phrasal verbs"] = {
description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.",
parents = {"verbs", "phrases"},
}
labels["phrasal prepositions"] = {
description = "{{{langname}}} prepositions formed with combinations of other terms.",
parents = {"prepositions", "phrases"},
}
labels["pluralia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.",
parents = {"nouns"},
}
labels["point-in-time adverbs"] = {
description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.",
parents = {"time adverbs"},
}
labels["position adverbs"] = {
description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].",
additional = "Compare [[:Category:{{{langname}}} movement adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Movement adverbs by language]].",
},
}
labels["possessable nouns"] = {
description = "{{{langname}}} nouns that can have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.",
},
}
labels["possessional adjectives"] = {
description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.",
parents = {"adjectives"},
}
labels["possessive adjectives"] = {
description = "{{{langname}}} adjectives that indicate ownership.",
parents = {"adjectives"},
}
labels["possessive concords"] = {
description = "{{{langname}}} concords used to show possession.",
parents = {"concords"},
}
labels["possessive determiners"] = {
description = "{{{langname}}} determiners that indicate ownership.",
parents = {"determiners"},
}
labels["possessive pronouns"] = {
description = "{{{langname}}} pronouns that indicate ownership.",
parents = {"pronouns"},
}
labels["postpositional phrases"] = {
description = "{{{langname}}} phrases headed by a postposition.",
parents = {"phrases", "postpositions"},
}
labels["postpositions"] = {
description = "{{{langname}}} adpositions that are placed after their objects.",
parents = {"lemmas"},
}
labels["predicatives"] = {
description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.",
parents = {"lemmas"},
}
labels["prefixes"] = {
description = "Affixes attached to the beginning of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["prepositional phrases"] = {
description = "{{{langname}}} phrases headed by a preposition.",
parents = {"phrases", "prepositions"},
}
labels["prepositions"] = {
description = "{{{langname}}} adpositions that are placed before their objects.",
parents = {"lemmas"},
}
labels["matrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's mother.",
parents = {"moieties"},
}
labels["patrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's father.",
parents = {"moieties"},
}
labels["pejorative suffixes"] = {
description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).",
parents = {"suffixes"},
}
labels["prenouns"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to nouns.",
parents = {"prefixes"},
}
labels["preverbs"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to verbs.",
parents = {"prefixes"},
}
labels["privative verbs"] = {
description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.",
parents = {"verbs"},
}
labels["pronominal adverbs"] = {
description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.",
parents = {"adverbs", "prepositions", "pronouns"},
}
labels["pronominal concords"] = {
description = "{{{langname}}} concords that are prefixed to pronominal stems.",
parents = {"concords"},
}
labels["pronouns"] = {
description = "{{{langname}}} terms that refer to and substitute nouns.",
parents = {"lemmas"},
}
labels["proper nouns"] = {
description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.",
parents = {"nouns"},
}
labels["raising verbs"] = {
description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.",
parents = {"verbs"},
}
labels["reciprocal pronouns"] = {
description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.",
parents = {"pronouns", "personal pronouns"},
}
labels["reciprocal verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.",
parents = {"verbs"},
}
labels["reflexive pronouns"] = {
description = "{{{langname}}} pronouns that refer back to the subject.",
parents = {"pronouns", "personal pronouns"},
}
labels["reflexive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.",
parents = {"verbs"},
}
labels["relational adjectives"] = {
description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.",
parents = {"adjectives"},
}
labels["relational nouns"] = {
description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.",
parents = {"nouns"},
}
labels["relative adjectives"] = {
description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.",
parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}},
}
labels["relative adverbs"] = {
description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.",
parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}},
}
labels["relative determiners"] = {
description = "{{{langname}}} determiners used to indicate [[relative clause]]s.",
parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}},
}
labels["relative concords"] = {
description = "{{{langname}}} concords that are prefixed to relative stems.",
parents = {"concords"},
}
labels["relative pronouns"] = {
description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.",
parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}},
}
labels["relatives"] = {
description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.",
parents = {"lemmas"},
}
labels["repetitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.",
parents = {"verbs"},
}
labels["resultative verbs"] = {
description = "{{{langname}}} verbs that indicate a result of some action",
parents = {"verbs"},
}
labels["reversative verbs"] = {
description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.",
parents = {"verbs"},
}
labels["saturative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.",
parents = {"verbs"},
}
labels["semelfactive verbs"] = {
description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).",
parents = {"perfective verbs", "verbs"},
}
labels["sentence adverbs"] = {
description = "{{{langname}}} adverbs that modify an entire clause or sentence.",
parents = {"adverbs"},
}
labels["sequence adverbs"] = {
description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.",
parents = {"conjunctive adverbs"},
}
labels["simulfixes"] = {
description = "Affixes replacing positions in {{{langname}}} words.",
parents = {"morphemes"},
}
labels["singulative nouns"] = {
description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.",
parents = {"nouns"},
}
labels["singularia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.",
parents = {"nouns"},
}
labels["solitary pronouns"] = {
description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.",
parents = {"pronouns", "personal pronouns"},
}
labels["stative verbs"] = {
description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.",
parents = {"verbs"},
}
labels["stems"] = {
description = "Morphemes from which {{{langname}}} words are formed.",
parents = {"morphemes"},
}
labels["subordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.",
parents = {"conjunctions"},
}
labels["subject concords"] = {
description = "{{{langname}}} concords used to show the grammatical subject.",
parents = {"concords"},
}
labels["subject pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical subjects.",
parents = {"pronouns"},
}
labels["suffixes"] = {
description = "Affixes attached to the end of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["splitting verbs"] = {
description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.",
parents = {"verbs"},
}
labels["terminative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event ceases.",
parents = {"verbs"},
}
labels["time adverbs"] = {
description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].",
parents = {"adverbs"},
}
labels["transfixes"] = {
description = "Discontinuous affixes inserted within a word root.",
parents = {"morphemes"},
}
labels["transformative verbs"] = {
description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.",
parents = {"verbs"},
}
labels["transitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.",
parents = {"verbs"},
}
labels["uncomparable adjectives"] = {
description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["uncomparable adverbs"] = {
description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["uncountable nouns"] = {
description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.",
parents = {"nouns"},
}
labels["uncountable numerals"] = {
description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["uncountable proper nouns"] = {
description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.",
parents = {"proper nouns"},
}
labels["uncountable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["unpossessable nouns"] = {
description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.",
},
}
labels["verbal nouns"] = {
description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.",
parents = {"nouns"},
}
labels["verbal adjectives"] = {
description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.",
parents = {"adjectives"},
}
-----------------------------------------------------------------------------
labels["verbs"] = {
description = "{{{langname}}} terms that indicate actions, occurrences or states.",
parents = {"lemmas"},
}
for _, voice in pairs{
"active",
"middle",
"passive",
} do
labels[voice .. " verbs"] = {
description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.",
parents = {"verbs"},
}
local voice_only = voice .. "-only"
labels[voice_only .. " verbs"] = {
breadcrumb = voice_only,
description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.",
parents = {voice .. " verbs", "verbs"},
}
end
labels["verbs of movement"] = {
description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.",
parents = {"verbs"},
}
-----------------------------------------------------------------------------
for pos, desc in pairs{
["prepositions"] = "following",
["postpositions"] = "preceding"
} do
for _, case in ipairs{
"ablative",
"accusative",
"dative",
"genitive",
"instrumental",
"locative",
"nominative",
"prepositional",
"vocative",
} do
labels[pos .. " governing the " .. case] = {
breadcrumb = ucfirst(case),
description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case),
parents = {pos},
}
end
end
-- Add "X-only categories for degrees.
for _, pos in pairs{
"adjectives",
"adverbs",
"determiners",
"pronouns",
} do
for _, degree in pairs{
"comparative",
"superlative",
"elative",
"exaggerated",
"excessive",
"equative",
} do
local degree_only = degree .. "-only"
labels[degree_only .. " " .. pos] = {
breadcrumb = degree_only,
description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.",
parents = {pos},
}
end
end
-- Add "POS-forming suffixes".
for _, pos in pairs{
"adjective",
"adverb",
"noun",
"numeral",
"participle",
"pronoun",
"proper noun",
"verb",
} do
labels[pos .. "-forming suffixes"] = {
description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.",
parents = {"derivational suffixes"},
}
end
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Lemmas subcategories by language"] = {
description = "Umbrella categories covering topics related to lemmas.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "lemmas", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]].
table.insert(handlers, function(data)
local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$")
if particle then
local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term")
local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term")
return {
description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".",
displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"',
breadcrumb = tagged_text,
parents = {{ name = "phrasal verbs", sort = particle }},
umbrella = false,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
m71et4r44t927l9rcq6ntu20wlgkf10
487819
487818
2026-09-02T19:24:51Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/lemmas]] को [[मॉड्यूल:category tree/लेम्मा]] पर स्थानांतरित किया
487818
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"विशेषण",
"क्रियाविशेषण",
"डेटरमाइनर",
"विस्मयादिबोधक",
"संज्ञाएँ",
"अंक",
"उपसर्ग",
"नामवाचक संज्ञाएँ",
"सर्वनाम",
"परसर्ग",
"क्रियाएँ"
}
labels["लेम्मा"] = {
description = "{{{langname}}} [[Wiktionary:Lemmas|lemmas]], categorized by their part of speech.",
umbrella_parents = "मूलभूत श्रेणी",
parents = {{name = "{{{langcat}}}", raw = true, sort = " "}},
}
labels["action nouns"] = {
description = "{{{langname}}} nouns denoting action of a verb or verbal root that it is derived from.",
parents = {"nouns"},
}
labels["act-related adverbs"] = {
description = "{{{langname}}} adverbs that indicate the motive or other background information for an action.",
parents = {"adverbs"},
}
labels["adjective concords"] = {
description = "{{{langname}}} concords that are prefixed to adjective stems.",
parents = {"concords"},
}
labels["विशेषण"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"लेम्मा"},
}
labels["adjectivized participles"] = {
description = "{{{langname}}} participles that are used as adjectives.",
parents = {"participles", "adjectives"},
}
labels["adjectivized past participles"] = {
description = "{{{langname}}} past participles that are used as adjectives.",
parents = {"past participles", "adjectivized participles", "adjectives"},
}
labels["adjectivized present participles"] = {
description = "{{{langname}}} present participles that are used as adjectives.",
parents = {"present participles", "adjectivized participles", "adjectives"},
}
labels["adverbial accusatives"] = {
description = "Accusative case-forms in {{{langname}}} used as adverbs.",
parents = {"adverbs"},
}
labels["adverbs"] = {
description = "{{{langname}}} terms that modify clauses, sentences and phrases directly.",
parents = {"lemmas"},
}
labels["affixes"] = {
description = "Morphemes attached to existing {{{langname}}} words.",
parents = {"morphemes"},
}
labels["agent nouns"] = {
description = "{{{langname}}} nouns that denote an agent that performs the action denoted by the verb from which the noun is derived.",
parents = {"nouns"},
}
labels["ambipositions"] = {
description = "{{{langname}}} adpositions that can occur either before or after their objects.",
parents = {"lemmas"},
}
labels["ambitransitive verbs"] = {
description = "{{{langname}}} verbs that may or may not direct actions, occurrences or states to grammatical objects.",
parents = {"verbs", "transitive verbs", "intransitive verbs"},
}
labels["animal commands"] = {
description = "{{{langname}}} words used to communicate with animals.",
parents = {"interjections"},
}
labels["articles"] = {
description = "{{{langname}}} terms that indicate and specify nouns.",
parents = {"determiners"},
}
labels["aspect adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Grammatical aspect|grammatical aspect]], describing the flow of time in relation to a statement.",
parents = {"adverbs"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["augmentative " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey big size or big intensity.",
parents = {pos},
}
end
labels["attenuative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event is performed or takes place gently, lightly, partially, perfunctorily or to an otherwise reduced extent.",
parents = {"verbs"},
}
labels["autobenefactive verbs"] = {
description = "{{{langname}}} verbs that indicate that the agent of an action is also its benefactor.",
parents = {"verbs"},
}
labels["automative verbs"] = {
description = "{{{langname}}} verbs that indicate actions directed at or a change of state of the grammatical subject.",
parents = {"verbs"},
}
labels["auxiliary verbs"] = {
description = "{{{langname}}} verbs that provide additional conjugations for other verbs.",
parents = {"verbs"},
}
labels["biaspectual verbs"] = {
description = "{{{langname}}} verbs that can be both imperfective and perfective.",
parents = {"verbs"},
}
labels["causative verbs"] = {
description = "{{{langname}}} verbs that express causing actions or states rather than performing or being them directly.",
parents = {"verbs"},
}
labels["circumfixes"] = {
description = "Affixes attached to both the beginning and the end of {{{langname}}} words, functioning together as single units.",
parents = {"morphemes"},
}
labels["circumpositions"] = {
description = "{{{langname}}} adpositions that appear on both sides of their objects.",
parents = {"lemmas"},
}
labels["classifiers"] = {
description = "{{{langname}}} terms that classify nouns according to their meanings.",
parents = {"lemmas"},
}
labels["clitics"] = {
description = "{{{langname}}} morphemes that function as independent words, but are always attached to another word.",
parents = {"morphemes"},
}
for _, pos in ipairs { "nouns", "suffixes" } do
labels["collective " .. pos] = {
description = "{{{langname}}} " .. pos .. " that indicate groups of related things or beings, without the need of grammatical pluralization.",
parents = {pos},
}
end
labels["combining forms"] = {
description = "Forms of {{{langname}}} words that do not occur independently, but are used when joined with other words.",
parents = {"morphemes"},
}
labels["comparable adjectives"] = {
description = "{{{langname}}} adjectives that can be inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["comparable adverbs"] = {
description = "{{{langname}}} adverbs that can be inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["completive verbs"] = {
description = "{{{langname}}} verbs which refer to the completion of an action which has already commenced or which has already been performed upon a subset of the entities which it affects.",
parents = {"verbs"},
}
labels["concords"] = {
description = "{{{langname}}} prefixes attached to words to show agreement with a noun or pronoun.",
parents = {"prefixes"},
}
labels["conjunctions"] = {
description = "{{{langname}}} terms that connect words, phrases or clauses together.",
parents = {"lemmas"},
}
labels["conjunctive adverbs"] = {
description = "{{{langname}}} adverbs that connect two independent clauses together.",
parents = {"adverbs"},
}
labels["continuative verbs"] = {
description = "{{{langname}}} verbs that express continuing action.",
parents = {"imperfective verbs", "verbs"},
}
labels["control verbs"] = {
description = "{{{langname}}} verbs that take multiple arguments, one of which is another verb. One of the control verb's arguments is syntactically both an argument of the control verb and an argument of the other verb.",
parents = {"verbs"},
}
labels["cooperative verbs"] = {
description = "{{{langname}}} verbs that indicate cooperation",
parents = {"verbs"},
}
labels["coordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate equal syntactic importance between connected items.",
parents = {"conjunctions"},
}
labels["copulative verbs"] = {
description = "{{{langname}}} verbs that may take adjectives as their complement.",
parents = {"verbs"},
}
for _, pos in ipairs { "nouns", "proper nouns" } do
labels["countable " .. pos] = {
description = "{{{langname}}} " .. pos .. " that can be quantified directly by numerals.",
parents = {pos},
}
end
labels["countable numerals"] = {
description = "{{{langname}}} numerals that can be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["countable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that can be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["counters"] = {
description = "{{{langname}}} terms that combine with numerals to express quantity of nouns.",
parents = {"lemmas"},
}
labels["cumulative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event gradually yields a certain or significant quantity or effect.",
parents = {"verbs"},
}
labels["degree adverbs"] = {
description = "{{{langname}}} adverbs that express a particular degree to which the word they modify applies.",
parents = {"adverbs"},
}
labels["delimitative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event is performed or takes place briefly or to an otherwise reduced extent.",
parents = {"imperfective verbs", "verbs"},
}
labels["demonstrative adjectives"] = {
description = "{{{langname}}} adjectives that refer to nouns, comparing them to external references.",
parents = {"adjectives", {name = "demonstrative pro-forms", sort = "adjectives"}},
}
labels["demonstrative adverbs"] = {
description = "{{{langname}}} adverbs that refer to other adverbs, comparing them to external references.",
parents = {"adverbs", {name = "demonstrative pro-forms", sort = "adverbs"}},
}
labels["denominal verbs"] = { -- in [[Appendix:Glossary]]; "denominative" more frequent?
description = "{{{langname}}} verbs that derive from nouns.",
parents = { "verbs" },
}
labels["demonstrative determiners"] = {
description = "{{{langname}}} determiners that refer to nouns, comparing them to external references.",
parents = {"determiners", {name = "demonstrative pro-forms", sort = "determiners"}},
}
labels["demonstrative pronouns"] = {
description = "{{{langname}}} pronouns that refer to nouns, comparing them to external references.",
parents = {"pronouns", {name = "demonstrative pro-forms", sort = "pronouns"}},
}
labels["deponent verbs"] = {
description = "{{{langname}}} verbs that have active meanings but are not conjugated in the {{w|active voice}}.",
parents = {"verbs"},
}
labels["derivational prefixes"] = {
description = "{{{langname}}} prefixes that are used to create new words.",
parents = {"prefixes"},
}
labels["derivational suffixes"] = {
description = "{{{langname}}} suffixes that are used to create new words.",
parents = {"suffixes"},
}
labels["derivative verbs"] = {
description = "{{{langname}}} verbs that are derived from nouns and adjectives.",
parents = {"verbs"},
}
labels["desiderative verbs"] = {
description = "{{{langname}}} verbs with the following morphology: verbal root xxx + [[desiderative]] affix, and the following semantics: to wish to do the action xxx.",
parents = {"verbs"},
}
labels["determinatives"] = {
description = "{{{langname}}} terms that indicate the general class to which the following logogram belongs.",
parents = {"lemmas"},
}
labels["determiners"] = {
description = "{{{langname}}} terms that narrow down, within the conversational context, the referent of the modified noun.",
parents = {"lemmas"},
}
labels["diminutiva tantum"] = {
description = "{{{langname}}} nouns or noun senses that are mostly or exclusively used in the diminutive form.",
parents = {"nouns"},
}
for _, pos in ipairs(diminutive_augmentative_poses) do
labels["diminutive " .. pos] = {
description = "{{{langname}}} " .. pos .. " that are derived from a base word to convey endearment, small size or small intensity.",
parents = {pos},
}
end
labels["discourse particles"] = {
description = "{{{langname}}} particles that manage the flow and structure of discourse.",
parents = {"particles"},
}
labels["distributive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action or event involves multiple participants or a large quantity of an uncountable mass, usually as the grammatical subject in the case of intransitive verbs and as the grammatical object in the case of transitive verbs.",
parents = {"imperfective verbs", "verbs"},
}
labels["ditransitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states of two grammatical objects simultaneously, one direct and one indirect.",
parents = {"verbs", "transitive verbs"},
}
labels["dualia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the dual form.",
parents = {"nouns"},
}
labels["duration adverbs"] = {
description = "{{{langname}}} adverbs that express duration in time, such as (in English) [[always]], [[all night]] and [[ever since]].",
parents = {"time adverbs"},
}
labels["ergative verbs"] = {
description = "{{{langname}}} [[Appendix:Glossary#ergative|ergative verb]]s: intransitive verbs that become causatives when used transitively.",
parents = {"verbs", "intransitive verbs", "transitive verbs"},
}
labels["excessive verbs"] = {
description = "{{{langname}}} verbs that indicate that an action is performed to an excessive extent.",
parents = {"verbs"},
}
labels["enclitics"] = {
description = "{{{langname}}} clitics that attach to the preceding word.",
parents = {"clitics"},
}
labels["nouns with other-gender equivalents"] = {
description = "{{{langname}}} nouns that refer to gendered concepts (e.g. [[actor]] vs. [[actress]], [[king]] vs. [[queen]]) and have corresponding other-gender equivalent terms.",
parents = {"nouns"},
}
labels["female equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to female beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["neuter equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to neuter beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["female equivalent suffixes"] = {
description = "{{{langname}}} suffixes that refer to female beings with the same characteristics as the base suffix.",
parents = {"noun-forming suffixes"},
}
labels["focus adverbs"] = {
description = "{{{langname}}} adverbs that indicate [[w:Focus (linguistics)|focus]] within the sentence.",
parents = {"adverbs"},
}
labels["frequency adverbs"] = {
description = "{{{langname}}} adverbs that express repetition with a certain frequency or interval, such as (in English) [[monthly]], [[continually]] and [[once in a while]].",
parents = {"time adverbs"},
}
labels["frequentative verbs"] = {
description = "{{{langname}}} verbs that express repeated action.",
parents = {"imperfective verbs", "verbs"},
}
labels["general pronouns"] = {
description = "{{{langname}}} pronouns that refer to all persons, things, abstract ideas and their characteristics.",
parents = {"pronouns"},
}
labels["generational moieties"] = {
description = "{{{langname}}} moieties that alternate every generation.",
parents = {"moieties"},
}
labels["ideophones"] = {
description = "{{{langname}}} terms that evoke an idea, especially a sensation or impression, with a sound.",
parents = {"lemmas"},
}
labels["imperfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as ongoing or continuous, as opposed to completed events.",
parents = {"verbs"},
}
labels["impersonal verbs"] = {
description = "{{{langname}}} verbs that do not indicate actions, occurrences or states of any specific grammatical subject.",
parents = {"verbs"},
}
labels["inchoative verbs"] = {
description = "{{{langname}}} verbs that indicate the beginning of an action or event.",
parents = {"verbs"},
}
labels["indefinite adjectives"] = {
description = "{{{langname}}} adjectives that refer to unspecified adjective meanings.",
parents = {"adjectives", {name = "indefinite pro-forms", sort = "adjectives"}},
}
labels["indefinite adverbs"] = {
description = "{{{langname}}} adverbs that refer to unspecified adverbial meanings.",
parents = {"adverbs", {name = "indefinite pro-forms", sort = "adverbs"}},
}
labels["indefinite determiners"] = {
description = "{{{langname}}} determiners that designate an unidentified noun.",
parents = {"determiners", {name = "indefinite pro-forms", sort = "determiners"}},
}
labels["indefinite pronouns"] = {
description = "{{{langname}}} pronouns that refer to unspecified nouns.",
parents = {"pronouns", {name = "indefinite pro-forms", sort = "pronouns"}},
}
labels["infixes"] = {
description = "Affixes inserted inside {{{langname}}} words.",
parents = {"morphemes"},
}
labels["inflectional prefixes"] = {
description = "{{{langname}}} prefixes that are used as inflectional beginnings in noun, adjective or verb paradigms.",
parents = {"prefixes"},
}
labels["inflectional suffixes"] = {
description = "{{{langname}}} suffixes that are used as inflectional endings in noun, adjective or verb paradigms.",
parents = {"suffixes"},
}
labels["intensive verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed vigorously, enthusiastically, forcefully or to an otherwise enlarged extent.",
parents = {"verbs"},
}
labels["interfixes"] = {
description = "Affixes used to join two {{{langname}}} words or morphemes together.",
parents = {"morphemes"},
}
labels["interjections"] = {
description = "{{{langname}}} terms that express emotions, sounds, etc. as exclamations.",
parents = {"lemmas"},
}
labels["interrogative adjectives"] = {
description = "{{{langname}}} adjectives that indicate questions.",
parents = {"adjectives", {name = "interrogative pro-forms", sort = "adjectives"}},
}
labels["interrogative adverbs"] = {
description = "{{{langname}}} adverbs that indicate questions.",
parents = {"adverbs", {name = "interrogative pro-forms", sort = "adverbs"}},
}
labels["interrogative determiners"] = {
description = "{{{langname}}} determiners that indicate questions.",
parents = {"determiners", {name = "interrogative pro-forms", sort = "determiners"}},
}
labels["interrogative particles"] = {
description = "{{{langname}}} particles that indicate questions.",
parents = {"particles", {name = "interrogative pro-forms", sort = "particles"}},
}
labels["interrogative pronouns"] = {
description = "{{{langname}}} pronouns that indicate questions.",
parents = {"pronouns", {name = "interrogative pro-forms", sort = "pronouns"}},
}
labels["intransitive verbs"] = {
description = "{{{langname}}} verbs that don't require any grammatical objects.",
parents = {"verbs"},
}
labels["iterative verbs"] = {
description = "{{{langname}}} verbs that express the repetition of an event.",
parents = {"imperfective verbs", "verbs"},
}
labels["location adverbs"] = {
description = "{{{langname}}} adverbs that indicate location.",
parents = {"adverbs"},
}
labels["male equivalent nouns"] = {
description = "{{{langname}}} nouns that refer to male beings with the same characteristics as the base noun.",
parents = {"nouns with other-gender equivalents"},
}
labels["manner adverbs"] = {
description = "{{{langname}}} adverbs that indicate the manner, way or style in which an action is performed.",
parents = {"adverbs"},
}
labels["modal adverbs"] = {
description = "{{{langname}}} adverbs that express [[w:Linguistic modality|linguistic modality]], indicating the mood or attitude of the speaker with respect to what is being said.",
parents = {"sentence adverbs"},
}
labels["modal particles"] = {
description = "{{{langname}}} particles that reflect the mood or attitude of the speaker, without changing the basic meaning of the sentence.",
parents = {"particles"},
}
labels["modal verbs"] = {
description = "{{{langname}}} verbs that indicate [[grammatical mood]].",
parents = {"auxiliary verbs"},
}
labels["moieties"] = {
description = "{{{langname}}} pairs of abstract categories separating people and the environment.",
parents = {"lemmas"},
}
labels["momentane verbs"] = {
description = "{{{langname}}} verbs that express a sudden and brief action.",
parents = {"perfective verbs", "verbs"},
}
labels["morphemes"] = {
description = "{{{langname}}} word-elements used to form full words.",
parents = {"lemmas"},
}
labels["movement adverbs"] = {
description = "{{{langname}}} adverbs that express movement in space, such as (in English) [[hither]], [[that way]], [[down]] and [[eastwards]].",
additional = "Compare [[:Category:{{{langname}}} position adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Position adverbs by language]].",
},
}
labels["multiword terms"] = {
description = "{{{langname}}} lemmas that are a combination of multiple words, including [[WT:CFI#Idiomaticity|idiomatic]] combinations.",
parents = {"lemmas"},
}
labels["negative verbs"] = {
description = "{{{langname}}} verbs that indicate the lack of an action.",
parents = {"verbs"},
}
labels["negative particles"] = {
description = "{{{langname}}} particles that indicate negation.",
parents = {"particles"},
}
labels["negative pronouns"] = {
description = "{{{langname}}} pronouns that refer to negative or non-existent references.",
parents = {"pronouns"},
}
labels["nominalized adjectives"] = {
description = "{{{langname}}} adjectives that are used as nouns.",
parents = {"nouns", "adjectives"},
}
labels["nominalized present participles"] = {
description = "{{{langname}}} present participles that are used as nouns.",
parents = {"nouns", "present participles"},
}
labels["non-constituents"] = {
description = "{{{langname}}} terms that are not grammatical [[constituent#Noun|constituents]], and therefore need to be combined with additional terms to form a complete phrase.",
parents = {"phrases"},
}
labels["noun prefixes"] = {
description = "{{{langname}}} prefixes attached to a noun that display its noun class.",
parents = {"prefixes"},
}
labels["nouns"] = {
description = "{{{langname}}} terms that indicate people, beings, things, places, phenomena, qualities or ideas.",
parents = {"lemmas"},
}
labels["nouns by classifier"] = {
description = "{{{langname}}} nouns organized by the classifier they are used with.",
parents = {{name = "nouns", sort = "classifier"}},
}
labels["numerals"] = {
description = "{{{langname}}} terms that quantify nouns.",
parents = {"lemmas"},
}
labels["object concords"] = {
description = "{{{langname}}} concords used to show the grammatical object.",
parents = {"concords"},
}
labels["object pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical objects.",
parents = {"pronouns"},
}
labels["particles"] = {
description = "{{{langname}}} terms that do not belong to any of the inflected grammatical word classes, often lacking their own grammatical functions and forming other parts of speech or expressing the relationship between clauses.",
parents = {"lemmas"},
}
labels["perfective verbs"] = {
description = "{{{langname}}} verbs that express actions considered as completed events, as opposed to ongoing or continuous.",
parents = {"verbs"},
}
labels["personal pronouns"] = {
description = "{{{langname}}} pronouns that are used as substitutes for known nouns.",
parents = {"pronouns"},
}
labels["phrasal verbs"] = {
description = "{{{langname}}} verbs accompanied by particles, such as prepositions and adverbs.",
parents = {"verbs", "phrases"},
}
labels["phrasal prepositions"] = {
description = "{{{langname}}} prepositions formed with combinations of other terms.",
parents = {"prepositions", "phrases"},
}
labels["pluralia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the plural form.",
parents = {"nouns"},
}
labels["point-in-time adverbs"] = {
description = "{{{langname}}} adverbs that reference a specific point in time, e.g. {{m|en|yesterday}}, {{m+|es|anoche||last night}} or {{m+|hu|egykor||at one o'clock}}.",
parents = {"time adverbs"},
}
labels["position adverbs"] = {
description = "{{{langname}}} adverbs that express position in space, such as (in English) [[here]], [[next door]], [[cater-corner]] and [[on deck]].",
additional = "Compare [[:Category:{{{langname}}} movement adverbs]].",
parents = {"location adverbs"},
umbrella = {
additional = "Compare [[:Category:Movement adverbs by language]].",
},
}
labels["possessable nouns"] = {
description = "{{{langname}}} nouns that can have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that can have their possession indicated directly by possessive pronouns and, in some languages, be transformed into adjectives.",
},
}
labels["possessional adjectives"] = {
description = "{{{langname}}} adjectives that indicate that a noun is in possession of something.",
parents = {"adjectives"},
}
labels["possessive adjectives"] = {
description = "{{{langname}}} adjectives that indicate ownership.",
parents = {"adjectives"},
}
labels["possessive concords"] = {
description = "{{{langname}}} concords used to show possession.",
parents = {"concords"},
}
labels["possessive determiners"] = {
description = "{{{langname}}} determiners that indicate ownership.",
parents = {"determiners"},
}
labels["possessive pronouns"] = {
description = "{{{langname}}} pronouns that indicate ownership.",
parents = {"pronouns"},
}
labels["postpositional phrases"] = {
description = "{{{langname}}} phrases headed by a postposition.",
parents = {"phrases", "postpositions"},
}
labels["postpositions"] = {
description = "{{{langname}}} adpositions that are placed after their objects.",
parents = {"lemmas"},
}
labels["predicatives"] = {
description = "{{{langname}}} elements of the predicate that supplement the subject or object of a sentence via the verb.",
parents = {"lemmas"},
}
labels["prefixes"] = {
description = "Affixes attached to the beginning of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["prepositional phrases"] = {
description = "{{{langname}}} phrases headed by a preposition.",
parents = {"phrases", "prepositions"},
}
labels["prepositions"] = {
description = "{{{langname}}} adpositions that are placed before their objects.",
parents = {"lemmas"},
}
labels["matrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's mother.",
parents = {"moieties"},
}
labels["patrilineal moieties"] = {
description = "{{{langname}}} moieties inherited from an individual's father.",
parents = {"moieties"},
}
labels["pejorative suffixes"] = {
description = "{{{langname}}} suffixes that [[belittle]] (lessen in value).",
parents = {"suffixes"},
}
labels["prenouns"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to nouns.",
parents = {"prefixes"},
}
labels["preverbs"] = {
description = "{{{langname}}} prefixes of various kinds that are attached to verbs.",
parents = {"prefixes"},
}
labels["privative verbs"] = {
description = "{{{langname}}} verbs that indicate that the grammatical object is deprived of something or that something is removed from the object.",
parents = {"verbs"},
}
labels["pronominal adverbs"] = {
description = "{{{langname}}} adverbs that are formed by combining a pronoun with a preposition.",
parents = {"adverbs", "prepositions", "pronouns"},
}
labels["pronominal concords"] = {
description = "{{{langname}}} concords that are prefixed to pronominal stems.",
parents = {"concords"},
}
labels["pronouns"] = {
description = "{{{langname}}} terms that refer to and substitute nouns.",
parents = {"lemmas"},
}
labels["proper nouns"] = {
description = "{{{langname}}} nouns that indicate individual entities, such as names of persons, places or organizations.",
parents = {"nouns"},
}
labels["raising verbs"] = {
description = "{{{langname}}} verbs that, in a matrix or main clause, take an argument from an embedded or subordinate clause; in other words, a raising verb appears with a syntactic argument that is not its semantic argument, but is rather the semantic argument of an embedded predicate.",
parents = {"verbs"},
}
labels["reciprocal pronouns"] = {
description = "{{{langname}}} pronouns that refer back to a plural subject and express an action done in two or more directions.",
parents = {"pronouns", "personal pronouns"},
}
labels["reciprocal verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from multiple subjects to each other.",
parents = {"verbs"},
}
labels["reflexive pronouns"] = {
description = "{{{langname}}} pronouns that refer back to the subject.",
parents = {"pronouns", "personal pronouns"},
}
labels["reflexive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed from the grammatical subjects to themselves.",
parents = {"verbs"},
}
labels["relational adjectives"] = {
description = "{{{langname}}} adjectives that stand in place of a noun when modifying another noun.",
parents = {"adjectives"},
}
labels["relational nouns"] = {
description = "{{{langname}}} nouns used to indicate a relation between other two nouns by means of possession.",
parents = {"nouns"},
}
labels["relative adjectives"] = {
description = "{{{langname}}} adjectives used to indicate [[relative clause]]s.",
parents = {"adjectives", {name = "relative pro-forms", sort = "adjectives"}},
}
labels["relative adverbs"] = {
description = "{{{langname}}} adverbs used to indicate [[relative clause]]s.",
parents = {"adverbs", {name = "relative pro-forms", sort = "adverbs"}},
}
labels["relative determiners"] = {
description = "{{{langname}}} determiners used to indicate [[relative clause]]s.",
parents = {"determiners", {name = "relative pro-forms", sort = "determiners"}},
}
labels["relative concords"] = {
description = "{{{langname}}} concords that are prefixed to relative stems.",
parents = {"concords"},
}
labels["relative pronouns"] = {
description = "{{{langname}}} pronouns used to indicate [[relative clause]]s.",
parents = {"pronouns", {name = "relative pro-forms", sort = "pronouns"}},
}
labels["relatives"] = {
description = "{{{langname}}} terms that give attributes to nouns, acting grammatically as relative clauses.",
parents = {"lemmas"},
}
labels["repetitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions or events which are performed or occur again, anew or differently.",
parents = {"verbs"},
}
labels["resultative verbs"] = {
description = "{{{langname}}} verbs that indicate a result of some action",
parents = {"verbs"},
}
labels["reversative verbs"] = {
description = "{{{langname}}} verbs that indicate that the reversal or undoing of an action, event or state.",
parents = {"verbs"},
}
labels["saturative verbs"] = {
description = "{{{langname}}} verbs which indicate that an action is performed to the point of saturation or satisfaction.",
parents = {"verbs"},
}
labels["semelfactive verbs"] = {
description = "{{{langname}}} verbs that are punctual (instantaneous, momentive), perfective (treated as a unitary whole with no explicit internal temporal structure), and telic (having a boundary out of which the activity cannot be said to have taken place or continue).",
parents = {"perfective verbs", "verbs"},
}
labels["sentence adverbs"] = {
description = "{{{langname}}} adverbs that modify an entire clause or sentence.",
parents = {"adverbs"},
}
labels["sequence adverbs"] = {
description = "{{{langname}}} conjunctive adverbs that express sequence in space or time.",
parents = {"conjunctive adverbs"},
}
labels["simulfixes"] = {
description = "Affixes replacing positions in {{{langname}}} words.",
parents = {"morphemes"},
}
labels["singulative nouns"] = {
description = "{{{langname}}} nouns that indicate a single item of a group of related things or beings.",
parents = {"nouns"},
}
labels["singularia tantum"] = {
description = "{{{langname}}} nouns that are mostly or exclusively used in the singular form.",
parents = {"nouns"},
}
labels["solitary pronouns"] = {
description = "{{{langname}}} pronouns that refer to specific people in particular and sets them apart from anyone else.",
parents = {"pronouns", "personal pronouns"},
}
labels["stative verbs"] = {
description = "{{{langname}}} verbs that define a state with no or insignificant internal dynamics.",
parents = {"verbs"},
}
labels["stems"] = {
description = "Morphemes from which {{{langname}}} words are formed.",
parents = {"morphemes"},
}
labels["subordinating conjunctions"] = {
description = "{{{langname}}} conjunctions that indicate relations of syntactic dependence between connected items.",
parents = {"conjunctions"},
}
labels["subject concords"] = {
description = "{{{langname}}} concords used to show the grammatical subject.",
parents = {"concords"},
}
labels["subject pronouns"] = {
description = "{{{langname}}} pronouns that refer to grammatical subjects.",
parents = {"pronouns"},
}
labels["suffixes"] = {
description = "Affixes attached to the end of {{{langname}}} words.",
parents = {"morphemes"},
}
labels["splitting verbs"] = {
description = "{{{langname}}} bisyllabic verbs that obligatorily split around a direct object or pronoun.",
parents = {"verbs"},
}
labels["terminative verbs"] = {
description = "{{{langname}}} verbs that indicate that an action or event ceases.",
parents = {"verbs"},
}
labels["time adverbs"] = {
description = "{{{langname}}} adverbs that indicate time, expressing either [[duration]], [[frequency]] or a [[point]] in [[time]].",
parents = {"adverbs"},
}
labels["transfixes"] = {
description = "Discontinuous affixes inserted within a word root.",
parents = {"morphemes"},
}
labels["transformative verbs"] = {
description = "{{{langname}}} verbs that indicate a change of state or nature, in the subject for intransitive verbs and in the object for transitive verbs.",
parents = {"verbs"},
}
labels["transitive verbs"] = {
description = "{{{langname}}} verbs that indicate actions, occurrences or states directed to one or more grammatical objects.",
parents = {"verbs"},
}
labels["uncomparable adjectives"] = {
description = "{{{langname}}} adjectives that are not inflected to display different degrees of comparison.",
parents = {"adjectives"},
}
labels["uncomparable adverbs"] = {
description = "{{{langname}}} adverbs that are not inflected to display different degrees of comparison.",
parents = {"adverbs"},
}
labels["uncountable nouns"] = {
description = "{{{langname}}} nouns that indicate qualities, ideas, unbounded mass or other abstract concepts that cannot be quantified directly by numerals.",
parents = {"nouns"},
}
labels["uncountable numerals"] = {
description = "{{{langname}}} numerals that cannot be quantified directly by other numerals.",
parents = {"numerals"},
}
labels["uncountable proper nouns"] = {
description = "{{{langname}}} proper nouns that cannot be quantified directly by numerals.",
parents = {"proper nouns"},
}
labels["uncountable suffixes"] = {
description = "{{{langname}}} suffixes that can be used to form nouns that cannot be quantified directly by numerals.",
parents = {"suffixes"},
}
labels["unpossessable nouns"] = {
description = "{{{langname}}} nouns that cannot have their possession indicated directly by possessive pronouns.",
parents = {"nouns"},
umbrella = {
description = "Categories with nouns that cannot have their possession indicated directly by possessive pronouns or, in some languages, be transformed into adjectives.",
},
}
labels["verbal nouns"] = {
description = "{{{langname}}} nouns morphologically related to a verb and similar to it in meaning.",
parents = {"nouns"},
}
labels["verbal adjectives"] = {
description = "{{{langname}}} adjectives describing the condition or state resulting from the action of the corresponding verb.",
parents = {"adjectives"},
}
-----------------------------------------------------------------------------
labels["verbs"] = {
description = "{{{langname}}} terms that indicate actions, occurrences or states.",
parents = {"lemmas"},
}
for _, voice in pairs{
"active",
"middle",
"passive",
} do
labels[voice .. " verbs"] = {
description = "{{{langname}}} verbs that are predominantly used in the {{w|" .. voice .. " voice}}.",
parents = {"verbs"},
}
local voice_only = voice .. "-only"
labels[voice_only .. " verbs"] = {
breadcrumb = voice_only,
description = "{{{langname}}} verbs that can only be used in the {{w|" .. voice .. " voice}}.",
parents = {voice .. " verbs", "verbs"},
}
end
labels["verbs of movement"] = {
description = "{{{langname}}} verbs that indicate physical movement of the grammatical subject across a trajectory, with a starting point and an endpoint.",
parents = {"verbs"},
}
-----------------------------------------------------------------------------
for pos, desc in pairs{
["prepositions"] = "following",
["postpositions"] = "preceding"
} do
for _, case in ipairs{
"ablative",
"accusative",
"dative",
"genitive",
"instrumental",
"locative",
"nominative",
"prepositional",
"vocative",
} do
labels[pos .. " governing the " .. case] = {
breadcrumb = ucfirst(case),
description = ("{{{langname}}} %s that cause the %s noun to be in the %s case."):format(pos, desc, case),
parents = {pos},
}
end
end
-- Add "X-only categories for degrees.
for _, pos in pairs{
"adjectives",
"adverbs",
"determiners",
"pronouns",
} do
for _, degree in pairs{
"comparative",
"superlative",
"elative",
"exaggerated",
"excessive",
"equative",
} do
local degree_only = degree .. "-only"
labels[degree_only .. " " .. pos] = {
breadcrumb = degree_only,
description = "{{{langname}}} " .. pos .. " that are only used in the " .. degree .. " degree.",
parents = {pos},
}
end
end
-- Add "POS-forming suffixes".
for _, pos in pairs{
"adjective",
"adverb",
"noun",
"numeral",
"participle",
"pronoun",
"proper noun",
"verb",
} do
labels[pos .. "-forming suffixes"] = {
description = "{{{langname}}} suffixes that are used to derive " .. pos .. "s from other words.",
parents = {"derivational suffixes"},
}
end
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Lemmas subcategories by language"] = {
description = "Umbrella categories covering topics related to lemmas.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "lemmas", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Handler for e.g. [[:Category:English phrasal verbs formed with "aback"]].
table.insert(handlers, function(data)
local particle = data.label:match("^phrasal verbs formed with \"(.-)\"$")
if particle then
local tagged_text = require("Module:script utilities").tag_text(particle, data.lang, nil, "term")
local link = require("Module:links").full_link({ term = particle, lang = data.lang }, "term")
return {
description = "{{{langname}}} {{w|phrasal verb}}s formed with the adverb or preposition " .. link .. ".",
displaytitle = '{{{langname}}} phrasal verbs formed with "' .. particle .. '"',
breadcrumb = tagged_text,
parents = {{ name = "phrasal verbs", sort = particle }},
umbrella = false,
}
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
m71et4r44t927l9rcq6ntu20wlgkf10
मॉड्यूल:category tree/lemmas
828
306965
487820
2026-09-02T19:24:51Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/lemmas]] को [[मॉड्यूल:category tree/लेम्मा]] पर स्थानांतरित किया
487820
Scribunto
text/plain
return require [[मॉड्यूल:category tree/लेम्मा]]
j8wt9eokef7m2zzpx9itaykjnw3rp5a
मॉड्यूल:category tree/नाम
828
306966
487821
2026-09-02T19:26:38Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487821
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local names_module = "Module:names"
local en_utilities_module = "Module:en-utilities"
local pluralize = require(en_utilities_module).pluralize
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["names"] = {
description = "{{{langname}}} terms that are used to refer to specific individuals or groups.",
additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].",
umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "},
parents = {"terms by semantic function", "proper nouns"},
}
------------------------------------------- given names -------------------------------------------
local human_genders = {
["male"] = "to male individuals",
["female"] = "to female individuals",
["unisex"] = "either to male or to female individuals",
}
for gender, props in pairs(require(names_module).given_name_genders) do
if gender ~= "unknown-gender" then
local is_animal = props.type == "animal"
local cat = is_animal and gender .. " names" or gender .. " given names"
local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender]
local function do_cat(cat, desc, breadcrumb, parents)
labels[cat] = {
description = "{{{langname}}} " .. desc .. ".",
breadcrumb = breadcrumb,
parents = parents,
}
end
for _, dimaug in ipairs { "diminutive", "augmentative" } do
do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug,
{gender .. " given names", dimaug .. " nouns"})
end
do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and
"animal names") or "given names")
if not is_animal then
do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"})
end
end
end
labels["given names"] = {
description = "{{{langname}}} names given to individuals.",
parents = {"names"},
}
labels["skin names"] = {
description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.",
parents = {"proper nouns", "names"},
}
------------------------------------------- surnames -------------------------------------------
labels["common-gender surnames"] = {
description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.",
breadcrumb = "common-gender",
parents = {"surnames"},
}
labels["female surnames"] = {
description = "{{{langname}}} names shared by female family members.",
breadcrumb = "female",
parents = {"surnames"},
}
labels["male surnames"] = {
description = "{{{langname}}} names shared by male family members.",
breadcrumb = "male",
parents = {"surnames"},
}
labels["surnames"] = {
description = "{{{langname}}} names shared by family members.",
parents = {"names"},
}
for _, nymics in ipairs { "matronymics", "patronymics" } do
local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or
"father, grandfather or earlier male ancestor"
labels["common-gender " .. nymics] = {
description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."):
format(ancestor, nymics),
breadcrumb = "common-gender",
parents = {nymics},
}
labels["female " .. nymics] = {
description = ("{{{langname}}} names used by women to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "female",
parents = {nymics},
}
labels["male " .. nymics] = {
description = ("{{{langname}}} names used by men to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "male",
parents = {nymics},
}
labels[nymics] = {
description = ("{{{langname}}} names indicating a person's %s."):format(ancestor),
parents = {"names"},
}
end
labels["nomina gentilia"] = {
description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].",
parents = {"names"},
}
------------------------------------------- misc -------------------------------------------
labels["exonyms"] = {
description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.",
parents = {"names"},
}
labels["renderings of foreign personal names"] = {
description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.",
parents = {"names"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Names subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Names subcategories by language"] = {
description = "Umbrella categories covering topics related to names.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "names", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function source_name_to_source(nametype, source_name)
local special_sources
if nametype:find("given names") then
special_sources = require("Module:table").listToSet {
"surnames", "place names", "coinages", "the Bible", "month names"
}
elseif nametype:find("surnames") then
special_sources = require("Module:table").listToSet {
"given names", "place names", "occupations", "patronymics", "matronymics",
"common nouns", "nicknames", "ethnonyms"
}
else
special_sources = {}
end
if special_sources[source_name] then
return source_name
else
return require("Module:languages").getByCanonicalName(source_name, nil,
"allow etym langs", "allow families")
end
end
local function get_source_text(source)
if type(source) == "table" then
return source:getDisplayForm()
else
return source
end
end
local function get_description(lang, nametype, source)
local origintext, addltext
if source == "surnames" then
origintext = "transferred from surnames"
elseif source == "given names" then
origintext = "transferred from given names"
elseif source == "nicknames" then
origintext = "transferred from nicknames"
elseif source == "place names" then
origintext = "transferred from place names"
addltext = " For place names that are also surnames, see " .. (
lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or
"[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]"
) .. "."
elseif source == "common nouns" then
origintext = "transferred from common nouns"
elseif source == "month names" then
origintext = "transferred from month names"
elseif source == "coinages" then
origintext = "originating as coinages"
addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages."
elseif source == "occupations" then
origintext = "originating as occupations"
elseif source == "patronymics" then
origintext = "originating as patronymics"
elseif source == "matronymics" then
origintext = "originating as matronymics"
elseif source == "ethnonyms" then
origintext = "originating as ethnonyms"
elseif source == "the Bible" then
-- Hack esp. for Hawaiian names. We should consider changing them to
-- have the source as Biblical Hebrew and mention the derivation from
-- the Bible some other way.
origintext = "originating from the Bible"
elseif type(source) == "string" then
error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased")
else
origintext = "of " .. source:makeCategoryLink() .. " origin"
if lang and source:getCode() == lang:getCode() then
addltext = " These are names derived from common nouns, local mythology, etc."
end
end
local introtext
if lang then
introtext = "{{{langname}}} "
else
introtext = "Categories with "
end
return introtext .. nametype .. " " .. origintext ..
". (This includes names derived at an older stage of the language.)" .. (addltext or "")
end
-- If one of the following families occurs in any of the ancestral families
-- of a given language, use it instead of the three-letter parent
-- (or immediate parent if no three-letter parent).
local high_level_families = require("Module:table").listToSet {
-- Indo-European
"gem", -- Germanic (for gme, gmq, gmw)
"inc", -- Indic (for e.g. pra = Prakrit)
"ine-ana", -- Anatolian (don't keep going to ine)
"ine-toc", -- Tocharian (don't keep going to ine)
"ira", -- Iranian (for e.g. xme = Median, xsc = Scythian)
"sla", -- Slavic (for zle, zls, zlw)
-- Other
"ath", -- Athabaskan (for e.g. apa = Apachean)
"poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian)
"cau-nwc", -- Northwest Caucasian
"cau-nec", -- Northeast Caucasian
}
local function find_high_level_family(lang)
local family = lang:getFamily()
-- (1) If no family, return nil (e.g. for Pictish).
if not family then
return nil
end
-- (2) See if any ancestor family is in `high_level_families`.
-- if so, return it.
local high_level_family = family
while high_level_family do
local high_level_code = high_level_family:getCode()
if high_level_code == "qfa-not" then
-- "not a family"; its own parent, causing an infinite loop.
-- Break rather than return so we get categories like
-- [[Category:English female given names from sign languages]] and
-- [[Category:English female given names from constructed languages]].
break
end
if high_level_families[high_level_code] then
return high_level_family
end
high_level_family = high_level_family:getFamily()
end
-- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family.
-- If so, return it.
local basic_family = family:getCode():match("^(.-)%-.*$")
if basic_family then
basic_family = require("Module:families").getByCode(basic_family)
if basic_family then
return basic_family
end
end
-- (4) Fall back to just the family itself.
return family
end
local function match_gendered_nametype(nametype)
local gender, label = nametype:match("^(f?e?male) (given names)$")
if not gender then
gender, label = nametype:match("^(unisex) (given names)$")
end
if gender then
return gender, label
end
end
local function get_parents(lang, nametype, source)
local parents = {}
if lang then
table.insert(parents, {name = nametype, sort = get_source_text(source)})
if type(source) == "table" then
table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "})
-- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for
-- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages"
-- (skipping over West Germanic languages).
--
-- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for
-- "French male given names from Gascon", put it in a parent category "French male given names from Occitan".
--
-- If the source is a family, put it in a parent category for the parent family.
if source:hasType("family") then
local parent_family = source:getFamily()
if parent_family and parent_family:getCode() ~= "qfa-not" then
table.insert(parents, {
name = nametype .. " from " .. parent_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
elseif source:hasType("etymology-only") then
local source_parent = source:getFull()
if source_parent and source_parent:getCode() ~= "und" then
table.insert(parents, {
name = nametype .. " from " .. source_parent:getDisplayForm(),
sort = source:getCanonicalName()
})
end
else
local high_level_family = find_high_level_family(source)
if high_level_family then -- may not exist, e.g. for Pictish
table.insert(parents,
{name = nametype .. " from " .. high_level_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
end
end
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender})
end
else
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "})
elseif type(source) == "table" then
-- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories
-- 'Terms derived from SOURCE'.
local first_umbrella_parent =
source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or
source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or
{name = source:getCategoryName(), raw = true, sort = nametype}
table.insert(parents, first_umbrella_parent)
end
table.insert(parents, "Names subcategories by language")
end
return parents
end
table.insert(handlers, function(data)
local nametype, source_name = data.label:match("^(.*names) from (.+)$")
if nametype then
local personal_name_type_set = require(names_module).personal_name_type_set
if not personal_name_type_set[nametype] then
return nil
end
local source = source_name_to_source(nametype, source_name)
if not source then
return nil
end
return {
description = get_description(data.lang, nametype, source),
breadcrumb = "from " .. get_source_text(source),
parents = get_parents(data.lang, nametype, source),
umbrella = {
description = get_description(nil, nametype, source),
parents = get_parents(nil, nametype, source),
},
}
end
end)
-- Handler for e.g. 'English renderings of Russian male given names'.
table.insert(handlers, function(data)
local label = data.label:match("^renderings of (.*)$")
if label then
local personal_name_types = require(names_module).personal_name_types
for _, nametype in ipairs(personal_name_types) do
local sourcename = label:match("^(.+) " .. nametype .. "$")
if sourcename then
local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym")
if source then
return {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.",
lang = data.lang,
breadcrumb = sourcename .. " " .. nametype,
parents = {
{ name = "renderings of foreign personal names", sort = sourcename },
{ name = nametype, lang = source:getCode(), sort = "{{{langname}}}" },
},
umbrella = {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.",
parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}},
},
}
end
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
nka9xy2he55k31c1lpud70iamgc4u5s
487822
487821
2026-09-02T19:26:48Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/names]] को [[मॉड्यूल:category tree/नाम]] पर स्थानांतरित किया
487821
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local names_module = "Module:names"
local en_utilities_module = "Module:en-utilities"
local pluralize = require(en_utilities_module).pluralize
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
labels["names"] = {
description = "{{{langname}}} terms that are used to refer to specific individuals or groups.",
additional = "Place names, demonyms and other kinds of names can be found in [[:Category:Names]].",
umbrella_parents = {name = "terms by semantic function", is_label = true, sort = " "},
parents = {"terms by semantic function", "proper nouns"},
}
------------------------------------------- given names -------------------------------------------
local human_genders = {
["male"] = "to male individuals",
["female"] = "to female individuals",
["unisex"] = "either to male or to female individuals",
}
for gender, props in pairs(require(names_module).given_name_genders) do
if gender ~= "unknown-gender" then
local is_animal = props.type == "animal"
local cat = is_animal and gender .. " names" or gender .. " given names"
local desc = is_animal and " given to [[" .. gender .. "|" .. pluralize(gender) .. "]]" or " given " .. human_genders[gender]
local function do_cat(cat, desc, breadcrumb, parents)
labels[cat] = {
description = "{{{langname}}} " .. desc .. ".",
breadcrumb = breadcrumb,
parents = parents,
}
end
for _, dimaug in ipairs { "diminutive", "augmentative" } do
do_cat(dimaug .. "s of " .. cat, dimaug .. " names " .. desc, dimaug,
{gender .. " given names", dimaug .. " nouns"})
end
do_cat(cat, "names " .. desc, gender, is_animal and (gender == "animal" and "names" or is_animal and
"animal names") or "given names")
if not is_animal then
do_cat(gender .. " skin names", "skin names " .. desc, gender, {"skin names"})
end
end
end
labels["given names"] = {
description = "{{{langname}}} names given to individuals.",
parents = {"names"},
}
labels["skin names"] = {
description = "{{{langname}}} terms given at birth that are used to refer to individuals from specific marital classes.",
parents = {"proper nouns", "names"},
}
------------------------------------------- surnames -------------------------------------------
labels["common-gender surnames"] = {
description = "{{{langname}}} names shared by both male and female family members, in languages that distinguish male and female surnames.",
breadcrumb = "common-gender",
parents = {"surnames"},
}
labels["female surnames"] = {
description = "{{{langname}}} names shared by female family members.",
breadcrumb = "female",
parents = {"surnames"},
}
labels["male surnames"] = {
description = "{{{langname}}} names shared by male family members.",
breadcrumb = "male",
parents = {"surnames"},
}
labels["surnames"] = {
description = "{{{langname}}} names shared by family members.",
parents = {"names"},
}
for _, nymics in ipairs { "matronymics", "patronymics" } do
local ancestor = nymics == "matronymics" and "mother, grandmother or earlier female ancestor" or
"father, grandfather or earlier male ancestor"
labels["common-gender " .. nymics] = {
description = ("{{{langname}}} names used by both men and women to indicate their %s, in languages that distinguish male and female %s."):
format(ancestor, nymics),
breadcrumb = "common-gender",
parents = {nymics},
}
labels["female " .. nymics] = {
description = ("{{{langname}}} names used by women to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "female",
parents = {nymics},
}
labels["male " .. nymics] = {
description = ("{{{langname}}} names used by men to indicate their %s."):
format(ancestor, nymics),
breadcrumb = "male",
parents = {nymics},
}
labels[nymics] = {
description = ("{{{langname}}} names indicating a person's %s."):format(ancestor),
parents = {"names"},
}
end
labels["nomina gentilia"] = {
description = "{{{langname}}} \"[[family name]]s\" (singular ''[[nomen gentile]]'') in a [[w:Roman naming convention|convential Roman name]].",
parents = {"names"},
}
------------------------------------------- misc -------------------------------------------
labels["exonyms"] = {
description = "{{{langname}}} [[exonym]]s, i.e. terms for toponyms whose name in {{{langname}}} is different from the name in the source language.",
parents = {"names"},
}
labels["renderings of foreign personal names"] = {
description = "{{{langname}}} transliterations, respellings or other renderings of foreign personal names.",
parents = {"names"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Names subcategories by language"
end
end
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Names subcategories by language"] = {
description = "Umbrella categories covering topics related to names.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"Umbrella metacategories",
{name = "names", is_label = true, sort = " "},
},
}
-----------------------------------------------------------------------------
-- --
-- HANDLERS --
-- --
-----------------------------------------------------------------------------
local function source_name_to_source(nametype, source_name)
local special_sources
if nametype:find("given names") then
special_sources = require("Module:table").listToSet {
"surnames", "place names", "coinages", "the Bible", "month names"
}
elseif nametype:find("surnames") then
special_sources = require("Module:table").listToSet {
"given names", "place names", "occupations", "patronymics", "matronymics",
"common nouns", "nicknames", "ethnonyms"
}
else
special_sources = {}
end
if special_sources[source_name] then
return source_name
else
return require("Module:languages").getByCanonicalName(source_name, nil,
"allow etym langs", "allow families")
end
end
local function get_source_text(source)
if type(source) == "table" then
return source:getDisplayForm()
else
return source
end
end
local function get_description(lang, nametype, source)
local origintext, addltext
if source == "surnames" then
origintext = "transferred from surnames"
elseif source == "given names" then
origintext = "transferred from given names"
elseif source == "nicknames" then
origintext = "transferred from nicknames"
elseif source == "place names" then
origintext = "transferred from place names"
addltext = " For place names that are also surnames, see " .. (
lang and "[[:Category:{{{langname}}} " .. nametype .. " from surnames]]" or
"[[:Category:" .. mw.getContentLanguage():ucfirst(nametype) .. " from surnames by language]]"
) .. "."
elseif source == "common nouns" then
origintext = "transferred from common nouns"
elseif source == "month names" then
origintext = "transferred from month names"
elseif source == "coinages" then
origintext = "originating as coinages"
addltext = " These are names of artificial origin, names based on fictional characters, combinations of two words or names or backward spellings. Names of uncertain origin can also be placed here if there is a strong suspicion that they are coinages."
elseif source == "occupations" then
origintext = "originating as occupations"
elseif source == "patronymics" then
origintext = "originating as patronymics"
elseif source == "matronymics" then
origintext = "originating as matronymics"
elseif source == "ethnonyms" then
origintext = "originating as ethnonyms"
elseif source == "the Bible" then
-- Hack esp. for Hawaiian names. We should consider changing them to
-- have the source as Biblical Hebrew and mention the derivation from
-- the Bible some other way.
origintext = "originating from the Bible"
elseif type(source) == "string" then
error("Internal error: Unrecognized string source \"" .. source .. "\", should be special-cased")
else
origintext = "of " .. source:makeCategoryLink() .. " origin"
if lang and source:getCode() == lang:getCode() then
addltext = " These are names derived from common nouns, local mythology, etc."
end
end
local introtext
if lang then
introtext = "{{{langname}}} "
else
introtext = "Categories with "
end
return introtext .. nametype .. " " .. origintext ..
". (This includes names derived at an older stage of the language.)" .. (addltext or "")
end
-- If one of the following families occurs in any of the ancestral families
-- of a given language, use it instead of the three-letter parent
-- (or immediate parent if no three-letter parent).
local high_level_families = require("Module:table").listToSet {
-- Indo-European
"gem", -- Germanic (for gme, gmq, gmw)
"inc", -- Indic (for e.g. pra = Prakrit)
"ine-ana", -- Anatolian (don't keep going to ine)
"ine-toc", -- Tocharian (don't keep going to ine)
"ira", -- Iranian (for e.g. xme = Median, xsc = Scythian)
"sla", -- Slavic (for zle, zls, zlw)
-- Other
"ath", -- Athabaskan (for e.g. apa = Apachean)
"poz", -- Malayo-Polynesian (for e.g. pqe = Eastern Malayo-Polynesian)
"cau-nwc", -- Northwest Caucasian
"cau-nec", -- Northeast Caucasian
}
local function find_high_level_family(lang)
local family = lang:getFamily()
-- (1) If no family, return nil (e.g. for Pictish).
if not family then
return nil
end
-- (2) See if any ancestor family is in `high_level_families`.
-- if so, return it.
local high_level_family = family
while high_level_family do
local high_level_code = high_level_family:getCode()
if high_level_code == "qfa-not" then
-- "not a family"; its own parent, causing an infinite loop.
-- Break rather than return so we get categories like
-- [[Category:English female given names from sign languages]] and
-- [[Category:English female given names from constructed languages]].
break
end
if high_level_families[high_level_code] then
return high_level_family
end
high_level_family = high_level_family:getFamily()
end
-- (3) If the family is of the form 'FOO-BAR', see if 'FOO' is a family.
-- If so, return it.
local basic_family = family:getCode():match("^(.-)%-.*$")
if basic_family then
basic_family = require("Module:families").getByCode(basic_family)
if basic_family then
return basic_family
end
end
-- (4) Fall back to just the family itself.
return family
end
local function match_gendered_nametype(nametype)
local gender, label = nametype:match("^(f?e?male) (given names)$")
if not gender then
gender, label = nametype:match("^(unisex) (given names)$")
end
if gender then
return gender, label
end
end
local function get_parents(lang, nametype, source)
local parents = {}
if lang then
table.insert(parents, {name = nametype, sort = get_source_text(source)})
if type(source) == "table" then
table.insert(parents, {name = "terms derived from " .. source:getDisplayForm(), sort = " "})
-- If the source is a regular language, put it in a parent category for the high-level language family, e.g. for
-- "Russian female given names from German", put it in a parent category "Russian female given names from Germanic languages"
-- (skipping over West Germanic languages).
--
-- If the source is an etymology language, put it in a parent category for the parent full language, e.g. for
-- "French male given names from Gascon", put it in a parent category "French male given names from Occitan".
--
-- If the source is a family, put it in a parent category for the parent family.
if source:hasType("family") then
local parent_family = source:getFamily()
if parent_family and parent_family:getCode() ~= "qfa-not" then
table.insert(parents, {
name = nametype .. " from " .. parent_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
elseif source:hasType("etymology-only") then
local source_parent = source:getFull()
if source_parent and source_parent:getCode() ~= "und" then
table.insert(parents, {
name = nametype .. " from " .. source_parent:getDisplayForm(),
sort = source:getCanonicalName()
})
end
else
local high_level_family = find_high_level_family(source)
if high_level_family then -- may not exist, e.g. for Pictish
table.insert(parents,
{name = nametype .. " from " .. high_level_family:getDisplayForm(),
sort = source:getCanonicalName()
})
end
end
end
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), sort = gender})
end
else
local gender, label = match_gendered_nametype(nametype)
if gender then
table.insert(parents, {name = label .. " from " .. get_source_text(source), is_label = true, sort = " "})
elseif type(source) == "table" then
-- FIXME! This is duplicated in [[Module:category tree/etymology]] in the handler for umbrella categories
-- 'Terms derived from SOURCE'.
local first_umbrella_parent =
source:hasType("family") and {name = source:getCategoryName(), raw = true, sort = " "} or
source:hasType("etymology-only") and {name = "Category:" .. source:getCategoryName(), sort = nametype} or
{name = source:getCategoryName(), raw = true, sort = nametype}
table.insert(parents, first_umbrella_parent)
end
table.insert(parents, "Names subcategories by language")
end
return parents
end
table.insert(handlers, function(data)
local nametype, source_name = data.label:match("^(.*names) from (.+)$")
if nametype then
local personal_name_type_set = require(names_module).personal_name_type_set
if not personal_name_type_set[nametype] then
return nil
end
local source = source_name_to_source(nametype, source_name)
if not source then
return nil
end
return {
description = get_description(data.lang, nametype, source),
breadcrumb = "from " .. get_source_text(source),
parents = get_parents(data.lang, nametype, source),
umbrella = {
description = get_description(nil, nametype, source),
parents = get_parents(nil, nametype, source),
},
}
end
end)
-- Handler for e.g. 'English renderings of Russian male given names'.
table.insert(handlers, function(data)
local label = data.label:match("^renderings of (.*)$")
if label then
local personal_name_types = require(names_module).personal_name_types
for _, nametype in ipairs(personal_name_types) do
local sourcename = label:match("^(.+) " .. nametype .. "$")
if sourcename then
local source = require("Module:languages").getByCanonicalName(sourcename, nil, "allow etym")
if source then
return {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into {{{langdisp}}}.",
lang = data.lang,
breadcrumb = sourcename .. " " .. nametype,
parents = {
{ name = "renderings of foreign personal names", sort = sourcename },
{ name = nametype, lang = source:getCode(), sort = "{{{langname}}}" },
},
umbrella = {
description = "Transliterations, respellings or other renderings of " .. source:makeCategoryLink() .. " " .. nametype .. " into various languages.",
parents = {{name = "renderings of foreign personal names", is_label = true, sort = label}},
},
}
end
end
end
end
end)
return {LABELS = labels, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
nka9xy2he55k31c1lpud70iamgc4u5s
मॉड्यूल:category tree/names
828
306967
487823
2026-09-02T19:26:48Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/names]] को [[मॉड्यूल:category tree/नाम]] पर स्थानांतरित किया
487823
Scribunto
text/plain
return require [[मॉड्यूल:category tree/नाम]]
mtfrv4l25s70z170xguvjixukymr31j
मॉड्यूल:category tree/लिपियाँ
828
306968
487824
2026-09-02T19:27:35Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487824
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module
-- and displayed in script category pages.
local blocks_submodule = "Module:category tree/scripts/blocks"
local en_utilities_module = "Module:en-utilities"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local m_str_utils = require(string_utilities_module)
local m_table = require(table_module)
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local get_script_by_category_name = require(scripts_module).getByCategoryName
local pattern_escape = m_str_utils.pattern_escape
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- SCRIPT LABELS --
-- --
-----------------------------------------------------------------------------
--[=[
The following values are recognized for each script label:
'description'
A plain English description for the label. Special template substitutions are recognized; see below.
'umbrella_parents'
A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label.
The format is as for regular raw categories (see [[Module:category tree/data/documentation]]).
'umbrella_breadcrumb'
The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script".
'catfix'
Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]).
This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked
appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question.
Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and
'root_additional' variable values initialized below). These are replaced by the equivalent text.
{{{code}}}: Script code.
{{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin).
{{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string.
{{{scname}}}: The name of the script that the category belongs to.
{{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name.
{{{scdisp}}}: The display form of the script, which adds "script" to the regular name.
{{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}.
{{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}.
]=]
local script_labels = {}
script_labels["characters"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "All characters whose script cannot be determined."
else
return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language."
end
end,
additional = function(scdata)
if scdata.sc:getCode() == "None" then
return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category."
else
return nil
end
end,
umbrella_parents = {"Fundamental"},
umbrella_breadcrumb = "Characters by script",
catfix = "mul",
}
script_labels["appendices"] = {
description = "Appendices about {{{scprosename}}}.",
umbrella_parents = {"Category:Appendices"},
}
script_labels["languages"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)."
else
return "Languages that use {{{scprosename}}}."
end
end,
umbrella_parents = {"All languages"},
}
script_labels["templates"] = {
description = "Templates with predefined contents for {{{scprosename}}}.",
umbrella_parents = {"Templates"},
}
script_labels["modules"] = {
description = "Modules that implement functionality for {{{scprosename}}}.",
umbrella_parents = {"Modules"},
}
script_labels["data modules"] = {
description = "Modules that contain data related to {{{scprosename}}}.",
umbrella_parents = {"Data modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All scripts"] = {
description = "This category contains the categories for every script (writing system) on Wiktionary.",
additional = "See [[Wiktionary:List of scripts]] for a full list.",
parents = {"Fundamental"},
}
-- Types of writing systems listed in [[Module:writing systems/data]].
raw_categories["Scripts by type"] = {
description = "Scripts classified by how they represent words.",
parents = {{ name = "All scripts", sort = " " }},
breadcrumb = "by type",
}
raw_categories["Abjads"] = {
description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.",
parents = {"Scripts by type"},
}
raw_categories["Abugidas"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.",
parents = {"Scripts by type"},
}
raw_categories["Alphabetic writing systems"] = {
description = "Scripts whose symbols represent individual speech sounds.",
parents = {"Scripts by type"},
}
raw_categories["Logographic writing systems"] = {
description = "Scripts whose symbols represent individual words.",
parents = {"Scripts by type"},
}
raw_categories["Pictographic writing systems"] = {
description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.",
parents = {"Scripts by type"},
}
raw_categories["Semisyllabaries"] = {
description = "Scripts which are a combination of an alphabet and a syllbary.",
parents = {"Scripts by type"},
}
raw_categories["Syllabaries"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.",
parents = {"Scripts by type"},
}
for script_label, obj in pairs(script_labels) do
raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = {
description = "Categories with " .. script_label .. " of various specific scripts.",
breadcrumb = obj.umbrella_breadcrumb or "by script",
parents = obj.umbrella_parents,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div>
{| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)"
| style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}''
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]'''
|-
| style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}'''
|}
</div>]=]
-- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_description = "This is the main category of '''{{{scprosename}}}'''."
-- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]].
In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=]
-- Replace template notation {{{}}} with variables.
local function substitute_template_refs(text, scdata)
local sc = scdata.sc
local scname = scdata.canonical_name
local display_form = sc:getDisplayForm()
-- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have
-- language-specific variants. If such scripts are created, we have to do this a different way.
if mw.getContentLanguage():ucfirst(display_form) == display_form then
display_form = scdata.category_name
end
local codes = {}
if type(text) == "function" then
text = text(scdata)
end
if not text then
return nil
end
local function insert_code(name, code)
if name == scname then
m_table.insertIfNot(codes, "'''" .. code .. "'''")
end
end
for code, data in pairs(mw.loadData(scripts_data_module)) do
local rawname = data[1]
if type(rawname) == "table" then -- e.g. script code `Aran`
for lang, name in pairs(rawname) do
insert_code(name, code)
end
else
insert_code(rawname, code)
end
end
if codes[2] then
table.sort(
codes,
-- Four-letter codes have length 10, because they are bolded: '''Latn'''.
function(code1, code2)
if #code1 == 10 then
if #code2 == 10 then
return code1 < code2
else
return true
end
else
if #code2 == 10 then
return false -- four-letter codes before other codes
else
return code1 < code2
end
end
end)
end
local content = {
code = sc:getCode(),
codesplural = codes[2] and "s" or "",
codes = concat(codes, ", "),
scname = scname,
sccat = scdata.category_name,
scdisp = display_form,
scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form,
Wikipedia = sc:getWikipediaArticle(),
}
text = string.gsub(
text,
"{{{([^}]+)}}}",
function (parameter)
return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.")
end)
return text
end
local function get_root_additional(additional, scdata)
local ret = {}
local function ins(text)
insert(ret, text)
end
local sc = scdata.sc
local canonicalNameTable = sc:getCanonicalNameTable()
if type(canonicalNameTable) == "table" then
local default_name = sc:getCanonicalName()
local default_catname = sc:getCategoryName()
local matching_langs = {}
local names_to_langs = {}
for lang, name in pairs(canonicalNameTable) do
local this_catname = require(scripts_module).canonicalNameToCategoryName(name)
if this_catname ~= default_catname then
-- Any "lang-specific" names that are the same as the default should be skipped.
if this_catname == scdata.category_name then
insert(matching_langs, lang)
elseif names_to_langs[name] then
insert(names_to_langs[name], lang)
else
names_to_langs[name] = {lang}
end
end
end
local function format_languages(langs)
local langcats = {}
for _, langcode in ipairs(langs) do
local lang = require(languages_module).getByCode(langcode)
if not lang then
insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode))
else
insert(langcats, lang:makeCategoryLink())
end
end
table.sort(langcats)
return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats))
end
local function insert_other_names()
local names_to_langs_lines = {}
for name, langs in pairs(names_to_langs) do
insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format(
require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs)
))
end
table.sort(names_to_langs_lines)
ins(concat(names_to_langs_lines))
end
if default_catname == scdata.category_name then
if next(names_to_langs) then
ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n"
):format(sc:getCode()))
insert_other_names()
ins("\n")
end
else
ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]."
):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name))
if next(names_to_langs) then
ins(" The script has the following additional language-specific names:\n")
insert_other_names()
ins("\n")
else
ins("\n\n")
end
end
end
ins(additional)
local systems = sc:getSystems()
for _, system in ipairs(systems) do
ins("\n\nThe {{{scname}}} script is ")
ins(add_indefinite_article(system:getDisplayForm("singular")))
ins(".")
end
local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name)
if blocks then
ins("\n")
ins(blocks)
end
return substitute_template_refs(concat(ret), scdata)
end
-- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and
-- [[Category:Flag semaphore]].
insert(raw_handlers, function(data)
local sc, canonical_name = get_script_by_category_name(data.category)
if not sc then
return nil
end
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = data.category,
}
-- Compute parents.
local parents = {}
local systems = sc:getSystems()
for _, system in ipairs(systems) do
insert(parents, system:getCategoryName())
end
insert(parents, "All scripts")
-- Compute (extra) children.
local children = {}
for script_label in pairs(script_labels) do
insert(children, data.category .. " " .. script_label)
end
return {
canonical_name = data.category,
topright = substitute_template_refs(root_topright, scdata),
description = substitute_template_refs(root_description, scdata),
additional = get_root_additional(root_additional, scdata),
parents = parents,
breadcrumb = canonical_name,
extra_children = children,
can_be_empty = true,
}
end)
-- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and
-- [[Category:Flag semaphore LABELS]].
insert(raw_handlers, function(data)
local sc, category_name, canonical_name, label
for lab in pairs(script_labels) do
category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$")
sc, canonical_name = get_script_by_category_name(category_name)
if sc then
break
end
end
if not sc then
return nil
end
local label_obj = script_labels[label]
-- Compute parents.
local parents = {
{name = category_name, sort = label},
-- umbrella category
mw.getContentLanguage():ucfirst(label) .. " by script",
}
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = category_name,
}
return {
canonical_name = category_name .. " " .. label,
description = substitute_template_refs(label_obj.description, scdata),
additional = substitute_template_refs(label_obj.additional, scdata),
parents = parents,
breadcrumb = label,
catfix = label_obj.catfix,
catfix_sc = label_obj.catfix and sc:getCode(),
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
5wbrhtkpzn59eg6aclz5p1xg8tfhmyc
487825
487824
2026-09-02T19:27:51Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/scripts]] को [[मॉड्यूल:category tree/लिपियाँ]] पर स्थानांतरित किया
487824
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module
-- and displayed in script category pages.
local blocks_submodule = "Module:category tree/scripts/blocks"
local en_utilities_module = "Module:en-utilities"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local m_str_utils = require(string_utilities_module)
local m_table = require(table_module)
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local get_script_by_category_name = require(scripts_module).getByCategoryName
local pattern_escape = m_str_utils.pattern_escape
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- SCRIPT LABELS --
-- --
-----------------------------------------------------------------------------
--[=[
The following values are recognized for each script label:
'description'
A plain English description for the label. Special template substitutions are recognized; see below.
'umbrella_parents'
A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label.
The format is as for regular raw categories (see [[Module:category tree/data/documentation]]).
'umbrella_breadcrumb'
The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script".
'catfix'
Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]).
This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked
appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question.
Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and
'root_additional' variable values initialized below). These are replaced by the equivalent text.
{{{code}}}: Script code.
{{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin).
{{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string.
{{{scname}}}: The name of the script that the category belongs to.
{{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name.
{{{scdisp}}}: The display form of the script, which adds "script" to the regular name.
{{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}.
{{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}.
]=]
local script_labels = {}
script_labels["characters"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "All characters whose script cannot be determined."
else
return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language."
end
end,
additional = function(scdata)
if scdata.sc:getCode() == "None" then
return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category."
else
return nil
end
end,
umbrella_parents = {"Fundamental"},
umbrella_breadcrumb = "Characters by script",
catfix = "mul",
}
script_labels["appendices"] = {
description = "Appendices about {{{scprosename}}}.",
umbrella_parents = {"Category:Appendices"},
}
script_labels["languages"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)."
else
return "Languages that use {{{scprosename}}}."
end
end,
umbrella_parents = {"All languages"},
}
script_labels["templates"] = {
description = "Templates with predefined contents for {{{scprosename}}}.",
umbrella_parents = {"Templates"},
}
script_labels["modules"] = {
description = "Modules that implement functionality for {{{scprosename}}}.",
umbrella_parents = {"Modules"},
}
script_labels["data modules"] = {
description = "Modules that contain data related to {{{scprosename}}}.",
umbrella_parents = {"Data modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["All scripts"] = {
description = "This category contains the categories for every script (writing system) on Wiktionary.",
additional = "See [[Wiktionary:List of scripts]] for a full list.",
parents = {"Fundamental"},
}
-- Types of writing systems listed in [[Module:writing systems/data]].
raw_categories["Scripts by type"] = {
description = "Scripts classified by how they represent words.",
parents = {{ name = "All scripts", sort = " " }},
breadcrumb = "by type",
}
raw_categories["Abjads"] = {
description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.",
parents = {"Scripts by type"},
}
raw_categories["Abugidas"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.",
parents = {"Scripts by type"},
}
raw_categories["Alphabetic writing systems"] = {
description = "Scripts whose symbols represent individual speech sounds.",
parents = {"Scripts by type"},
}
raw_categories["Logographic writing systems"] = {
description = "Scripts whose symbols represent individual words.",
parents = {"Scripts by type"},
}
raw_categories["Pictographic writing systems"] = {
description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.",
parents = {"Scripts by type"},
}
raw_categories["Semisyllabaries"] = {
description = "Scripts which are a combination of an alphabet and a syllbary.",
parents = {"Scripts by type"},
}
raw_categories["Syllabaries"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.",
parents = {"Scripts by type"},
}
for script_label, obj in pairs(script_labels) do
raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = {
description = "Categories with " .. script_label .. " of various specific scripts.",
breadcrumb = obj.umbrella_breadcrumb or "by script",
parents = obj.umbrella_parents,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div>
{| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)"
| style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}''
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]'''
|-
| style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}'''
|}
</div>]=]
-- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_description = "This is the main category of '''{{{scprosename}}}'''."
-- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]].
In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=]
-- Replace template notation {{{}}} with variables.
local function substitute_template_refs(text, scdata)
local sc = scdata.sc
local scname = scdata.canonical_name
local display_form = sc:getDisplayForm()
-- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have
-- language-specific variants. If such scripts are created, we have to do this a different way.
if mw.getContentLanguage():ucfirst(display_form) == display_form then
display_form = scdata.category_name
end
local codes = {}
if type(text) == "function" then
text = text(scdata)
end
if not text then
return nil
end
local function insert_code(name, code)
if name == scname then
m_table.insertIfNot(codes, "'''" .. code .. "'''")
end
end
for code, data in pairs(mw.loadData(scripts_data_module)) do
local rawname = data[1]
if type(rawname) == "table" then -- e.g. script code `Aran`
for lang, name in pairs(rawname) do
insert_code(name, code)
end
else
insert_code(rawname, code)
end
end
if codes[2] then
table.sort(
codes,
-- Four-letter codes have length 10, because they are bolded: '''Latn'''.
function(code1, code2)
if #code1 == 10 then
if #code2 == 10 then
return code1 < code2
else
return true
end
else
if #code2 == 10 then
return false -- four-letter codes before other codes
else
return code1 < code2
end
end
end)
end
local content = {
code = sc:getCode(),
codesplural = codes[2] and "s" or "",
codes = concat(codes, ", "),
scname = scname,
sccat = scdata.category_name,
scdisp = display_form,
scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form,
Wikipedia = sc:getWikipediaArticle(),
}
text = string.gsub(
text,
"{{{([^}]+)}}}",
function (parameter)
return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.")
end)
return text
end
local function get_root_additional(additional, scdata)
local ret = {}
local function ins(text)
insert(ret, text)
end
local sc = scdata.sc
local canonicalNameTable = sc:getCanonicalNameTable()
if type(canonicalNameTable) == "table" then
local default_name = sc:getCanonicalName()
local default_catname = sc:getCategoryName()
local matching_langs = {}
local names_to_langs = {}
for lang, name in pairs(canonicalNameTable) do
local this_catname = require(scripts_module).canonicalNameToCategoryName(name)
if this_catname ~= default_catname then
-- Any "lang-specific" names that are the same as the default should be skipped.
if this_catname == scdata.category_name then
insert(matching_langs, lang)
elseif names_to_langs[name] then
insert(names_to_langs[name], lang)
else
names_to_langs[name] = {lang}
end
end
end
local function format_languages(langs)
local langcats = {}
for _, langcode in ipairs(langs) do
local lang = require(languages_module).getByCode(langcode)
if not lang then
insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode))
else
insert(langcats, lang:makeCategoryLink())
end
end
table.sort(langcats)
return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats))
end
local function insert_other_names()
local names_to_langs_lines = {}
for name, langs in pairs(names_to_langs) do
insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format(
require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs)
))
end
table.sort(names_to_langs_lines)
ins(concat(names_to_langs_lines))
end
if default_catname == scdata.category_name then
if next(names_to_langs) then
ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n"
):format(sc:getCode()))
insert_other_names()
ins("\n")
end
else
ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]."
):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name))
if next(names_to_langs) then
ins(" The script has the following additional language-specific names:\n")
insert_other_names()
ins("\n")
else
ins("\n\n")
end
end
end
ins(additional)
local systems = sc:getSystems()
for _, system in ipairs(systems) do
ins("\n\nThe {{{scname}}} script is ")
ins(add_indefinite_article(system:getDisplayForm("singular")))
ins(".")
end
local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name)
if blocks then
ins("\n")
ins(blocks)
end
return substitute_template_refs(concat(ret), scdata)
end
-- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and
-- [[Category:Flag semaphore]].
insert(raw_handlers, function(data)
local sc, canonical_name = get_script_by_category_name(data.category)
if not sc then
return nil
end
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = data.category,
}
-- Compute parents.
local parents = {}
local systems = sc:getSystems()
for _, system in ipairs(systems) do
insert(parents, system:getCategoryName())
end
insert(parents, "All scripts")
-- Compute (extra) children.
local children = {}
for script_label in pairs(script_labels) do
insert(children, data.category .. " " .. script_label)
end
return {
canonical_name = data.category,
topright = substitute_template_refs(root_topright, scdata),
description = substitute_template_refs(root_description, scdata),
additional = get_root_additional(root_additional, scdata),
parents = parents,
breadcrumb = canonical_name,
extra_children = children,
can_be_empty = true,
}
end)
-- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and
-- [[Category:Flag semaphore LABELS]].
insert(raw_handlers, function(data)
local sc, category_name, canonical_name, label
for lab in pairs(script_labels) do
category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$")
sc, canonical_name = get_script_by_category_name(category_name)
if sc then
break
end
end
if not sc then
return nil
end
local label_obj = script_labels[label]
-- Compute parents.
local parents = {
{name = category_name, sort = label},
-- umbrella category
mw.getContentLanguage():ucfirst(label) .. " by script",
}
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = category_name,
}
return {
canonical_name = category_name .. " " .. label,
description = substitute_template_refs(label_obj.description, scdata),
additional = substitute_template_refs(label_obj.additional, scdata),
parents = parents,
breadcrumb = label,
catfix = label_obj.catfix,
catfix_sc = label_obj.catfix and sc:getCode(),
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
5wbrhtkpzn59eg6aclz5p1xg8tfhmyc
487852
487825
2026-09-02T20:22:16Z
SM7
6218
localization...
487852
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
-- A list of Unicode blocks to which the characters of the script or scripts belong is created by this module
-- and displayed in script category pages.
local blocks_submodule = "Module:category tree/scripts/blocks"
local en_utilities_module = "Module:en-utilities"
local languages_module = "Module:languages"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local m_str_utils = require(string_utilities_module)
local m_table = require(table_module)
local add_indefinite_article = require(en_utilities_module).add_indefinite_article
local get_script_by_category_name = require(scripts_module).getByCategoryName
local pattern_escape = m_str_utils.pattern_escape
local concat = table.concat
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- SCRIPT LABELS --
-- --
-----------------------------------------------------------------------------
--[=[
The following values are recognized for each script label:
'description'
A plain English description for the label. Special template substitutions are recognized; see below.
'umbrella_parents'
A table listing one or more parent categories of the umbrella category 'LABELS by script' for this label.
The format is as for regular raw categories (see [[Module:category tree/data/documentation]]).
'umbrella_breadcrumb'
The breadcrumb to use in the umbrella category 'LABELS by script'. Defaults to "by script".
'catfix'
Same as the 'catfix' parameter for regular raw categories (see [[Module:category tree/data/documentation]]).
This specifies a language code to use to ensure that pages in the category are displayed in the right font and linked
appropriately. If this is set, the 'catfix_sc' parameter will effectively be set with the script code in question.
Special template-like parameters can be used inside the 'description' field (as well as in the 'root_description', 'root_topright' and
'root_additional' variable values initialized below). These are replaced by the equivalent text.
{{{code}}}: Script code.
{{{codes}}}: A comma-separated list of all the alias codes for this script (e.g. Latn and pjt-Latn for Latin).
{{{codesplural}}}: The value "s" if {{{codes}}} lists more than one code, otherwise an empty string.
{{{scname}}}: The name of the script that the category belongs to.
{{{sccat}}}: The name of the script's main category, which adds "script" to the capitalized regular name.
{{{scdisp}}}: The display form of the script, which adds "script" to the regular name.
{{{scprosename}}}: Same as {{{scdisp}}} for Morse code and flag semaphore, otherwise adds "the" before {{{scdisp}}}.
{{{Wikipedia}}}: The Wikipedia article for the script (if it is present in the language's data file), or else {{{sccat}}}.
]=]
local script_labels = {}
script_labels["characters"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "All characters whose script cannot be determined."
else
return "All characters from {{{scprosename}}}, and their possible variations, such as versions with diacritics and combinations recognized as single characters in any language."
end
end,
additional = function(scdata)
if scdata.sc:getCode() == "None" then
return "This also includes terms where such characters are listed. For example, {{m|mul|㋍}} (a CJK character called ''SQUARE ERG'' and consisting of the word [[erg]] inside of a square) is listed on the [[erg]] page, leading to this page getting categorized into this category."
else
return nil
end
end,
umbrella_parents = {"मूलभूत श्रेणी"},
umbrella_breadcrumb = "Characters by script",
catfix = "mul",
}
script_labels["appendices"] = {
description = "Appendices about {{{scprosename}}}.",
umbrella_parents = {"Category:Appendices"},
}
script_labels["languages"] = {
description = function(scdata)
if scdata.sc:getCode() == "None" then
return "Languages whose script or scripts have not yet been specified in Wiktionary (and may not exist)."
else
return "Languages that use {{{scprosename}}}."
end
end,
umbrella_parents = {"All languages"},
}
script_labels["templates"] = {
description = "Templates with predefined contents for {{{scprosename}}}.",
umbrella_parents = {"Templates"},
}
script_labels["modules"] = {
description = "Modules that implement functionality for {{{scprosename}}}.",
umbrella_parents = {"Modules"},
}
script_labels["data modules"] = {
description = "Modules that contain data related to {{{scprosename}}}.",
umbrella_parents = {"Data modules"},
}
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["सभी लिपियाँ"] = {
description = "This category contains the categories for every script (writing system) on Wiktionary.",
additional = "See [[Wiktionary:List of scripts]] for a full list.",
parents = {"मूलभूत श्रेणी"},
}
-- Types of writing systems listed in [[Module:writing systems/data]].
raw_categories["लिपियाँ प्रकार अनुसार"] = {
description = "Scripts classified by how they represent words.",
parents = {{ name = "सभी लिपियाँ", sort = " " }},
breadcrumb = "लिपि अनुसार",
}
raw_categories["Abjads"] = {
description = "Scripts whose basic symbols represent consonants. Some of these are impure abjads, which have letters for some vowels.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Abugidas"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part similar in form.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Alphabetic writing systems"] = {
description = "Scripts whose symbols represent individual speech sounds.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Logographic writing systems"] = {
description = "Scripts whose symbols represent individual words.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Pictographic writing systems"] = {
description = "Scripts whose symbols represent individual words by using symbols that resemble the physical objects to which those words refer.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Semisyllabaries"] = {
description = "Scripts which are a combination of an alphabet and a syllbary.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
raw_categories["Syllabaries"] = {
description = "Scripts whose symbols represent consonant and vowel combinations. Symbols representing the same consonant combined with different vowels are for the most part different in form.",
parents = {"लिपियाँ प्रकार अनुसार"},
}
for script_label, obj in pairs(script_labels) do
raw_categories[mw.getContentLanguage():ucfirst(script_label) .. " by script"] = {
description = "Categories with " .. script_label .. " of various specific scripts.",
breadcrumb = obj.umbrella_breadcrumb or "by script",
parents = obj.umbrella_parents,
}
end
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- Intro text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_topright = [=[<div style="clear: right; border: solid var(--border-color-base,#aaa) 1px; margin: 1 1 1 1; background: var(--wikt-palette-paleblue,#f9f9f9); width: 250px; padding: 5px; text-align: left; float: right">
<div style="text-align: center; margin-bottom: 10px; margin-top: 5px">'''{{{scdisp}}}'''</div>
{| style="font-size: 90%; background: var(--wikt-palette-paleblue,#f9f9f9)"
| style="vertical-align: middle; height: 35px;" | [[File:Wikipedia-logo.png|35px|none|Wikipedia]] || ''Wikipedia article about {{{scprosename}}}''
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[w:{{{Wikipedia}}}|{{{Wikipedia}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Crystal kfind.png|35px|none|Considerations]] || {{{scdisp}}} considerations
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Wiktionary:About {{{scdisp}}}]]'''
|-
| style="vertical-align: middle; height: 35px;" | [[File:Book notice.png|35px|none|Information]] || {{{scdisp}}} information
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''[[Appendix:{{{sccat}}}]]'''
|-
| style="vertical-align: Middle; height: 35px;" | [[File:Abc box.svg|35px|none|Code]] || {{{scdisp}}} code
|-
| colspan="2" style="padding-left: 50px; border-bottom: 1px solid var(--border-color-base,#aaa);" | '''{{{code}}}'''
|}
</div>]=]
-- Short description for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_description = "This is the main category of '''{{{scprosename}}}'''."
-- Additional description text for "root" categories such as [[Category:Arabic script]]. Template substitutions are as described above.
local root_additional = [=[Information about {{{scprosename}}} may be available at [[Appendix:{{{sccat}}}]].
In various places at Wiktionary, {{{scprosename}}} is represented by the [[Wiktionary:Scripts|code{{{codesplural}}}]] {{{codes}}}.]=]
-- Replace template notation {{{}}} with variables.
local function substitute_template_refs(text, scdata)
local sc = scdata.sc
local scname = scdata.canonical_name
local display_form = sc:getDisplayForm()
-- FIXME: Here we assume that the few scripts that have lowercase canonical names don't have
-- language-specific variants. If such scripts are created, we have to do this a different way.
if mw.getContentLanguage():ucfirst(display_form) == display_form then
display_form = scdata.category_name
end
local codes = {}
if type(text) == "function" then
text = text(scdata)
end
if not text then
return nil
end
local function insert_code(name, code)
if name == scname then
m_table.insertIfNot(codes, "'''" .. code .. "'''")
end
end
for code, data in pairs(mw.loadData(scripts_data_module)) do
local rawname = data[1]
if type(rawname) == "table" then -- e.g. script code `Aran`
for lang, name in pairs(rawname) do
insert_code(name, code)
end
else
insert_code(rawname, code)
end
end
if codes[2] then
table.sort(
codes,
-- Four-letter codes have length 10, because they are bolded: '''Latn'''.
function(code1, code2)
if #code1 == 10 then
if #code2 == 10 then
return code1 < code2
else
return true
end
else
if #code2 == 10 then
return false -- four-letter codes before other codes
else
return code1 < code2
end
end
end)
end
local content = {
code = sc:getCode(),
codesplural = codes[2] and "s" or "",
codes = concat(codes, ", "),
scname = scname,
sccat = scdata.category_name,
scdisp = display_form,
scprosename = (display_form:find("code") or display_form:find("semaphore")) and display_form or "the " .. display_form,
Wikipedia = sc:getWikipediaArticle(),
}
text = string.gsub(
text,
"{{{([^}]+)}}}",
function (parameter)
return content[parameter] or error("No value for script category parameter '" .. parameter .. "'.")
end)
return text
end
local function get_root_additional(additional, scdata)
local ret = {}
local function ins(text)
insert(ret, text)
end
local sc = scdata.sc
local canonicalNameTable = sc:getCanonicalNameTable()
if type(canonicalNameTable) == "table" then
local default_name = sc:getCanonicalName()
local default_catname = sc:getCategoryName()
local matching_langs = {}
local names_to_langs = {}
for lang, name in pairs(canonicalNameTable) do
local this_catname = require(scripts_module).canonicalNameToCategoryName(name)
if this_catname ~= default_catname then
-- Any "lang-specific" names that are the same as the default should be skipped.
if this_catname == scdata.category_name then
insert(matching_langs, lang)
elseif names_to_langs[name] then
insert(names_to_langs[name], lang)
else
names_to_langs[name] = {lang}
end
end
end
local function format_languages(langs)
local langcats = {}
for _, langcode in ipairs(langs) do
local lang = require(languages_module).getByCode(langcode)
if not lang then
insert(langcats, ("<span class=\"error\">unknown language code '''%s'''</span>"):format(langcode))
else
insert(langcats, lang:makeCategoryLink())
end
end
table.sort(langcats)
return ("language%s %s"):format(langcats[2] and "s" or "", m_table.serialCommaJoin(langcats))
end
local function insert_other_names()
local names_to_langs_lines = {}
for name, langs in pairs(names_to_langs) do
insert(names_to_langs_lines, ("* [[:Category:%s|%s]] for %s.\n"):format(
require(scripts_module).canonicalNameToCategoryName(name), name, format_languages(langs)
))
end
table.sort(names_to_langs_lines)
ins(concat(names_to_langs_lines))
end
if default_catname == scdata.category_name then
if next(names_to_langs) then
ins(("This category corresponds to the default name for script code '''%s''', which also goes by the following language-specific names:\n"
):format(sc:getCode()))
insert_other_names()
ins("\n")
end
else
ins(("This category bears a language-specific name for script code '''%s''', as used for %s. The script goes by the default name of [[:Category:%s|%s]]."
):format(sc:getCode(), format_languages(matching_langs), default_catname, default_name))
if next(names_to_langs) then
ins(" The script has the following additional language-specific names:\n")
insert_other_names()
ins("\n")
else
ins("\n\n")
end
end
end
ins(additional)
local systems = sc:getSystems()
for _, system in ipairs(systems) do
ins("\n\nThe {{{scname}}} script is ")
ins(add_indefinite_article(system:getDisplayForm("singular")))
ins(".")
end
local blocks = require(blocks_submodule).print_blocks_by_canonical_name(scdata.canonical_name)
if blocks then
ins("\n")
ins(blocks)
end
return substitute_template_refs(concat(ret), scdata)
end
-- Handler for 'SCRIPT script' e.g. [[Category:Arabic script]] as well as [[Category:Morse code]] and
-- [[Category:Flag semaphore]].
insert(raw_handlers, function(data)
local sc, canonical_name = get_script_by_category_name(data.category)
if not sc then
return nil
end
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = data.category,
}
-- Compute parents.
local parents = {}
local systems = sc:getSystems()
for _, system in ipairs(systems) do
insert(parents, system:getCategoryName())
end
insert(parents, "All scripts")
-- Compute (extra) children.
local children = {}
for script_label in pairs(script_labels) do
insert(children, data.category .. " " .. script_label)
end
return {
canonical_name = data.category,
topright = substitute_template_refs(root_topright, scdata),
description = substitute_template_refs(root_description, scdata),
additional = get_root_additional(root_additional, scdata),
parents = parents,
breadcrumb = canonical_name,
extra_children = children,
can_be_empty = true,
}
end)
-- Handler for 'SCRIPT script LABELS' e.g. [[Category:Arabic script templates]] as well as [[Category:Morse code LABELS]] and
-- [[Category:Flag semaphore LABELS]].
insert(raw_handlers, function(data)
local sc, category_name, canonical_name, label
for lab in pairs(script_labels) do
category_name, label = data.category:match("^(.+) (" .. pattern_escape(lab) .. ")$")
sc, canonical_name = get_script_by_category_name(category_name)
if sc then
break
end
end
if not sc then
return nil
end
local label_obj = script_labels[label]
-- Compute parents.
local parents = {
{name = category_name, sort = label},
-- umbrella category
mw.getContentLanguage():ucfirst(label) .. " by script",
}
local scdata = {
sc = sc,
canonical_name = canonical_name,
category_name = category_name,
}
return {
canonical_name = category_name .. " " .. label,
description = substitute_template_refs(label_obj.description, scdata),
additional = substitute_template_refs(label_obj.additional, scdata),
parents = parents,
breadcrumb = label,
catfix = label_obj.catfix,
catfix_sc = label_obj.catfix and sc:getCode(),
}
end)
return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers}
mwljn2e9hhyzkkbf1k5mflglpqa9d8c
मॉड्यूल:category tree/scripts
828
306969
487826
2026-09-02T19:27:51Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/scripts]] को [[मॉड्यूल:category tree/लिपियाँ]] पर स्थानांतरित किया
487826
Scribunto
text/plain
return require [[मॉड्यूल:category tree/लिपियाँ]]
3i134eyc5yk7xxagitb4qp19fmls1en
मॉड्यूल:category tree/हेडवर्ड
828
306970
487828
2026-09-02T19:30:05Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487828
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["The Headword"] = {
description = "Pages of [[Wiktionary:The Headword|''The Headword'']]: the portal, every issue, and one subcategory per issue holding that issue's articles.",
breadcrumb = "The Headword",
parents = "Wiktionary",
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- The Headword by issue
insert(raw_handlers, function(data)
local issue = data.category:match("^The Headword, issue (%d+)$")
if not issue then
return
end
return {
description = "Articles from issue " .. issue .. " of [[Wiktionary:The Headword|''The Headword'']].",
additional = "They are listed in the order they are read in the issue, not alphabetically.",
breadcrumb = "issue " .. issue,
parents = {
{ name = "The Headword", sort = ("%02d"):format(tonumber(issue)) },
},
}
end)
return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers }
3fawqq29evtquk2sx2kwzoouiolvsv6
487829
487828
2026-09-02T19:30:18Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/the headword]] को [[मॉड्यूल:category tree/हेडवर्ड]] पर स्थानांतरित किया
487828
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local insert = table.insert
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["The Headword"] = {
description = "Pages of [[Wiktionary:The Headword|''The Headword'']]: the portal, every issue, and one subcategory per issue holding that issue's articles.",
breadcrumb = "The Headword",
parents = "Wiktionary",
}
-----------------------------------------------------------------------------
-- --
-- RAW HANDLERS --
-- --
-----------------------------------------------------------------------------
-- The Headword by issue
insert(raw_handlers, function(data)
local issue = data.category:match("^The Headword, issue (%d+)$")
if not issue then
return
end
return {
description = "Articles from issue " .. issue .. " of [[Wiktionary:The Headword|''The Headword'']].",
additional = "They are listed in the order they are read in the issue, not alphabetically.",
breadcrumb = "issue " .. issue,
parents = {
{ name = "The Headword", sort = ("%02d"):format(tonumber(issue)) },
},
}
end)
return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers }
3fawqq29evtquk2sx2kwzoouiolvsv6
मॉड्यूल:category tree/the headword
828
306971
487830
2026-09-02T19:30:18Z
SM7
6218
SM7 ने पृष्ठ [[मॉड्यूल:category tree/the headword]] को [[मॉड्यूल:category tree/हेडवर्ड]] पर स्थानांतरित किया
487830
Scribunto
text/plain
return require [[मॉड्यूल:category tree/हेडवर्ड]]
80v1czcia68en8tm4nfig7lbxyn4mnf
मॉड्यूल:table/isArray
828
306972
487832
2026-09-02T19:49:39Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487832
Scribunto
text/plain
local pairs = pairs
--[==[
Returns true if all keys in the table are consecutive integers starting from 1.]==]
return function(t)
-- pairs() is unordered, but can be assumed to return every key in `t`, so
-- if every integer key from 1 to n (the number of keys in `t`) is in use,
-- then all the keys in `t` form an integer range from 1 to n, making `t`
-- a contiguous array.
local i = 0
for _ in pairs(t) do
i = i + 1
if t[i] == nil then
return false
end
end
return true
end
g82iokgqr1uqfaagx0is49bas3cpq0c
मॉड्यूल:table/reverseIpairs
828
306973
487833
2026-09-02T19:50:32Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487833
Scribunto
text/plain
local ipairs = ipairs
--[==[
Iterates through a table using `ipairs` in reverse.
`__ipairs` metamethods will be used, including those which return arbitrary (i.e. non-array) keys, but note that this function assumes that the first return value is a key which can be used to retrieve a value from the input table via a table lookup. As such, `__ipairs` metamethods for which this assumption is not true will not work correctly.
If the value `nil` is encountered early (e.g. because the table has been modified), the loop will terminate early.]==]
return function(t)
-- `__ipairs` metamethods can return arbitrary keys, so compile a list.
local keys, i = {}, 0
for k in ipairs(t) do
i = i + 1
keys[i] = k
end
return function()
if i == 0 then
return nil
end
local k = keys[i]
-- Retrieve `v` from the table. These aren't stored during the initial
-- ipairs loop, so that they can be modified during the loop.
local v = t[k]
-- Return if not an early nil.
if v ~= nil then
i = i - 1
return k, v
end
end
end
g7u5t487acciyypwe4jwka7ibmfy9m2
मॉड्यूल:table/size
828
306974
487834
2026-09-02T19:51:30Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487834
Scribunto
text/plain
local next = next
local pairs = pairs
--[==[
This returns the size of a key/value pair table. If `raw` is set, then metamethods will be ignored, giving the true table size.
For arrays, it is faster to use `export.length`.]==]
return function(t, raw)
local i, iter, state, init = 0
if raw then
iter, state, init = next, t, nil
else
iter, state, init = pairs(t)
end
for _ in iter, state, init do
i = i + 1
end
return i
end
cngitqlralebfbp34hnb48xd0vu0xxk
मॉड्यूल:table/sparseConcat
828
306975
487835
2026-09-02T19:52:37Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487835
Scribunto
text/plain
local table_sparse_ipairs_module = "Module:table/sparseIpairs"
local concat = table.concat
local function sparse_ipairs(...)
sparse_ipairs = require(table_sparse_ipairs_module)
return sparse_ipairs(...)
end
--[==[
Concatenates all values in a table that are indexed by a number, in order.
* {sparseConcat{ a, nil, c, d }} => {"acd"}
* {sparseConcat{ nil, b, c, d }} => {"bcd"}]==]
return function(t, sep, i, j)
local list, k = {}, 0
for _, v in sparse_ipairs(t) do
k = k + 1
list[k] = v
end
return concat(list, sep, i, j)
end
bjv07xjo7s2ffvu9stl8xil2x52wjqt
मॉड्यूल:scripts/canonical names
828
306976
487838
2026-09-02T19:57:13Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487838
Scribunto
text/plain
return {
["Adlam"] = "Adlm",
["Afaka"] = "Afak",
["Ahom"] = "Ahom",
["Anatolian hieroglyphic"] = "Hluw",
["Ancient North Arabian"] = "Narb",
["Ancient South Arabian"] = "Sarb",
["Arabic"] = "Arab",
["Armenian"] = "Armn",
["Assamese"] = "as-Beng",
["Avestan"] = "Avst",
["Balbodh"] = "Deva",
["Balinese"] = "Bali",
["Bamum"] = "Bamu",
["Bassa"] = "Bass",
["Batak"] = "Batk",
["Baybayin"] = "Tglg",
["Bengali"] = "Beng",
["Bhaiksuki"] = "Bhks",
["Blissymbolic"] = "Blis",
["Book Pahlavi"] = "Phlv",
["Brahmi"] = "Brah",
["Braille"] = "Brai",
["Buhid"] = "Buhd",
["Burmese"] = "Mymr",
["Canadian syllabic"] = "Cans",
["Carian"] = "Cari",
["Caucasian Albanian"] = "Aghb",
["Chakma"] = "Cakm",
["Cham"] = "Cham",
["Cherokee"] = "Cher",
["Chisoi"] = "Chis",
["Clear Script"] = "xwo-Mong",
["Coptic"] = "Copt",
["Cuneiform"] = "Xsux",
["Cypriot"] = "Cprt",
["Cypro-Minoan"] = "Cpmn",
["Cyrillic"] = "Cyrl",
["Demotic"] = "Egyd",
["Deseret"] = "Dsrt",
["Devanagari"] = "Deva",
["Dhives Akuru"] = "Diak",
["Dogra"] = "Dogr",
["Dongba"] = "Nkdb",
["Duployan"] = "Dupl",
["Egyptian hieroglyphic"] = "Egyp",
["Elbasan"] = "Elba",
["Elymaic"] = "Elym",
["Ethiopic"] = "Ethi",
["Fraktur"] = "Latf",
["Fraser"] = "Lisu",
["Gaelic"] = "Latg",
["Garay"] = "Gara",
["Geba"] = "Nkgb",
["Georgian"] = "Geor",
["Glagolitic"] = "Glag",
["Gothic"] = "Goth",
["Grantha"] = "Gran",
["Greek"] = "Grek",
["Gujarati"] = "Gujr",
["Gunjala Gondi"] = "Gong",
["Gurmukhi"] = "Guru",
["Han"] = "Hani",
["Hangul"] = "Hang",
["Hanifi Rohingya"] = "Rohg",
["Hanunoo"] = "Hano",
["Hatran"] = "Hatr",
["Hebrew"] = "Hebr",
["Hieratic"] = "Egyh",
["Hiragana"] = "Hira",
["Image-rendered"] = "Image",
["Imperial Aramaic"] = "Armi",
["Indus"] = "Inds",
["Inscriptional Pahlavi"] = "Phli",
["Inscriptional Parthian"] = "Prti",
["International Phonetic Alphabet"] = "Ipach",
["Japanese"] = "Jpan",
["Javanese"] = "Java",
["Jurchen"] = "Jurc",
["Kaithi"] = "Kthi",
["Kana"] = "Hrkt",
["Kannada"] = "Knda",
["Katakana"] = "Kana",
["Kawi"] = "Kawi",
["Kayah Li"] = "Kali",
["Kharoshthi"] = "Khar",
["Khema"] = "Gukh",
["Khitan large"] = "Kitl",
["Khitan small"] = "Kits",
["Khmer"] = "Khmr",
["Khojki"] = "Khoj",
["Khom Thai"] = "Khomt",
["Khudabadi"] = "Sind",
["Khutsuri"] = "Geok",
["Khwarezmian"] = "Chrs",
["Kirat Rai"] = "Krai",
["Korean"] = "Kore",
["Kpelle"] = "Kpel",
["Kulitan"] = "Kulit",
["Lai Tay"] = "Tayo",
["Lao"] = "Laoo",
["Latin"] = "Latn",
["Leke"] = "Leke",
["Lepcha"] = "Lepc",
["Limbu"] = "Limb",
["Linear A"] = "Lina",
["Linear B"] = "Linb",
["Loma"] = "Loma",
["Lontara"] = "Bugi",
["Lycian"] = "Lyci",
["Lydian"] = "Lydi",
["Mahajani"] = "Mahj",
["Makasar"] = "Maka",
["Malayalam"] = "Mlym",
["Manchu"] = "mnc-Mong",
["Mandaic"] = "Mand",
["Manichaean"] = "Mani",
["Marchen"] = "Marc",
["Masaram Gondi"] = "Gonm",
["Maya"] = "Maya",
["Medefaidrin"] = "Medf",
["Meitei Mayek"] = "Mtei",
["Mende"] = "Mend",
["Meroitic cursive"] = "Merc",
["Meroitic hieroglyphic"] = "Mero",
["Modi"] = "Modi",
["Mongolian"] = "Mong",
["Moon"] = "Moon",
["Morse code"] = "Morse",
["Mru"] = "Mroo",
["Multani"] = "Mult",
["Mundari Bani"] = "Nagm",
["N'Ko"] = "Nkoo",
["Nabataean"] = "Nbat",
["Nandinagari"] = "Nand",
["New Tai Lue"] = "Talu",
["Newa"] = "Newa",
["Northeastern Iberian"] = "Ibrnn",
["Nyiakeng Puachue Hmong"] = "Hmnp",
["Nüshu"] = "Nshu",
["Odia"] = "Orya",
["Ogham"] = "Ogam",
["Ol Chiki"] = "Olck",
["Ol Onal"] = "Onao",
["Old Cyrillic"] = "Cyrs",
["Old Hungarian"] = "Hung",
["Old Italic"] = "Ital",
["Old Permic"] = "Perm",
["Old Persian"] = "Xpeo",
["Old Sogdian"] = "Sogo",
["Old Turkic"] = "Orkh",
["Old Uyghur"] = "Ougr",
["Osage"] = "Osge",
["Osmanya"] = "Osma",
["Pahawh Hmong"] = "Hmng",
["Palmyrene"] = "Palm",
["Pau Cin Hau"] = "Pauc",
["Pazend"] = "pal-Avst",
["Phags-pa"] = "Phag",
["Phoenician"] = "Phnx",
["Pollard"] = "Plrd",
["Proto-Cuneiform"] = "Pcun",
["Proto-Elamite"] = "Pelm",
["Proto-Sinaitic"] = "Psin",
["Psalter Pahlavi"] = "Phlp",
["Ranjana"] = "Ranj",
["Rejang"] = "Rjng",
["Rongorongo"] = "Roro",
["Rumi numerals"] = "Rumin",
["Runic"] = "Runr",
["Samaritan"] = "Samr",
["Saurashtra"] = "Saur",
["Shahmukhi"] = "Aran",
["Sharada"] = "Shrd",
["Shavian"] = "Shaw",
["Siddham"] = "Sidd",
["Sidetic"] = "Sidt",
["SignWriting"] = "Sgnw",
["Simplified Han"] = "Hans",
["Sinhalese"] = "Sinh",
["Sogdian"] = "Sogd",
["Sorang Sompeng"] = "Sora",
["Southeastern Iberian"] = "Ibrns",
["Soyombo"] = "Soyo",
["Sui"] = "Shui",
["Sundanese"] = "Sund",
["Sunuwar"] = "Sunu",
["Sylheti Nagri"] = "Sylo",
["Syriac"] = "Syrc",
["Tagbanwa"] = "Tagb",
["Tai Nüa"] = "Tale",
["Tai Tham"] = "Lana",
["Tai Viet"] = "Tavt",
["Takri"] = "Takr",
["Tamil"] = "Taml",
["Tamyig"] = "sit-tam-Tibt",
["Tangsa"] = "Tnsa",
["Tangut"] = "Tang",
["Telugu"] = "Telu",
["Tengwar"] = "Teng",
["Thaana"] = "Thaa",
["Thai"] = "Thai",
["Tibetan"] = "Tibt",
["Tifinagh"] = "Tfng",
["Tigalari"] = "Tutg",
["Tirhuta"] = "Tirh",
["Todhri"] = "Todr",
["Tolong Siki"] = "Tols",
["Toto"] = "Toto",
["Traditional Han"] = "Hant",
["Ugaritic"] = "Ugar",
["Vai"] = "Vaii",
["Varang Kshiti"] = "Wara",
["Visible Speech"] = "Visp",
["Vithkuqi"] = "Vith",
["Wancho"] = "Wcho",
["Woleai"] = "Wole",
["Xibe"] = "sjo-Mong",
["Yezidi"] = "Yezi",
["Yi"] = "Yiii",
["Zanabazar Square"] = "Zanb",
["Zhuyin"] = "Bopo",
["Znamenny musical notation"] = "Zname",
["flag semaphore"] = "Semap",
["mathematical notation"] = "Zmth",
["musical notation"] = "Music",
["symbolic"] = "Zsym",
["uncoded"] = "Zzzz",
["undetermined"] = "Zyyy",
["unspecified"] = "None",
["unwritten"] = "Zxxx",
}
6b22bp3m71of958rzhttmxwrkuk69zk
मॉड्यूल:scripts/canonical names.json
828
306977
487839
2026-09-02T19:59:12Z
SM7
6218
"{ "Adlam": "Adlm", "Afaka": "Afak", "Ahom": "Ahom", "Anatolian hieroglyphic": "Hluw", "Ancient North Arabian": "Narb", "Ancient South Arabian": "Sarb", "Arabic": "Arab", "Armenian": "Armn", "Assamese": "as-Beng", "Avestan": "Avst", "Balbodh": "Deva", "Balinese": "Bali", "Bamum": "Bamu", "Bassa": "Bass", "Batak": "Batk", "Baybayin": "Tglg", "Bengali": "Beng", "Bhaiksuki": "Bhks", "Blissymbolic": "Blis", "Book Pa..." के साथ नया पृष्ठ बनाया
487839
json
application/json
{
"Adlam": "Adlm",
"Afaka": "Afak",
"Ahom": "Ahom",
"Anatolian hieroglyphic": "Hluw",
"Ancient North Arabian": "Narb",
"Ancient South Arabian": "Sarb",
"Arabic": "Arab",
"Armenian": "Armn",
"Assamese": "as-Beng",
"Avestan": "Avst",
"Balbodh": "Deva",
"Balinese": "Bali",
"Bamum": "Bamu",
"Bassa": "Bass",
"Batak": "Batk",
"Baybayin": "Tglg",
"Bengali": "Beng",
"Bhaiksuki": "Bhks",
"Blissymbolic": "Blis",
"Book Pahlavi": "Phlv",
"Brahmi": "Brah",
"Braille": "Brai",
"Buhid": "Buhd",
"Burmese": "Mymr",
"Canadian syllabic": "Cans",
"Carian": "Cari",
"Caucasian Albanian": "Aghb",
"Chakma": "Cakm",
"Cham": "Cham",
"Cherokee": "Cher",
"Chisoi": "Chis",
"Clear Script": "xwo-Mong",
"Coptic": "Copt",
"Cuneiform": "Xsux",
"Cypriot": "Cprt",
"Cypro-Minoan": "Cpmn",
"Cyrillic": "Cyrl",
"Demotic": "Egyd",
"Deseret": "Dsrt",
"Devanagari": "Deva",
"Dhives Akuru": "Diak",
"Dogra": "Dogr",
"Dongba": "Nkdb",
"Duployan": "Dupl",
"Egyptian hieroglyphic": "Egyp",
"Elbasan": "Elba",
"Elymaic": "Elym",
"Ethiopic": "Ethi",
"Fraktur": "Latf",
"Fraser": "Lisu",
"Gaelic": "Latg",
"Garay": "Gara",
"Geba": "Nkgb",
"Georgian": "Geor",
"Glagolitic": "Glag",
"Gothic": "Goth",
"Grantha": "Gran",
"Greek": "Grek",
"Gujarati": "Gujr",
"Gunjala Gondi": "Gong",
"Gurmukhi": "Guru",
"Han": "Hani",
"Hangul": "Hang",
"Hanifi Rohingya": "Rohg",
"Hanunoo": "Hano",
"Hatran": "Hatr",
"Hebrew": "Hebr",
"Hieratic": "Egyh",
"Hiragana": "Hira",
"Image-rendered": "Image",
"Imperial Aramaic": "Armi",
"Indus": "Inds",
"Inscriptional Pahlavi": "Phli",
"Inscriptional Parthian": "Prti",
"International Phonetic Alphabet": "Ipach",
"Japanese": "Jpan",
"Javanese": "Java",
"Jurchen": "Jurc",
"Kaithi": "Kthi",
"Kana": "Hrkt",
"Kannada": "Knda",
"Katakana": "Kana",
"Kawi": "Kawi",
"Kayah Li": "Kali",
"Kharoshthi": "Khar",
"Khema": "Gukh",
"Khitan large": "Kitl",
"Khitan small": "Kits",
"Khmer": "Khmr",
"Khojki": "Khoj",
"Khom Thai": "Khomt",
"Khudabadi": "Sind",
"Khutsuri": "Geok",
"Khwarezmian": "Chrs",
"Kirat Rai": "Krai",
"Korean": "Kore",
"Kpelle": "Kpel",
"Kulitan": "Kulit",
"Lai Tay": "Tayo",
"Lao": "Laoo",
"Latin": "Latn",
"Leke": "Leke",
"Lepcha": "Lepc",
"Limbu": "Limb",
"Linear A": "Lina",
"Linear B": "Linb",
"Loma": "Loma",
"Lontara": "Bugi",
"Lycian": "Lyci",
"Lydian": "Lydi",
"Mahajani": "Mahj",
"Makasar": "Maka",
"Malayalam": "Mlym",
"Manchu": "mnc-Mong",
"Mandaic": "Mand",
"Manichaean": "Mani",
"Marchen": "Marc",
"Masaram Gondi": "Gonm",
"Maya": "Maya",
"Medefaidrin": "Medf",
"Meitei Mayek": "Mtei",
"Mende": "Mend",
"Meroitic cursive": "Merc",
"Meroitic hieroglyphic": "Mero",
"Modi": "Modi",
"Mongolian": "Mong",
"Moon": "Moon",
"Morse code": "Morse",
"Mru": "Mroo",
"Multani": "Mult",
"Mundari Bani": "Nagm",
"N'Ko": "Nkoo",
"Nabataean": "Nbat",
"Nandinagari": "Nand",
"New Tai Lue": "Talu",
"Newa": "Newa",
"Northeastern Iberian": "Ibrnn",
"Nyiakeng Puachue Hmong": "Hmnp",
"Nüshu": "Nshu",
"Odia": "Orya",
"Ogham": "Ogam",
"Ol Chiki": "Olck",
"Ol Onal": "Onao",
"Old Cyrillic": "Cyrs",
"Old Hungarian": "Hung",
"Old Italic": "Ital",
"Old Permic": "Perm",
"Old Persian": "Xpeo",
"Old Sogdian": "Sogo",
"Old Turkic": "Orkh",
"Old Uyghur": "Ougr",
"Osage": "Osge",
"Osmanya": "Osma",
"Pahawh Hmong": "Hmng",
"Palmyrene": "Palm",
"Pau Cin Hau": "Pauc",
"Pazend": "pal-Avst",
"Phags-pa": "Phag",
"Phoenician": "Phnx",
"Pollard": "Plrd",
"Proto-Cuneiform": "Pcun",
"Proto-Elamite": "Pelm",
"Proto-Sinaitic": "Psin",
"Psalter Pahlavi": "Phlp",
"Ranjana": "Ranj",
"Rejang": "Rjng",
"Rongorongo": "Roro",
"Rumi numerals": "Rumin",
"Runic": "Runr",
"Samaritan": "Samr",
"Saurashtra": "Saur",
"Shahmukhi": "Aran",
"Sharada": "Shrd",
"Shavian": "Shaw",
"Siddham": "Sidd",
"Sidetic": "Sidt",
"SignWriting": "Sgnw",
"Simplified Han": "Hans",
"Sinhalese": "Sinh",
"Sogdian": "Sogd",
"Sorang Sompeng": "Sora",
"Southeastern Iberian": "Ibrns",
"Soyombo": "Soyo",
"Sui": "Shui",
"Sundanese": "Sund",
"Sunuwar": "Sunu",
"Sylheti Nagri": "Sylo",
"Syriac": "Syrc",
"Tagbanwa": "Tagb",
"Tai Nüa": "Tale",
"Tai Tham": "Lana",
"Tai Viet": "Tavt",
"Takri": "Takr",
"Tamil": "Taml",
"Tamyig": "sit-tam-Tibt",
"Tangsa": "Tnsa",
"Tangut": "Tang",
"Telugu": "Telu",
"Tengwar": "Teng",
"Thaana": "Thaa",
"Thai": "Thai",
"Tibetan": "Tibt",
"Tifinagh": "Tfng",
"Tigalari": "Tutg",
"Tirhuta": "Tirh",
"Todhri": "Todr",
"Tolong Siki": "Tols",
"Toto": "Toto",
"Traditional Han": "Hant",
"Ugaritic": "Ugar",
"Vai": "Vaii",
"Varang Kshiti": "Wara",
"Visible Speech": "Visp",
"Vithkuqi": "Vith",
"Wancho": "Wcho",
"Woleai": "Wole",
"Xibe": "sjo-Mong",
"Yezidi": "Yezi",
"Yi": "Yiii",
"Zanabazar Square": "Zanb",
"Zhuyin": "Bopo",
"Znamenny musical notation": "Zname",
"flag semaphore": "Semap",
"mathematical notation": "Zmth",
"musical notation": "Music",
"symbolic": "Zsym",
"uncoded": "Zzzz",
"undetermined": "Zyyy",
"unspecified": "None",
"unwritten": "Zxxx"
}
i93e49hv0i31oyjmfvncnyu054ybq9l
मॉड्यूल:category tree/fam
828
306978
487840
2026-09-02T20:01:04Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487840
Scribunto
text/plain
-- This module contains a list of families with family-specific modules.
local families_with_modules = {
["alg"] = true,
["gem"] = true,
["jpx"] = true,
["qfa-kor"] = true,
["roa-ibe"] = true,
["sem-ara"] = true,
["sla"] = true,
["trk"] = true,
["tup"] = true,
["zhx"] = true,
}
return families_with_modules
i4uemo2elq7n14h8788ftpa3rouz69z
487849
487840
2026-09-02T20:12:27Z
SM7
6218
कुछ को छुपाया
487849
Scribunto
text/plain
-- This module contains a list of families with family-specific modules.
local families_with_modules = {
-- ["alg"] = true,
-- ["gem"] = true,
-- ["jpx"] = true,
["qfa-kor"] = true,
-- ["roa-ibe"] = true,
-- ["sem-ara"] = true,
-- ["sla"] = true,
["trk"] = true,
-- ["tup"] = true,
-- ["zhx"] = true,
}
return families_with_modules
mxv96g2mffbnwrrqj741fncjq7yolav
मॉड्यूल:table/sparseIpairs
828
306979
487841
2026-09-02T20:02:49Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487841
Scribunto
text/plain
local table_num_keys_module = "Module:table/numKeys"
local function num_keys(...)
num_keys = require(table_num_keys_module)
return num_keys(...)
end
--[==[
An iterator which works like `ipairs`, but which works for sparse arrays.]==]
return function(t)
local keys, i = num_keys(t), 0
return function()
i = i + 1
local k = keys[i]
if k ~= nil then
return k, t[k]
end
end
end
awvh1kj2qsubuy2anwvpmp6t7xxz299
मॉड्यूल:labels/utilities
828
306980
487842
2026-09-02T20:03:19Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487842
Scribunto
text/plain
local export = {}
-- This module contains ancillary functions for manipulating labels. Currently the supported functions are for finding
-- the labels that generate a given category.
local m_labels = require("Module:labels")
local languages_module = "Module:languages"
--[==[
Find the labels matching category `cat` of type `cat_type` for language `lang` (a full language object). `lang` can be
{nil}, but in that case no language-specific labels will be fetched. Currently supported values for `cat_type` are
{"topic"} for topic categories, e.g. {en:Water}; {"pos"} for POS categories, e.g. {English attenuative verbs};
{"regional"} for regional categories, e.g. {Ghanaian English}; {"sense"} for sense-dependent categories, e.g.
{English obsolete terms} or {English terms with obsolete senses} (where the particular category chosen depends on
whether {{tl|lb}} or {{tl|tlb}} is used); and {"plain"} for plain categories, e.g. {Issime Walser}. The format of `cat`
depends on `cat_type`, but in general is the portion of the category minus the language prefix or suffix. For topic
categories it should be e.g. {"water"} or {"Water"} (either form works); for POS categories it should be e.g.
{"attenuative verbs"}; for regional categories it should be e.g. {"Ghanaian"}; for sense categories it should be e.g.
{"obsolete"}; and for plain categories it should be e.g. {"Issime Walser"} (the actual category name).
Note that this will only check for categories of the specified type. In particular, since the format of POS and
sense-dependent categories overlaps, you may need to check for labels with both types of categories. (This is done, for
example, in [[Module:category tree/poscatboiler]]; see that module for details.) Likewise with regional and plain
categories. (See the code in [[Module:category tree/poscatboiler/data/language varieties]] that handles both types of
categories.)
If `cat_type` is {"plain"} and `check_all_langs` is specified, the code will check all language-specific modules for
plan categories matching `cat`. In that case, the relevant language is returned in the return value structure (see
below).
The return value is a table whose keys are concatenations of labels and language codes (separated by a colon), and
whose values are objects with the following keys:
* `module` (the name of the module from which the label was fetched);
* `labdata` (the raw label data structure from this module);
* `canonical` (the canonical form of the label);
* `aliases` (a list of any aliases for the label, not including the label itself);
* `lang` (the language needed to generate the category using the label; this will always be the passed-in `lang` unless
`check_all_langs` is specified, in which case it may be a different language).
The table can be directly passed to `format_labels_categorizing`.
]==]
function export.find_labels_for_category(cat, cat_type, lang, check_all_langs)
local function ucfirst(txt)
return mw.getContentLanguage():ucfirst(txt)
end
local function transform_cat_for_comparison(cat)
if cat_type ~= "pos" and cat_type ~= "sense" then
cat = ucfirst(cat)
end
return cat
end
local function should_error_on_cat(cat)
if cat_type == "topic" then
return cat:find("^[Aa]ll ")
elseif cat_type == "pos" then
return cat == "lemmas"
elseif cat_type == "regional" then
return cat == "British" -- an arbitrary known regional category
elseif cat_type == "sense" then
return cat == "obsolete" -- an arbitrary known sense category
else
return cat == "Issime Walser" -- an arbitrary known plain category
end
end
local function labcat_matches(labcat)
if cat_type ~= "pos" and cat_type ~= "sense" then
return ucfirst(labcat) == cat
else
return labcat == cat
end
end
local function fetch_labdata_cats(labdata)
if cat_type == "topic" then
return labdata.topical_categories
elseif cat_type == "pos" then
return labdata.pos_categories
elseif cat_type == "regional" then
return labdata.regional_categories
elseif cat_type == "sense" then
return labdata.sense_categories
else
return labdata.plain_categories
end
end
cat = transform_cat_for_comparison(cat)
local cat_labels_found = {}
local prev_modules_labels_found = {}
local this_module_labels_found
local function check_submodule(submodule_to_check, lang)
if this_module_labels_found then
for label, _ in pairs(this_module_labels_found) do
prev_modules_labels_found[label] = true
end
end
this_module_labels_found = {}
local submodule = mw.loadData(submodule_to_check)
for label, labdata in pairs(submodule) do
local canonical = label
local num_hops = 0
local hop_error = false
while type(labdata) == "string" do
num_hops = num_hops + 1
if num_hops >= 10 then
if should_error_on_cat(cat) then
error(("Internal error: Likely alias loop processing label '%s' in submodule '%s'"):format(label, submodule_to_check))
else
hop_error = true
break
end
end
-- an alias
canonical = labdata
labdata = submodule[labdata]
end
if hop_error then
-- skip this label
elseif not labdata then
if should_error_on_cat(cat) then
-- Only error at top level to avoid a flood of errors.
error(("Internal error: In submodule '%s', label '%s' is aliased to '%s', which doesn't exist"):format(submodule_to_check, label, canonical))
end
else
-- Deprecated labels directly assign an object to aliases, where `canonical` is the canonical label.
if labdata.canonical then
canonical = labdata.canonical
end
local labcats = fetch_labdata_cats(labdata)
local matching_labcat
if labcats then
if type(labcats) ~= "table" then
labcats = {labcats}
end
for _, labcat in ipairs(labcats) do
if labcat == true then
labcat = canonical
end
if labcat_matches(labcat) then
matching_labcat = true
break
end
end
end
local canonical_with_lang = canonical .. ":" .. (lang and lang:getCode() or "nil")
if matching_labcat and not prev_modules_labels_found[canonical_with_lang] then
this_module_labels_found[canonical_with_lang] = true
if not cat_labels_found[canonical_with_lang] then
cat_labels_found[canonical_with_lang] = {
module = submodule_to_check, canonical = canonical,
aliases = {}, lang = lang, labdata = labdata
}
end
if canonical ~= label then
table.insert(cat_labels_found[canonical_with_lang].aliases, label)
end
end
end
end
end
local submodules_to_check
if check_all_langs then
if cat_type ~= "plain" then
error("Currently, `check_all_langs` only supported with category type \"plain\"")
end
submodules_to_check = {}
local all_lang_codes = mw.loadData(m_labels.lang_specific_data_list_module)
for lang_code, _ in pairs(all_lang_codes.langs_with_lang_specific_modules) do
local lang = require(languages_module).getByCode(lang_code)
if lang then
table.insert(submodules_to_check, {
module = m_labels.lang_specific_data_modules_prefix .. lang_code,
lang = lang
})
end
end
for _, submodule_to_check in ipairs(m_labels.get_submodules(nil)) do
table.insert(submodules_to_check, {module = submodule_to_check, lang = lang})
end
else
submodules_to_check = m_labels.get_submodules(lang)
for i, submodule_to_check in ipairs(submodules_to_check) do
submodules_to_check[i] = {module = submodule_to_check, lang = lang}
end
end
for _, submodule_to_check in ipairs(submodules_to_check) do
check_submodule(submodule_to_check.module, submodule_to_check.lang)
end
return cat_labels_found
end
--[==[
Format the labels that categorize into some category for display in the text for that category. `lang` is the
language of the category, or {nil}. `labels` are the labels that categorize when invoked using {{tl|lb}}, while
`tlb_labels` are the labels that categorize when invoked using {{tl|tlb}}. Both of these parameters are tables whose
keys are concatenations of labels and language codes and whose values are objects as returned by
`find_labels_for_category`. Returns {nil} if there are no labels.
]==]
function export.format_labels_categorizing(labels, tlb_labels, lang)
local function make_code(txt)
return ("<code>%s</code>"):format(txt)
end
local function generate_label_set_text(labels, use_tlb, include_in_addition)
local labels_by_lang = {}
for _, labobj in pairs(labels) do
local labobj_code = labobj.lang and labobj.lang:getCode() or false
if not labels_by_lang[labobj_code] then
labels_by_lang[labobj_code] = {}
end
table.insert(labels_by_lang[labobj_code], labobj)
end
local function process_lang_labels(labels)
local formatted_labels = {}
local has_aliases = false
if labels then
for _, labobj in ipairs(labels) do
local function make_edit_button()
return ("<sup>[%s edit]</sup>"):format(tostring(mw.uri.fullUrl(labobj.module, "action=edit")))
end
local label = labobj.canonical
local aliases = labobj.aliases
if #aliases == 0 then
table.insert(formatted_labels, make_code(label) .. make_edit_button())
elseif #aliases == 1 then
table.insert(formatted_labels,
("%s (alias %s)%s"):format(make_code(label), make_code(aliases[1]), make_edit_button()))
has_aliases = true
else
table.sort(aliases)
for i, alias in ipairs(aliases) do
aliases[i] = make_code(alias)
end
table.insert(formatted_labels,
("%s (aliases %s)%s"):format(make_code(label),table.concat(aliases, ", "), make_edit_button()))
has_aliases = true
end
end
end
return formatted_labels, has_aliases
end
local function get_intro_text(num_labels, include_also)
local intro_wording = not include_also and include_in_addition and "In addition, the" or "The"
local sense_dependent = use_tlb and "sense-dependent " or ""
return ("%s following %slabel%s %sgenerate%s this category:"):format(intro_wording,
sense_dependent, num_labels == 1 and "" or "s",
include_also and "also " or "", num_labels == 1 and "s" or "")
end
local function get_label_text(label_lang, formatted_labels, has_aliases)
table.sort(formatted_labels)
local retval = table.concat(formatted_labels, "; ") .. ". "
local template = use_tlb and "tlb" or "lb"
local this_label_text
if #formatted_labels == 1 and not has_aliases then
this_label_text = "this label"
else
this_label_text = "one of these labels"
end
if label_lang then
retval = retval .. ("To generate this category using %s, use {{tl|%s|%s|<var>label</var>}}."):format(
this_label_text, template, label_lang:getCode())
else
retval = retval .. ("To generate this category using %s, use {{tl|%s|<var>langcode</var>|<var>label</var>}}, " ..
"where <code><var>langcode</var></code> is the appropriate language code for the language in question " ..
"(see [[Wiktionary:List of languages]])."):format(this_label_text, template)
end
return retval
end
if not lang then
local formatted_labels, has_aliases = process_lang_labels(labels_by_lang[false])
if #formatted_labels > 0 then
local intro_text = get_intro_text(#formatted_labels)
local label_text = get_label_text(false, formatted_labels, has_aliases)
return intro_text .. " " .. label_text
end
else
local formatted_labels, has_aliases = process_lang_labels(labels_by_lang[lang:getCode()])
local this_lang_text
if #formatted_labels > 0 then
local intro_text = get_intro_text(#formatted_labels)
local label_text = get_label_text(lang, formatted_labels, has_aliases)
this_lang_text = intro_text .. " " .. label_text
end
local langcode = lang:getCode()
local other_langs_label_text = {}
local total_num_other_lang_labels = 0
for other_lang_code, lang_labels in pairs(labels_by_lang) do
if other_lang_code ~= langcode then
local formatted_labels, has_aliases = process_lang_labels(lang_labels)
if #formatted_labels > 0 then
total_num_other_lang_labels = total_num_other_lang_labels + #formatted_labels
local other_lang = require(languages_module).getByCode(other_lang_code, true, "allow etym")
local label_text = get_label_text(other_lang, formatted_labels, has_aliases)
table.insert(other_langs_label_text,
("* For %s: %s"):format(other_lang:getCanonicalName(), label_text))
end
end
end
local other_lang_text
if total_num_other_lang_labels > 0 then
table.sort(other_langs_label_text)
local intro_text = get_intro_text(total_num_other_lang_labels, this_lang_text and "include also")
other_lang_text = intro_text .. "\n" .. table.concat(other_langs_label_text, "\n")
end
if this_lang_text and other_lang_text then
return ("%s\n\n%s"):format(this_lang_text, other_lang_text)
else
return this_lang_text or other_lang_text
end
end
end
local labels_text = generate_label_set_text(labels)
local tlb_labels_text = tlb_labels and
generate_label_set_text(tlb_labels, "use tlb", labels_text and "include in addition") or nil
if labels_text and tlb_labels_text then
return ("%s\n\n%s"):format(labels_text, tlb_labels_text)
else
return labels_text or tlb_labels_text
end
end
return export
crgb29elv68h2qsr1ml03cepd5uto1h
साँचा:commons category
10
306981
487843
2026-09-02T20:05:54Z
SM7
6218
"{{interproject-box|logo=Commons-logo.svg|logolink=commons:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|intro=[[c:|Wikimedia Commons]] has media about|noitalic={{#ifeq:{{{3|}}}|ni|1|}}|link=[[c:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|{{{2|{{{1|{{ucfirst:{{PAGENAME}}}}}}}}}}]]}}<noinclude>{{documentation}}</noinclude>" के साथ नया पृष्ठ बनाया
487843
wikitext
text/x-wiki
{{interproject-box|logo=Commons-logo.svg|logolink=commons:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|intro=[[c:|Wikimedia Commons]] has media about|noitalic={{#ifeq:{{{3|}}}|ni|1|}}|link=[[c:Category:{{{1|{{ucfirst:{{PAGENAME}}}}}}}|{{{2|{{{1|{{ucfirst:{{PAGENAME}}}}}}}}}}]]}}<noinclude>{{documentation}}</noinclude>
71adsemdad3dpdyhl8wm4t0zbad2jzk
साँचा:interproject-box
10
306982
487844
2026-09-02T20:06:24Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487844
wikitext
text/x-wiki
<includeonly><div class="interproject-box {{#if:{{{sisterclass|}}}|sister-{{{sisterclass}}}}} sister-project noprint floatright"><div style="float: left;" class="interproject-box-logo">[[File:{{{logo}}}|{{{logosize|x40px}}}|none|link={{{logolink|}}}|alt={{{logoalt|}}}]]</div><div style="margin-left: 60px;">{{{intro}}}:<div style="margin-left: 10px;">{{#if:{{{nobold|}}}|<span {{#if:{{{nolang|}}}|| class="Latn" lang="en"}}>|<b {{#if:{{{nolang|}}}|| class="Latn" lang="en"}}>}}{{#if:{{{noitalic|}}}||<i>}}{{{link|}}}{{#if:{{{noitalic|}}}||</i>}}{{#if:{{{nobold|}}}|</span>|</b>}}</div></div>{{#if:{{{interprojectlink|}}}|<span class="interProject">{{{interprojectlink}}}</span>}}</div><templatestyles src="Module:interproject/style.css" /></includeonly><noinclude>{{interproject-box|logo=Commons-emblem-success.svg|logoalt=Hello, World!|intro=This Wiktionary template has more information on {{FULLPAGENAME}}|link=[[#documentation|{{FULLPAGENAME}}]]}}{{documentation}}</noinclude>
3eoiinhktx1dffstt568c2vkft2svjd
साँचा:commonscat
10
306983
487845
2026-09-02T20:06:30Z
SM7
6218
[[साँचा:commons category]] को अनुप्रेषित
487845
wikitext
text/x-wiki
#पुनर्प्रेषित [[साँचा:commons category]]
sla5wxnvs20ckvt49fc0cwc2giovkqu
मॉड्यूल:interproject/style.css
828
306984
487846
2026-09-02T20:07:23Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487846
sanitized-css
text/css
/* note: these styles are also used by some legacy templates that do not use the module. thus a full redesign should probably use a new class. */
.interproject-box {
font-size: 90%;
width: 250px;
padding: 5px;
text-align: left;
background: var(--wikt-palette-paleblue, #f9f9f9);
border: var(--border-color-base, #aaa) 1px solid;
display: flex;
flex-direction: row;
align-items: center;
}
.interproject-box-logo {
min-width: 44px;
display: flex;
align-items: center;
justify-content: center;
}
/* override inline styles */
.interproject-box > div:first-child {
float: none !important;
flex: none;
}
.interproject-box > div:nth-child(2) {
margin-left: 0.55em !important;
}
/* allow {{commonscat}} to be smaller in Vector skin */
body.skin-vector:not(.skin-vector-2022) .interproject-box .vector-hide {
display: none;
}
body.skin-vector:not(.skin-vector-2022) .interproject-box .vector-inline-block {
display: inline-block;
margin-left: 0 !important;
}
@media screen and (max-width: 719px) { /* >=720px is the crossover point for floats to work */
.interproject-box {
box-sizing: border-box;
line-height: 1.5;
width: 100%;
max-width: 100%;
padding: 6px;
}
}
m9k5xbng6wuwr54i1j6n3x45wmrntyz
मॉड्यूल:category tree/fam/qfa-kor
828
306985
487848
2026-09-02T20:10:11Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487848
Scribunto
text/plain
local labels = {}
local handlers = {}
labels["hanja"] = {
topright = "{{wp|Hanja}}",
description = "{{{langname}}} symbols of the Han logographic script, which can represent sounds or convey meanings directly.",
toc_template = "Hani-categoryTOC",
umbrella = "Han characters",
parents = "logograms",
}
labels["hanja forms"] = {
topright = "{{wp|Hanja}}",
description = "{{{langname}}} terms written in [[hanja]].",
parents = "terms by script",
}
labels["idu forms"] = {
topright = "{{wp|Idu script}}",
description = "{{{langname}}} terms written in [[idu]].",
parents = "terms by script",
}
labels["four-character idioms"] = {
topright = "{{wp|Sajaseong-eo}}",
description = "{{{langname}}} traditional idiomatic expressions, also called sajaseong-eo, usually consisting of four syllables and traditionally given in [[hanja]]; typically derived from [[Classical Chinese]].",
additional = "Compare Chinese {{w|chengyu}} and Japanese {{w|yojijukugo}}.",
umbrella = "four-character idioms",
parents = "idioms",
}
labels["terms written in Hanja-Hangul mixed script"] = {
topright = "{{wp|Korean mixed script}}",
description = "{{{langname}}} mixed script is a form of writing that uses both [[hangeul]] (hangul) (an alphabetical script) and [[hanja]] (logo-syllabic characters).",
parents = "terms written in multiple scripts",
}
return {LABELS = labels, HANDLERS = handlers}
sg8wfygn9ns7dv1gh1uvf8z468u1th2
मॉड्यूल:category tree/fam/trk
828
306986
487850
2026-09-02T20:13:12Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487850
Scribunto
text/plain
local labels = {}
------- Turkic izafet I/II/III compounds -------
-- FIXME: Possibly should be limited to a subfamily of Turkic.
labels["izafet I compounds"] = {
description = "{{{langname}}} izafet I compounds, i.e. nominal compounds consisting of two nouns both lacking 3rd-person possessive marking.",
additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.",
breadcrumb_and_first_sort_key = "izafet I",
parents = {"compound terms"},
}
labels["izafet II compounds"] = {
description = "{{{langname}}} izafet II compounds, i.e. nominal compounds with the first noun having zero-marking, and the second noun receiving a possessive suffix.",
additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.",
breadcrumb_and_first_sort_key = "izafet II",
parents = {"compound terms"},
}
labels["izafet III compounds"] = {
description = "{{{langname}}} izafet III compounds, i.e. nominal compounds with the first noun in the genitive case and the second noun receiving a possessive suffix.",
additional = "These compounds are right-headed (the second noun is modified by the first), unlike Persian {{lg|ezafe}} compounds, which are typically left-headed.",
breadcrumb_and_first_sort_key = "izafet III",
parents = {"compound terms"},
}
labels["Persian-style izafet compounds"] = {
description = "{{{langname}}} Persian-style izafet compounds, i.e. left-headed nominal compounds with the first noun receiving a Persian-style {{lg|ezafe}} suffix and the second noun having zero-marking.",
additional = "These compounds are left-headed (the first noun is modified by second), unlike native Turkic izafet compounds, which are always right-headed.",
breadcrumb_and_first_sort_key = "Persian-style",
parents = {"izafet II compounds"},
}
-- Add 'umbrella_parents' key if not already present.
for key, data in pairs(labels) do
if not data.umbrella_parents then
data.umbrella_parents = "Types of compound terms by language"
end
end
return {LABELS = labels}
ps5lfysh0wgnpjatzdh4pzsy8y1w7y6
मॉड्यूल:category tree/lang
828
306987
487857
2026-09-02T20:49:37Z
SM7
6218
अंग्रेजी विक्षनरी से आयातित
487857
Scribunto
text/plain
-- This module contains a list of languages with lang-specific modules.
local langs_with_modules = {
["acm"] = true,
["acw"] = true,
["acy"] = true,
["aeb"] = true,
["afb"] = true,
["aii"] = true,
["ajp"] = true,
["akk"] = true,
["akl"] = true,
["ang"] = true,
["apc"] = true,
["apd"] = true,
["ar"] = true,
["arn"] = true,
["ars"] = true,
["ary"] = true,
["arz"] = true,
["ayl"] = true,
["az"] = true,
["bbl"] = true,
["be"] = true,
["bcl"] = true,
["bg"] = true,
["bku"] = true,
["ca"] = true,
["cbk"] = true,
["ce"] = true,
["ceb"] = true,
["cpi"] = true,
["cs"] = true,
["csb"] = true,
["cu"] = true,
["cy"] = true,
["de"] = true,
["egy"] = true,
["el"] = true,
["en"] = true,
["enm"] = true,
["eo"] = true,
["es"] = true,
["et"] = true,
["eu"] = true,
["fa"] = true,
["fax"] = true,
["fi"] = true,
["fr"] = true,
["fro"] = true,
["fy"] = true,
["gho"] = true,
["gl"] = true,
["gmh"] = true,
["goh"] = true,
["got"] = true,
["grk-pro"] = true,
["gmq-osw"] = true,
["gmw-pro"] = true,
["gu"] = true,
["gug"] = true,
["he"] = true,
["hi"] = true,
["hil"] = true,
["hnn"] = true,
["hrx"] = true,
["hsb"] = true,
["hu"] = true,
["id"] = true,
["ilo"] = true,
["inc-apa"] = true,
["inc-ash"] = true,
["ine-bsl-pro"] = true,
["ine-pro"] = true,
["ira-pro"] = true,
["is"] = true,
["it"] = true,
["ja"] = true,
["jbo"] = true,
["jv"] = true,
["ket"] = true,
["klj"] = true,
["kn"] = true,
["kne"] = true,
["ko"] = true,
["krj"] = true,
["ky"] = true,
["la"] = true,
["lo"] = true,
["mdh"] = true,
["mhr"] = true,
["mk"] = true,
["moh"] = true,
["mr"] = true,
["mrw"] = true,
["ms"] = true,
["mt"] = true,
["mul"] = true,
["mvi"] = true,
["mwl"] = true,
["nan-hbl"] = true,
["nb"] = true,
["ne"] = true,
["nl"] = true,
["nn"] = true,
["non"] = true,
["ny"] = true,
["odt"] = true,
["orv"] = true,
["osx"] = true,
["pag"] = true,
["pam"] = true,
["phl"] = true,
["pi"] = true,
["pl"] = true,
["pra"] = true,
["pt"] = true,
["ro"] = true,
["roa-opt"] = true,
["rsk"] = true,
["ru"] = true,
["rue"] = true,
["sa"] = true,
["sc"] = true,
["sd"] = true,
["sei"] = true,
["sga"] = true,
["sh"] = true,
["shn"] = true,
["shu"] = true,
["sk"] = true,
["skr"] = true,
["sw"] = true,
["syc"] = true,
["szl"] = true,
["te"] = true,
["tg"] = true,
["th"] = true,
["tl"] = true,
["tpw"] = true,
["tsg"] = true,
["uk"] = true,
["ulw"] = true,
["ur"] = true,
["vec"] = true,
["vep"] = true,
["vi"] = true,
["war"] = true,
["yrl"] = true,
["zhx"] = true,
["zle-ono"] = true,
["zle-ort"] = true,
["zlw-ocs"] = true,
}
return langs_with_modules
b69j2h0jp2mxg9nt3u7afqo7fn7gk8m
কৃষক
0
306988
487860
2026-09-03T05:40:48Z
अजीत कुमार तिवारी
4887
+1
487860
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कृषक]]
# [[किसान]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
खेती-बारी करने वाला, कृषक। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
8xef7zkkovqrp61xs0h16ejbyzx2jrg
487873
487860
2026-09-03T10:03:19Z
SM7
6218
+बंगाली + व्युत्पत्ति साँचे (परीक्षण हेतु)
487873
wikitext
text/x-wiki
==असमिया==
===व्युत्पत्ति===
{{lbor|as|sa|कृषक}}.
===संज्ञा===
{{as-noun}}
# [[कृषक]]
# [[किसान]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# खेती-बारी करने वाला, कृषक। (पुल्लिंग)
{{C|as|लोग}}
[[श्रेणी:हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
==बंगाली==
===व्युत्पत्ति===
{{lbor|bn|sa|कृषक}}.
===उच्चारण===
{{bn-IPA}}
===संज्ञा===
{{bn-noun}}
# [[किसान]], [[कृषक]], खेतीबाड़ी करने वाला।
{{C|bn|लोग}}
44amfpp7scmpvpw4002yezrw5djk73s
487877
487873
2026-09-03T10:08:46Z
SM7
6218
सामग्री को "{{lbor|as|sa|कृषक}}." में बदला
487877
wikitext
text/x-wiki
{{lbor|as|sa|कृषक}}.
gkqsmtejipqp92b2jkttwow9j4eaqcm
487889
487877
2026-09-03T10:37:02Z
SM7
6218
स्टेप बैक
487889
wikitext
text/x-wiki
==असमिया==
===व्युत्पत्ति===
{{lbor|as|sa|कृषक}}.
===संज्ञा===
{{as-noun}}
# [[कृषक]]
# [[किसान]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# खेती-बारी करने वाला, कृषक। (पुल्लिंग)
{{C|as|लोग}}
[[श्रेणी:हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
==बंगाली==
===व्युत्पत्ति===
{{lbor|bn|sa|कृषक}}.
===उच्चारण===
{{bn-IPA}}
===संज्ञा===
{{bn-noun}}
# [[किसान]], [[कृषक]], खेतीबाड़ी करने वाला।
{{C|bn|लोग}}
44amfpp7scmpvpw4002yezrw5djk73s
কিস্তি
0
306989
487861
2026-09-03T05:50:16Z
अजीत कुमार तिवारी
4887
+1
487861
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[किस्त]]
# [[क़िस्त]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# ऋण के भुगतान करने की वह प्रणाली जिसके अनुसार ऋणी को कुछ निश्चित अवधियों में ऋण को कई बराबर खंडों में चुकाना पड़ता है;
# एक किस्त में चुकाए गए ऋण की मात्रा;
# किसी वस्तु की प्राप्त कुल मात्रा का वह अंश जो किसी एक अवधि में दिया या लिया जाय। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
orxeycli9ox02j8vsiouc9dnofdwk39
অপচেষ্টা
0
306990
487862
2026-09-03T06:05:28Z
अजीत कुमार तिवारी
4887
+1
487862
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कुचेष्टा]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
बुरा कार्य करने का प्रयत्न। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
a9wii2d3lt3r6jowq8tuihxpfz7epe5
কেইটামান
0
306991
487863
2026-09-03T06:07:46Z
अजीत कुमार तिवारी
4887
+1
487863
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[कुछेक]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
गिनती या संख्या में कम, थोड़ा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
g6rfx0t8c33lp5ce6e23pn7kovxvlik
487864
487863
2026-09-03T06:12:06Z
अजीत कुमार तिवारी
4887
/* विशेषण */
487864
wikitext
text/x-wiki
==असमिया==
===विशेषण===
{{as-adj}}
# [[किंचित्]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
गिनती या संख्या में कम, थोड़ा।
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
07cfbtvr363k2x42ao0mpigz64o4l8v
কুটনী
0
306992
487865
2026-09-03T06:17:49Z
अजीत कुमार तिवारी
4887
+1
487865
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-adj}}
# [[कुटनी]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# स्त्रियों को बहकाकर उन्हें परपुरुष से मिलानेवाली स्त्री;
# दो पक्षों या व्यक्तियों में झगड़ा करानेवाली स्त्री। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
ddw8a0jsb2tnq7gmigsh5j1nptvxuil
487866
487865
2026-09-03T06:20:09Z
अजीत कुमार तिवारी
4887
487866
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कुटनी]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# स्त्रियों को बहकाकर उन्हें परपुरुष से मिलानेवाली स्त्री;
# दो पक्षों या व्यक्तियों में झगड़ा करानेवाली स्त्री। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
9p5309texs4iy68e3mbx5m86n7z1z67
কুঠাৰ
0
306993
487867
2026-09-03T06:23:05Z
अजीत कुमार तिवारी
4887
+1
487867
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कुठार]]
# [[परशु]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
# कुल्हाड़ा;
# फरसा। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
38zjwu82y6a2yfi0o7yo0onrdbyuuvu
কোৰ
0
306994
487868
2026-09-03T06:29:54Z
अजीत कुमार तिवारी
4887
+1
487868
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कुदाल]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
मिट्टी खोदने और खेत गोड़ने का एक औजार जिसमें लकड़ी का एक वेंट लगा होता है। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
hrbbdcembcf1vflm8w3iyx4jscvkcc2
487869
487868
2026-09-03T06:32:38Z
अजीत कुमार तिवारी
4887
487869
wikitext
text/x-wiki
==असमिया==
[[File:COLLECTIE TROPENMUSEUM Hak TMnr A-3790.jpg|thumb|কোৰ]]
===संज्ञा===
{{as-noun}}
# [[कुदाल]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
मिट्टी खोदने और खेत गोड़ने का एक औजार जिसमें लकड़ी का एक वेंट लगा होता है। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
9rcqqwsxlinm363s54fi38lbj91dua4
অপৰিপুষ্টি
0
306995
487870
2026-09-03T06:37:29Z
अजीत कुमार तिवारी
4887
+1
487870
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[कुपोषण]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
शरीर के लिए ऐसा पोषण जो अनुपयुक्त और हानिकारक हो। (पुल्लिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
ro9dniltep1p6gxdykixw3u1ez2icb9
অব্য়বস্থা
0
306996
487871
2026-09-03T06:49:57Z
अजीत कुमार तिवारी
4887
+1
487871
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[अव्यवस्था]]
# [[कुप्रबंध]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
उचित व्यवस्था का न होना, खराब या बुरा प्रबंध। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
i8mqkrd0moo9rrs2oqmr16lzv7vjndq
487872
487871
2026-09-03T06:51:39Z
अजीत कुमार तिवारी
4887
/* संज्ञा */
487872
wikitext
text/x-wiki
==असमिया==
===संज्ञा===
{{as-noun}}
# [[अव्यवस्था]]
=== प्रकाशित कोशों से अर्थ ===
==== हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश ====
उचित व्यवस्था का न होना, खराब या बुरा प्रबंध। (स्त्रीलिंग)
[[श्रेणी: हिन्दी-प्रकाशितकोशों से अर्थ-हिंदी-असमिया-अंग्रेज़ी त्रिभाषा कोश]]
3y1kvlp7b28nsijwkpq6udl7xzwgcx6
साँचा:bn-noun
10
306997
487874
2026-09-03T10:04:44Z
SM7
6218
नया साँचा अंग्रेजी से कॉपी करके
487874
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{head|bn|noun|sort={{{sort|}}}|head={{{head|{{{1|}}}}}}|autotrinfl=1|tr={{{tr|{{{tr1|}}}}}}|tr2={{{tr2|}}}|g={{{g|}}}
|{{#if:{{{obj|}}}|objective}}|{{{obj|}}}
|{{#if:{{{obj2|}}}|or}}|{{{obj2|}}}
|{{#if:{{{obj3|}}}|or}}|{{{obj3|}}}
|{{#if:{{{gen|}}}|genitive}}|{{{gen|}}}
|{{#if:{{{loc|}}}|locative}}|{{{loc|}}}
|{{#if:{{{loc2|}}}|or}}|{{{loc2|}}}
|{{#if:{{{m|}}}|male equivalent}}|{{{m|}}}
|{{#if:{{{f|}}}|female equivalent}}|{{{f|}}}
|{{#if:{{{mw|}}}|classifier}}|{{{mw|}}}
|cat2={{#if:{{{mw|}}}|nouns classified by {{{mw}}}}}
|cat3={{#if:{{{m|}}}{{{f|}}}|nouns with other-gender equivalents}}
}}<noinclude>{{documentation}}{{tcat|hw}}</noinclude>
9q43x9a2wrwn574s7svx3atx2agdvxx
साँचा:template cat
10
306998
487875
2026-09-03T10:06:44Z
SM7
6218
नया साँचा अंग्रेजी से कॉपी करके
487875
wikitext
text/x-wiki
<includeonly>{{#invoke:template cat|categorize}}</includeonly><noinclude>{{documentation}}</noinclude>
snrmdr6gj01ktlz7f7crr0jyhkh3jtd
साँचा:tcat
10
306999
487876
2026-09-03T10:07:38Z
SM7
6218
[[साँचा:template cat]] को अनुप्रेषित
487876
wikitext
text/x-wiki
#पुनर्प्रेषित [[साँचा:template cat]]
izakcxd7lmk0c5s7k3ngv5du0sxru9l
साँचा:tlb
10
307000
487885
2026-09-03T10:27:44Z
SM7
6218
[[साँचा:term-label]] को अनुप्रेषित
487885
wikitext
text/x-wiki
#पुनर्प्रेषित [[साँचा:term-label]]
qwpibgcon9babeyaylajof0qd9693nv
साँचा:term-label
10
307001
487886
2026-09-03T10:28:01Z
SM7
6218
"{{#invoke:labels/templates|show|term=1}}<noinclude>{{documentation}}</noinclude>" के साथ नया पृष्ठ बनाया
487886
wikitext
text/x-wiki
{{#invoke:labels/templates|show|term=1}}<noinclude>{{documentation}}</noinclude>
q1sk1j74jv2s11u1x0324przcr352sb