উইকিঅভিধান
bnwiktionary
https://bn.wiktionary.org/wiki/%E0%A6%AA%E0%A7%8D%E0%A6%B0%E0%A6%A7%E0%A6%BE%E0%A6%A8_%E0%A6%AA%E0%A6%BE%E0%A6%A4%E0%A6%BE
MediaWiki 1.47.0-wmf.6
case-sensitive
মিডিয়া
বিশেষ
আলাপ
ব্যবহারকারী
ব্যবহারকারী আলাপ
উইকিঅভিধান
উইকিঅভিধান আলোচনা
চিত্র
চিত্র আলোচনা
মিডিয়াউইকি
মিডিয়াউইকি আলোচনা
টেমপ্লেট
টেমপ্লেট আলোচনা
সাহায্য
সাহায্য আলোচনা
বিষয়শ্রেণী
বিষয়শ্রেণী আলোচনা
পরিশিষ্ট
পরিশিষ্ট আলোচনা
ছন্দ
ছন্দ আলোচনা
থিসরাস
থিসরাস আলোচনা
উদ্ধৃতি
উদ্ধৃতি আলোচনা
TimedText
TimedText talk
মডিউল
মডিউল আলাপ
ইভেন্ট
ইভেন্ট আলোচনা
বিষয়শ্রেণী:ইংরেজি ভাষা
14
2304
510578
30688
2026-06-10T03:35:51Z
Hiyuune
11971
Hiyuune [[বিষয়শ্রেণী:ইংরেজি]] কে [[বিষয়শ্রেণী:ইংরেজি ভাষা]] শিরোনামে স্থানান্তর করেছেন
30688
wikitext
text/x-wiki
[[বিষয়শ্রেণী:সকল ভাষা]]
lvxwpm9zbisymhqru6d474lsk75wtqd
510580
510578
2026-06-10T03:36:06Z
Hiyuune
11971
510580
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
510581
510580
2026-06-10T03:36:47Z
Hiyuune
11971
510581
wikitext
text/x-wiki
{{auto cat|আমেরিকা}}
r9j7kq17w4jhsl2m21n5kypyzm0ztj2
510589
510581
2026-06-10T05:24:50Z
Hiyuune
11971
510589
wikitext
text/x-wiki
{{auto cat|মার্কিন যুক্তরাষ্ট্রের}}
6f4jpcs6d5xv2xu5p9xrih0fuvm4fe7
510593
510589
2026-06-10T05:29:18Z
Hiyuune
11971
510593
wikitext
text/x-wiki
{{auto cat|মার্কিন যুক্তরাষ্ট্রের|মালয়েশিয়ার}}
nd8mzq95fp5ujisdpj8jafws41whrdr
মডিউল:languages
828
6288
510563
507786
2026-06-10T03:11:44Z
Hiyuune
11971
510563
Scribunto
text/plain
--[==[ intro:
This module implements fetching of language-specific information and processing text in a given language.
===Types of languages===
There are two types of languages: full languages and etymology-only languages. The essential difference is that only
full languages appear in L2 headings in vocabulary entries, and hence categories like [[:Category:French nouns]] exist
only for full languages. Etymology-only languages have either a full language or another etymology-only language as
their parent (in the parent-child inheritance sense), and for etymology-only languages with another etymology-only
language as their parent, a full language can always be derived by following the parent links upwards. For example,
"Canadian French", code `fr-CA`, is an etymology-only language whose parent is the full language "French", code `fr`.
An example of an etymology-only language with another etymology-only parent is "Northumbrian Old English", code
`ang-nor`, which has "Anglian Old English", code `ang-ang` as its parent; this is an etymology-only language whose
parent is "Old English", code `ang`, which is a full language. (This is because Northumbrian Old English is considered
a variety of Anglian Old English.) Sometimes the parent is the "Undetermined" language, code `und`; this is the case,
for example, for "substrate" languages such as "Pre-Greek", code `qsb-grc`, and "the BMAC substrate", code `qsb-bma`.
It is important to distinguish language ''parents'' from language ''ancestors''. The parent-child relationship is one
of containment, i.e. if X is a child of Y, X is considered a variety of Y. On the other hand, the ancestor-descendant
relationship is one of descent in time. For example, "Classical Latin", code `la-cla`, and "Late Latin", code `la-lat`,
are both etymology-only languages with "Latin", code `la`, as their parents, because both of the former are varieties
of Latin. However, Late Latin does *NOT* have Classical Latin as its parent because Late Latin is *not* a variety of
Classical Latin; rather, it is a descendant. There is in fact a separate `ancestors` field that is used to express the
ancestor-descendant relationship, and Late Latin's ancestor is given as Classical Latin. It is also important to note
that sometimes an etymology-only language is actually the conceptual ancestor of its parent language. This happens,
for example, with "Old Italian" (code `roa-oit`), which is an etymology-only variant of full language "Italian" (code
`it`), and with "Old Latin" (code `itc-ola`), which is an etymology-only variant of Latin. In both cases, the full
language has the etymology-only variant listed as an ancestor. This allows a Latin term to inherit from Old Latin
using the {{tl|inh}} template (where in this template, "inheritance" refers to ancestral inheritance, i.e. inheritance
in time, rather than in the parent-child sense); likewise for Italian and Old Italian.
Full languages come in three subtypes:
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted in the
main namespace. There may also be reconstructed terms for the language, which are placed in the
{Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full languages
are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto and Volapük,
among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed with
*. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore be in
the Appendix namespace, but they are not reconstructed and therefore should not have *
prefixed in links. Most constructed languages are of this subtype.
Both full languages and etymology-only languages have a {Language} object associated with them, which is fetched using
the {getByCode} function in [[Module:languages]] to convert a language code to a {Language} object. Depending on the
options supplied to this function, etymology-only languages may or may not be accepted, and family codes may be
accepted (returning a {Family} object as described in [[Module:families]]). There are also separate {getByCanonicalName}
functions in [[Module:languages]] and [[Module:etymology languages]] to convert a language's canonical name to a
{Language} object (depending on whether the canonical name refers to a full or etymology-only language).
===Textual representations===
Textual strings belonging to a given language come in several different ''text variants'':
# The ''input text'' is what the user supplies in wikitext, in the parameters to {{tl|m}}, {{tl|l}}, {{tl|ux}},
{{tl|t}}, {{tl|lang}} and the like.
# The ''corrected input text'' is the input text with some corrections and/or normalizations applied, such as
bad-character replacements for certain languages, like replacing `l` or `1` to [[palochka]] in some languages written
in Cyrillic. (FIXME: This currently goes under the name ''display text'' but that will be repurposed below. Also,
[[User:Surjection]] suggests renaming this to ''normalized input text'', but "normalized" is used in a different sense
in [[Module:usex]].)
# The ''display text'' is the text in the form as it will be displayed to the user. This is what appears in headwords,
in usexes, in displayed internal links, etc. This can include accent marks that are removed to form the stripped
display text (see below), as well as embedded bracketed links that are variously processed further. The display text
is generated from the corrected input text by applying language-specific transformations; for most languages, there
will be no such transformations. The general reason for having a difference between input and display text is to allow
for extra information in the input text that is not displayed to the user but is sent to the transliteration module.
Note that having different display and input text is only supported currently through special-casing but will be
generalized. Examples of transformations are: (1) Removing the {{cd|^}} that is used in certain East Asian (and
possibly other unicameral) languages to indicate capitalization of the transliteration (which is currently
special-cased); (2) for Korean, removing or otherwise processing hyphens (which is currently special-cased); (3) for
Arabic, removing a ''sukūn'' diacritic placed over a ''tāʔ marbūṭa'' (like this: ةْ) to indicate that the
''tāʔ marbūṭa'' is pronounced and transliterated as /t/ instead of being silent [NOTE, NOT IMPLEMENTED YET]; (4) for
Thai and Khmer, converting space-separated words to bracketed words and resolving respelling substitutions such as
`[กรีน/กฺรีน]`, which indicate how to transliterate given words [NOTE, NOT IMPLEMENTED YET except in language-specific
templates like {{tl|th-usex}}].
## The ''right-resolved display text'' is the result of removing brackets around one-part embedded links and resolving
two-part embedded links into their right-hand components (i.e. converting two-part links into the displayed form).
The process of right-resolution is what happens when you call {{cd|remove_links()}} in [[Module:links]] on some text.
When applied to the display text, it produces exactly what the user sees, without any link markup.
# The ''stripped display text'' is the result of applying diacritic-stripping to the display text.
## The ''left-resolved stripped display text'' [NEED BETTER NAME] is the result of applying left-resolution to the
stripped display text, i.e. similar to right-resolution but resolving two-part embedded links into their left-hand
components (i.e. the linked-to page). If the display text refers to a single page, the resulting of applying
diacritic stripping and left-resolution produces the ''logical pagename''.
# The ''physical pagename text'' is the result of converting the stripped display text into physical page links. If the
stripped display text contains embedded links, the left side of those links is converted into physical page links;
otherwise, the entire text is considered a pagename and converted in the same fashion. The conversion does three
things: (1) converts characters not allowed in pagenames into their "unsupported title" representation, e.g.
{{cd|Unsupported titles/`gt`}} in place of the logical name {{cd|>}}; (2) handles certain special-cased
unsupported-title logical pagenames, such as {{cd|Unsupported titles/Space}} in place of {{cd|[space]}} and
{{cd|Unsupported titles/Ancient Greek dish}} in place of a very long Greek name for a gourmet dish as found in
Aristophanes; (3) converts "mammoth" pagenames such as [[a]] into their appropriate split component, e.g.
[[a/languages A to L]].
# The ''source translit text'' is the text as supplied to the language-specific {{cd|transliterate()}} method. The form
of the source translit text may need to be language-specific, e.g Thai and Khmer will need the corrected input text,
whereas other languages may need to work off the display text. [FIXME: It's still unclear to me how embedded bracketed
links are handled in the existing code.] In general, embedded links need to be right-resolved (see above), but when
this happens is unclear to me [FIXME]. Some languages have a chop-up-and-paste-together scheme that sends parts of the
text through the transliterate mechanism, and for others (those listed with "cont" in {{cd|substitution}} in
[[Module:languages/data]]) they receive the full input text, but preprocessed in certain ways. (The wisdom of this is
still unclear to me.)
# The ''transliterated text'' (or ''transliteration'') is the result of transliterating the source translit text. Unlike
for all the other text variants except the transcribed text, it is always in the Latin script.
# The ''transcribed text'' (or ''transcription'') is the result of transcribing the source translit text, where
"transcription" here means a close approximation to the phonetic form of the language in languages (e.g. Akkadian,
Sumerian, Ancient Egyptian, maybe Tibetan) that have a wide difference between the written letters and spoken form.
Unlike for all the other text variants other than the transliterated text, it is always in the Latin script.
Currently, the transcribed text is always supplied manually be the user; there is no such thing as a
{{cd|transcribe()}} method on language objects.
# The ''sort key'' is the text used in sort keys for determining the placing of pages in categories they belong to. The
sort key is generated from the pagename or a specified ''sort base'' by lowercasing, doing language-specific
transformations and then uppercasing the result. If the sort base is supplied and is generated from input text, it
needs to be converted to display text, have embedded links removed through right-resolution and have
diacritic-stripping applied.
# There are other text variants that occur in usexes (specifically, there are normalized variants of several of the
above text variants), but we can skip them for now.
The following methods exist on {Language} objects to convert between different text variants:
# {correctInputText} (currently called {makeDisplayText}): This converts input text to corrected input text.
# {stripDiacritics}: This converts to stripped display text. [FIXME: This needs some rethinking. In particular,
{stripDiacritics} is sometimes called on input text, corrected input text or display text (in various paths inside of
[[Module:links]], and, in the case of input text, usually from other modules). We need to make sure we don't try to
convert input text to display text twice, but at the same time we need to support calling it directly on input text
since so many modules do this. This means we need to add a parameter indicating whether the passed-in text is input,
corrected input, or display text; if the former two, we call {correctInputText} ourselves.]
# {logicalToPhysical}: This converts logical pagenames to physical pagenames.
# {transliterate}: This appears to convert input text with embedded brackets removed into a transliteration.
[FIXME: This needs some rethinking. In particular, it calls {processDisplayText} on its input, which won't work
for Thai and Khmer, so we may need language-specific flags indicating whether to pass the input text directly to the
language transliterate method. In addition, I'm not sure how embedded links are handled in the existing translit code;
a lot of callers remove the links themselves before calling {transliterate()}, which I assume is wrong.]
# {makeSortKey}: This converts display text (?) to a sort key. [FIXME: Clarify this.]
]==]
local export = {}
local debug_track_module = "Module:debug/track"
local etymology_languages_data_module = "Module:etymology languages/data"
local families_module = "Module:families"
local headword_page_module = "Module:headword/page"
local json_module = "Module:JSON"
local language_like_module = "Module:language-like"
local languages_data_module = "Module:languages/data"
local languages_data_patterns_module = "Module:languages/data/patterns"
local links_data_module = "Module:links/data"
local load_module = "Module:load"
local scripts_module = "Module:scripts"
local scripts_data_module = "Module:scripts/data"
local string_encode_entities_module = "Module:string/encode entities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local wikimedia_languages_module = "Module:wikimedia languages"
local mw = mw
local string = string
local table = table
local char = string.char
local concat = table.concat
local find = string.find
local floor = math.floor
local get_by_code -- Defined below.
local get_data_module_name -- Defined below.
local get_extra_data_module_name -- Defined below.
local getmetatable = getmetatable
local gmatch = string.gmatch
local gsub = string.gsub
local insert = table.insert
local ipairs = ipairs
local is_known_language_tag = mw.language.isKnownLanguageTag
local make_object -- Defined below.
local match = string.match
local next = next
local pairs = pairs
local remove = table.remove
local require = require
local select = select
local setmetatable = setmetatable
local sub = string.sub
local type = type
local unstrip = mw.text.unstrip
-- Loaded as needed by findBestScript.
local Hans_chars
local Hant_chars
local function check_object(...)
check_object = require(utilities_module).check_object
return check_object(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function decode_uri(...)
decode_uri = require(string_utilities_module).decode_uri
return decode_uri(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function encode_entities(...)
encode_entities = require(string_encode_entities_module)
return encode_entities(...)
end
local function get_L2_sort_key(...)
get_L2_sort_key = require(headword_page_module).get_L2_sort_key
return get_L2_sort_key(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
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 get_family(...)
get_family = require(families_module).getByCode
return get_family(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function get_wikimedia_lang(...)
get_wikimedia_lang = require(wikimedia_languages_module).getByCode
return get_wikimedia_lang(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_family_object(...)
make_family_object = require(families_module).makeObject
return make_family_object(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function replacement_escape(...)
replacement_escape = require(string_replacement_escape_module)
return replacement_escape(...)
end
local function safe_require(...)
safe_require = require(load_module).safe_require
return safe_require(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
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 u(...)
u = require(string_utilities_module).char
return u(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function ulen(...)
ulen = require(string_utilities_module).len
return ulen(...)
end
local function ulower(...)
ulower = require(string_utilities_module).lower
return ulower(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
local function track(page)
debug_track("languages/" .. page)
return true
end
local function normalize_code(code)
return load_data(languages_data_module).aliases[code] or code
end
local function check_inputs(self, check, default, ...)
local n = select("#", ...)
if n == 0 then
return false
end
local ret = check(self, (...))
if ret ~= nil then
return ret
elseif n > 1 then
local inputs = {...}
for i = 2, n do
ret = check(self, inputs[i])
if ret ~= nil then
return ret
end
end
end
return default
end
local function make_link(self, target, display)
local prefix, main
if self:getFamilyCode() == "qfa-sub" then
prefix, main = display:match("^(the )(.*)")
if not prefix then
prefix, main = display:match("^(a )(.*)")
end
end
return (prefix or "") .. "[[" .. target .. "|" .. (main or display) .. "]]"
end
-- Convert risky characters to HTML entities, which minimizes interference once returned (e.g. for "sms:a", "<!-- -->" etc.).
local function escape_risky_characters(text)
-- Spacing characters in isolation generally need to be escaped in order to be properly processed by the MediaWiki software.
if umatch(text, "^%s*$") then
return encode_entities(text, text)
end
return encode_entities(text, "!#%&*+/:;<=>?@[\\]_{|}")
end
-- Temporarily convert various formatting characters to PUA to prevent them from being disrupted by the substitution process.
local function doTempSubstitutions(text, subbedChars, keepCarets, noTrim)
-- Clone so that we don't insert any extra patterns into the table in package.loaded. For some reason, using require seems to keep memory use down; probably because the table is always cloned.
local patterns = shallow_copy(require(languages_data_patterns_module))
if keepCarets then
insert(patterns, "((\\+)%^)")
insert(patterns, "((%^))")
end
-- Ensure any whitespace at the beginning and end is temp substituted, to prevent it from being accidentally trimmed. We only want to trim any final spaces added during the substitution process (e.g. by a module), which means we only do this during the first round of temp substitutions.
if not noTrim then
insert(patterns, "^([\128-\191\244]*(%s+))")
insert(patterns, "((%s+)[\128-\191\244]*)$")
end
-- Pre-substitution, of "[[" and "]]", which makes pattern matching more accurate.
text = gsub(text, "%f[%[]%[%[", "\1"):gsub("%f[%]]%]%]", "\2")
local i = #subbedChars
for _, pattern in ipairs(patterns) do
-- Patterns ending in \0 stand are for things like "[[" or "]]"), so the inserted PUA are treated as breaks between terms by modules that scrape info from pages.
local term_divider
pattern = gsub(pattern, "%z$", function(divider)
term_divider = divider == "\0"
return ""
end)
text = gsub(text, pattern, function(...)
local m = {...}
local m1New = m[1]
for k = 2, #m do
local n = i + k - 1
subbedChars[n] = m[k]
local byte2 = floor(n / 4096) % 64 + (term_divider and 128 or 136)
local byte3 = floor(n / 64) % 64 + 128
local byte4 = n % 64 + 128
m1New = gsub(m1New, pattern_escape(m[k]), "\244" .. char(byte2) .. char(byte3) .. char(byte4), 1)
end
i = i + #m - 1
return m1New
end)
end
text = gsub(text, "\1", "%[%["):gsub("\2", "%]%]")
return text, subbedChars
end
-- Reinsert any formatting that was temporarily substituted.
local function undoTempSubstitutions(text, subbedChars)
for i = 1, #subbedChars do
local byte2 = floor(i / 4096) % 64 + 128
local byte3 = floor(i / 64) % 64 + 128
local byte4 = i % 64 + 128
text = gsub(text, "\244[" .. char(byte2) .. char(byte2+8) .. "]" .. char(byte3) .. char(byte4),
replacement_escape(subbedChars[i]))
end
text = gsub(text, "\1", "%[%["):gsub("\2", "%]%]")
return text
end
-- Check if the raw text is an unsupported title, and if so return that. Otherwise, remove HTML entities. We do the pre-conversion to avoid loading the unsupported title list unnecessarily.
local function checkNoEntities(self, text)
local textNoEnc = decode_entities(text)
if textNoEnc ~= text and load_data(links_data_module).unsupported_titles[text] then
return text
else
return textNoEnc
end
end
-- If no script object is provided (or if it's invalid or None), get one.
local function checkScript(text, self, sc)
if not check_object("script", true, sc) or sc:getCode() == "None" then
return self:findBestScript(text)
end
return sc
end
local function normalize(text, sc)
text = sc:fixDiscouragedSequences(text)
return sc:toFixedNFD(text)
end
-- Subfunction of iterateSectionSubstitutions(). Process an individual chunk of text according to the specifications in
-- `substitution_data`. The input parameters are all as in the documentation of iterateSectionSubstitutions() except for
-- `recursed`, which is set to true if we called ourselves recursively to process a script-specific setting or
-- script-wide fallback. Returns two values: the processed text and the actual substitution data used to do the
-- substitutions (same as the `actual_substitution_data` return value to iterateSectionSubstitutions()).
local function doSubstitutions(self, text, sc, substitution_data, data_field, function_name, recursed)
-- BE CAREFUL in this function because the value at any level can be `false`, which causes no processing to be done
-- and blocks any further fallback processing.
local actual_substitution_data = substitution_data
-- If there are language-specific substitutes given in the data module, use those.
if type(substitution_data) == "table" then
-- If a script is specified, run this function with the script-specific data before continuing.
local sc_code = sc:getCode()
local has_substitution_data = false
if substitution_data[sc_code] ~= nil then
has_substitution_data = true
if substitution_data[sc_code] then
text, actual_substitution_data = doSubstitutions(self, text, sc, substitution_data[sc_code], data_field,
function_name, true)
end
-- Hant, Hans and Hani are usually treated the same, so add a special case to avoid having to specify each one
-- separately.
elseif sc_code:match("^Han") and substitution_data.Hani ~= nil then
has_substitution_data = true
if substitution_data.Hani then
text, actual_substitution_data = doSubstitutions(self, text, sc, substitution_data.Hani, data_field,
function_name, true)
end
-- Substitution data with key 1 in the outer table may be given as a fallback.
elseif substitution_data[1] ~= nil then
has_substitution_data = true
if substitution_data[1] then
text, actual_substitution_data = doSubstitutions(self, text, sc, substitution_data[1], data_field,
function_name, true)
end
end
-- Iterate over all strings in the "from" subtable, and gsub with the corresponding string in "to". We work with
-- the NFD decomposed forms, as this simplifies many substitutions.
if substitution_data.from then
has_substitution_data = true
for i, from in ipairs(substitution_data.from) do
-- Normalize each loop, to ensure multi-stage substitutions work correctly.
text = sc:toFixedNFD(text)
text = ugsub(text, sc:toFixedNFD(from), substitution_data.to[i] or "")
end
end
if substitution_data.remove_diacritics then
has_substitution_data = true
text = sc:toFixedNFD(text)
-- Convert exceptions to PUA.
local remove_exceptions, substitutes = substitution_data.remove_exceptions
if remove_exceptions then
substitutes = {}
local i = 0
for _, exception in ipairs(remove_exceptions) do
exception = sc:toFixedNFD(exception)
text = ugsub(text, exception, function(m)
i = i + 1
local subst = u(0x80000 + i)
substitutes[subst] = m
return subst
end)
end
end
-- Strip diacritics.
text = ugsub(text, "[" .. substitution_data.remove_diacritics .. "]", "")
-- Convert exceptions back.
if remove_exceptions then
text = text:gsub("\242[\128-\191]*", substitutes)
end
end
if not has_substitution_data and sc._data[data_field] then
-- If language-specific sort key (etc.) is nil, fall back to script-wide sort key (etc.).
text, actual_substitution_data = doSubstitutions(self, text, sc, sc._data[data_field], data_field,
function_name, true)
end
elseif type(substitution_data) == "string" then
-- If there is a dedicated function module, use that.
local module = safe_require("Module:" .. substitution_data)
if module then
-- TODO: translit functions should take objects, not codes.
-- TODO: translit functions should be called with form NFD.
if function_name == "tr" then
if not module[function_name] then
error(("Internal error: Module [[%s]] has no function named 'tr'"):format(substitution_data))
end
text = module[function_name](text, self._code, sc:getCode())
elseif function_name == "stripDiacritics" then
-- FIXME, get rid of this arm after renaming makeEntryName -> stripDiacritics.
if module[function_name] then
text = module[function_name](sc:toFixedNFD(text), self, sc)
elseif module.makeEntryName then
text = module.makeEntryName(sc:toFixedNFD(text), self, sc)
else
error(("Internal error: Module [[%s]] has no function named 'stripDiacritics' or 'makeEntryName'"
):format(substitution_data))
end
else
if not module[function_name] then
error(("Internal error: Module [[%s]] has no function named '%s'"):format(
substitution_data, function_name))
end
text = module[function_name](sc:toFixedNFD(text), self, sc)
end
else
error("Substitution data '" .. substitution_data .. "' does not match an existing module.")
end
elseif substitution_data == nil and sc._data[data_field] then
-- If language-specific sort key (etc.) is nil, fall back to script-wide sort key (etc.).
text, actual_substitution_data = doSubstitutions(self, text, sc, sc._data[data_field], data_field,
function_name, true)
end
-- Don't normalize to NFC if this is the inner loop or if a module returned nil.
if recursed or not text then
return text, actual_substitution_data
end
-- Fix any discouraged sequences created during the substitution process, and normalize into the final form.
return sc:toFixedNFC(sc:fixDiscouragedSequences(text)), actual_substitution_data
end
-- Split the text into sections, based on the presence of temporarily substituted formatting characters, then iterate
-- over each section to apply substitutions (e.g. transliteration or diacritic stripping). This avoids putting PUA
-- characters through language-specific modules, which may be unequipped for them. This function is passed the following
-- values:
-- * `self` (the Language object);
-- * `text` (the text to process);
-- * `sc` (the script of the text, which must be specified; callers should call checkScript() as needed to autodetect the
-- script of the text if not given explicitly by the user);
-- * `subbedChars` (an array of the same length as the text, indicating which characters have been substituted and by
-- what, or {nil} if no substitutions are to happen);
-- * `keepCarets` (DOCUMENT ME);
-- * `substitution_data` (the data indicating which substitutions to apply, taken directly from `data_field` in the
-- language's data structure in a submodule of [[Module:languages/data]]);
-- * `data_field` (the data field from which `substitution_data` was fetched, such as "sort_key" or "strip_diacritics");
-- * `function_name` (the name of the function to call to do the substitution, in case `substitution_data` specifies a
-- module to do the substitution);
-- * `notrim` (don't trim whitespace at the edges of `text`; set when computing the sort key, because whitespace at the
-- beginning of a sort key is significant and causes the resulting page to be sorted at the beginning of the category
-- it's in).
-- Returns three values:
-- (1) the processed text;
-- (2) the value of `subbedChars` that was passed in, possibly modified with additional character substitutions; will be
-- {nil} if {nil} was passed in;
-- (3) the actual substitution data that was used to apply substitutions to `text`; this may be different from the value
-- of `substitution_data` passed in if that value recursively specified script-specific substitutions or if no
-- substitution data could be found in the language-specific data (e.g. {nil} was passed in or a structure was passed
-- in that had no setting for the script given in `sc`), but a script-wide fallback value was set; currently it is
-- only used by makeSortKey().
local function iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, substitution_data, data_field,
function_name, notrim)
local sections
-- See [[Module:languages/data]].
if not find(text, "\244") or load_data(languages_data_module).substitution[self._code] == "cont" then
sections = {text}
else
sections = split(text, "\244[\128-\143][\128-\191]*", true)
end
local actual_substitution_data
for _, section in ipairs(sections) do
-- Don't bother processing empty strings or whitespace (which may also not be handled well by dedicated
-- modules).
if gsub(section, "%s+", "") ~= "" then
local sub, this_actual_substitution_data = doSubstitutions(self, section, sc, substitution_data, data_field,
function_name)
actual_substitution_data = this_actual_substitution_data
-- Second round of temporary substitutions, in case any formatting was added by the main substitution
-- process. However, don't do this if the section contains formatting already (as it would have had to have
-- been escaped to reach this stage, and therefore should be given as raw text).
if sub and subbedChars then
local noSub
for _, pattern in ipairs(require(languages_data_patterns_module)) do
if match(section, pattern .. "%z?") then
noSub = true
end
end
if not noSub then
sub, subbedChars = doTempSubstitutions(sub, subbedChars, keepCarets, true)
end
end
if not sub then
text = sub
break
end
text = sub and gsub(text, pattern_escape(section), replacement_escape(sub), 1) or text
end
end
if not notrim then
-- Trim, unless there are only spacing characters, while ignoring any final formatting characters.
-- Do not trim sort keys because spaces at the beginning are significant.
text = text and text:gsub("^([\128-\191\244]*)%s+(%S)", "%1%2"):gsub("(%S)%s+([\128-\191\244]*)$", "%1%2") or
nil
end
return text, subbedChars, actual_substitution_data
end
-- Process carets (and any escapes). Default to simple removal, if no pattern/replacement is given.
local function processCarets(text, pattern, repl)
local rep
repeat
text, rep = gsub(text, "\\\\(\\*^)", "\3%1")
until rep == 0
return (text:gsub("\\^", "\4")
:gsub(pattern or "%^", repl or "")
:gsub("\3", "\\")
:gsub("\4", "^"))
end
-- Remove carets if they are used to capitalize parts of transliterations (unless they have been escaped).
local function removeCarets(text, sc)
if not sc:hasCapitalization() and sc:isTransliterated() and text:find("^", 1, true) then
return processCarets(text)
else
return text
end
end
local Language = {}
--[==[Returns the language code of the language. Example: {{code|lua|"fr"}} for French.]==]
function Language:getCode()
return self._code
end
--[==[Returns the canonical name of the language. This is the name used to represent that language on Wiktionary, and is guaranteed to be unique to that language alone. Example: {{code|lua|"French"}} for French.]==]
function Language: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 language. The display form of a language, family or script is the form it takes when
appearing as the <code><var>source</var></code> in categories such as <code>English terms derived from
<var>source</var></code> or <code>English given names from <var>source</var></code>, and is also the displayed text
in {makeCategoryLink()} links. For full and etymology-only languages, this is the same as the canonical name, but
for families, it reads <code>"<var>name</var> languages"</code> (e.g. {"Indo-Iranian languages"}), and for scripts,
it reads <code>"<var>name</var> script"</code> (e.g. {"Arabic script"}).
]==]
function Language:getDisplayForm()
local form = self._displayForm
if form == nil then
form = self:getCanonicalName()
-- Add article and " substrate" to substrates that lack them.
if self:getFamilyCode() == "qfa-sub" then
if not (sub(form, 1, 4) == "the " or sub(form, 1, 2) == "a ") then
form = "a " .. form
end
if not match(form, " [Ss]ubstrate") then
form = form .. " substrate"
end
end
self._displayForm = form
end
return form
end
--[==[Returns the value which should be used in the HTML lang= attribute for tagged text in the language.]==]
function Language:getHTMLAttribute(sc, region)
local code = self._code
if not find(code, "-", 1, true) then
return code .. "-" .. sc:getCode() .. (region and "-" .. region or "")
end
local parent = self:getParent()
region = region or match(code, "%f[%u][%u-]+%f[%U]")
if parent then
return parent:getHTMLAttribute(sc, region)
end
-- TODO: ISO family codes can also be used.
return "mis-" .. sc:getCode() .. (region and "-" .. region or "")
end
--[==[Returns a table of the aliases that the language is known by, excluding the canonical name. Aliases are synonyms for the language in question. The names are not guaranteed to be unique, in that sometimes more than one language is known by the same name. Example: {{code|lua|{"High German", "New High German", "Deutsch"} }} for [[:Category:German language|German]].]==]
function Language:getAliases()
self:loadInExtraData()
return require(language_like_module).getAliases(self)
end
--[==[
Return a table of the known subvarieties of a given language, excluding subvarieties that have been given
explicit etymology-only language codes. The names are not guaranteed to be unique, in that sometimes a given name
refers to a subvariety of more than one language. Example: {{code|lua|{"Southern Aymara", "Central Aymara"} }} for
[[:Category:Aymara language|Aymara]]. Note that the returned value can have nested tables in it, when a subvariety
goes by more than one name. Example: {{code|lua|{"North Azerbaijani", "South Azerbaijani", {"Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar"}, {"Qashqa'i", "Qashqai", "Kashkay"}, "Sonqor"} }} for
[[:Category:Azerbaijani language|Azerbaijani]]. Here, for example, Afshar, Afshari, Afshar Azerbaijani and Afchar
all refer to the same subvariety, whose preferred name is Afshar (the one listed first). To avoid a return value
with nested tables in it, specify a non-{{code|lua|nil}} value for the <code>flatten</code> parameter; in that case,
the return value would be {{code|lua|{"North Azerbaijani", "South Azerbaijani", "Afshar", "Afshari",
"Afshar Azerbaijani", "Afchar", "Qashqa'i", "Qashqai", "Kashkay", "Sonqor"} }}.
]==]
function Language:getVarieties(flatten)
self:loadInExtraData()
return require(language_like_module).getVarieties(self, flatten)
end
--[==[Returns a table of the "other names" that the language is known by, which are listed in the <code>otherNames</code> field. It should be noted that the <code>otherNames</code> field itself is deprecated, and entries listed there should eventually be moved to either <code>aliases</code> or <code>varieties</code>.]==]
function Language:getOtherNames() -- To be eventually removed, once there are no more uses of the `otherNames` field.
self:loadInExtraData()
return require(language_like_module).getOtherNames(self)
end
--[==[
Return a combined table of the canonical name, aliases, varieties and other names of a given language.]==]
function Language:getAllNames()
self:loadInExtraData()
return require(language_like_module).getAllNames(self)
end
--[==[Returns a table of types as a lookup table (with the types as keys).
The possible types are
* {language}: This is a language, either full or etymology-only.
* {full}: This is a "full" (not etymology-only) language, i.e. the union of {regular}, {reconstructed} and
{appendix-constructed}. Note that the types {full} and {etymology-only} also exist for families, so if you
want to check specifically for a full language and you have an object that might be a family, you should
use {{lua|hasType("language", "full")}} and not simply {{lua|hasType("full")}}.
* {etymology-only}: This is an etymology-only (not full) language, whose parent is another etymology-only
language or a full language. Note that the types {full} and {etymology-only} also exist for
families, so if you want to check specifically for an etymology-only language and you have an
object that might be a family, you should use {{lua|hasType("language", "etymology-only")}}
and not simply {{lua|hasType("etymology-only")}}.
* {regular}: This indicates a full language that is attested according to [[WT:CFI]] and therefore permitted
in the main namespace. There may also be reconstructed terms for the language, which are placed in
the {Reconstruction} namespace and must be prefixed with * to indicate a reconstruction. Most full
languages are natural (not constructed) languages, but a few constructed languages (e.g. Esperanto
and Volapük, among others) are also allowed in the mainspace and considered regular languages.
* {reconstructed}: This language is not attested according to [[WT:CFI]], and therefore is allowed only in the
{Reconstruction} namespace. All terms in this language are reconstructed, and must be prefixed
with *. Languages such as Proto-Indo-European and Proto-Germanic are in this category.
* {appendix-constructed}: This language is attested but does not meet the additional requirements set out for
constructed languages ([[WT:CFI#Constructed languages]]). Its entries must therefore
be in the Appendix namespace, but they are not reconstructed and therefore should
not have * prefixed in links.
]==]
function Language:getTypes()
local types = self._types
if types == nil then
types = {language = true}
if self:getFullCode() == self._code then
types.full = true
else
types["etymology-only"] = true
end
for t in gmatch(self._data.type, "[^,]+") do
types[t] = true
end
self._types = types
end
return types
end
--[==[Given a list of types as strings, returns true if the language has all of them.]==]
function Language:hasType(...)
Language.hasType = require(language_like_module).hasType
return self:hasType(...)
end
--[==[Returns a table containing <code>WikimediaLanguage</code> objects (see [[Module:wikimedia languages]]), which represent languages and their codes as they are used in Wikimedia projects for interwiki linking and such. More than one object may be returned, as a single Wiktionary language may correspond to multiple Wikimedia languages. For example, Wiktionary's single code <code>sh</code> (Serbo-Croatian) maps to four Wikimedia codes: <code>sh</code> (Serbo-Croatian), <code>bs</code> (Bosnian), <code>hr</code> (Croatian) and <code>sr</code> (Serbian).
The code for the Wikimedia language is retrieved from the <code>wikimedia_codes</code> property in the data modules. If that property is not present, the code of the current language is used. If none of the available codes is actually a valid Wikimedia code, an empty table is returned.]==]
function Language:getWikimediaLanguages()
local wm_langs = self._wikimediaLanguageObjects
if wm_langs == nil then
local codes = self:getWikimediaLanguageCodes()
wm_langs = {}
for i = 1, #codes do
wm_langs[i] = get_wikimedia_lang(codes[i])
end
self._wikimediaLanguageObjects = wm_langs
end
return wm_langs
end
function Language:getWikimediaLanguageCodes()
local wm_langs = self._wikimediaLanguageCodes
if wm_langs == nil then
wm_langs = self._data.wikimedia_codes
if wm_langs then
wm_langs = split(wm_langs, ",", true, true)
else
local code = self._code
if is_known_language_tag(code) then
wm_langs = {code}
else
-- Inherit, but only if no codes are specified in the data *and*
-- the language code isn't a valid Wikimedia language code.
local parent = self:getParent()
wm_langs = parent and parent:getWikimediaLanguageCodes() or {}
end
end
self._wikimediaLanguageCodes = wm_langs
end
return wm_langs
end
--[==[
Returns the name of the Wikipedia article for the language. `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 language's category, but this won't normally happen for any other project.
]==]
function Language:getWikipediaArticle(noCategoryFallback, project)
Language.getWikipediaArticle = require(language_like_module).getWikipediaArticle
return self:getWikipediaArticle(noCategoryFallback, project)
end
function Language:makeWikipediaLink()
return make_link(self, "w:" .. self:getWikipediaArticle(), self:getCanonicalName())
end
--[==[Returns the name of the Wikimedia Commons category page for the language.]==]
function Language:getCommonsCategory()
Language.getCommonsCategory = require(language_like_module).getCommonsCategory
return self:getCommonsCategory()
end
--[==[Returns the Wikidata item id for the language or <code>nil</code>. This corresponds to the the second field in the data modules.]==]
function Language:getWikidataItem()
Language.getWikidataItem = require(language_like_module).getWikidataItem
return self:getWikidataItem()
end
--[==[Returns a table of <code>Script</code> objects for all scripts that the language is written in. See [[Module:scripts]].]==]
function Language:getScripts()
local scripts = self._scriptObjects
if scripts == nil then
local codes = self:getScriptCodes()
if codes[1] == "All" then
scripts = load_data(scripts_data_module)
else
scripts = {}
for i = 1, #codes do
scripts[i] = get_script(codes[i])
end
end
self._scriptObjects = scripts
end
return scripts
end
--[==[Returns the table of script codes in the language's data file.]==]
function Language:getScriptCodes()
local scripts = self._scriptCodes
if scripts == nil then
scripts = self._data[4]
if scripts then
local codes, n = {}, 0
for code in gmatch(scripts, "[^,]+") do
n = n + 1
-- Special handling of "Hants", which represents "Hani", "Hant" and "Hans" collectively.
if code == "Hants" then
codes[n] = "Hani"
codes[n + 1] = "Hant"
codes[n + 2] = "Hans"
n = n + 2
else
codes[n] = code
end
end
scripts = codes
else
scripts = {"None"}
end
self._scriptCodes = scripts
end
return scripts
end
--[==[Given some text, this function iterates through the scripts of a given language and tries to find the script that best matches the text. It returns a {{code|lua|Script}} object representing the script. If no match is found at all, it returns the {{code|lua|None}} script object.]==]
function Language:findBestScript(text, forceDetect)
if not text or text == "" or text == "-" then
return get_script("None")
end
-- Differs from table returned by getScriptCodes, as Hants is not normalized into its constituents.
local codes = self._bestScriptCodes
if codes == nil then
codes = self._data[4]
codes = codes and split(codes, ",", true, true) or {"None"}
self._bestScriptCodes = codes
end
local first_sc = codes[1]
if first_sc == "All" then
return find_best_script_without_lang(text)
end
local codes_len = #codes
if not (forceDetect or first_sc == "Hants" or codes_len > 1) then
first_sc = get_script(first_sc)
local charset = first_sc.characters
return charset and umatch(text, "[" .. charset .. "]") and first_sc or get_script("None")
end
-- Remove all formatting characters.
text = get_plaintext(text)
-- Remove all spaces and any ASCII punctuation. Some non-ASCII punctuation is script-specific, so can't be removed.
text = ugsub(text, "[%s!\"#%%&'()*,%-./:;?@[\\%]_{}]+", "")
if #text == 0 then
return get_script("None")
end
-- Try to match every script against the text,
-- and return the one with the most matching characters.
local bestcount, bestscript, length = 0
for i = 1, codes_len do
local sc = codes[i]
-- Special case for "Hants", which is a special code that represents whichever of "Hant" or "Hans" best matches, or "Hani" if they match equally. This avoids having to list all three. In addition, "Hants" will be treated as the best match if there is at least one matching character, under the assumption that a Han script is desirable in terms that contain a mix of Han and other scripts (not counting those which use Jpan or Kore).
if sc == "Hants" then
local Hani = get_script("Hani")
if not Hant_chars then
Hant_chars = load_data("Module:zh/data/ts")
Hans_chars = load_data("Module:zh/data/st")
end
local t, s, found = 0, 0
-- This is faster than using mw.ustring.gmatch directly.
for ch in gmatch((ugsub(text, "[" .. Hani.characters .. "]", "\255%0")), "\255(.[\128-\191]*)") do
found = true
if Hant_chars[ch] then
t = t + 1
if Hans_chars[ch] then
s = s + 1
end
elseif Hans_chars[ch] then
s = s + 1
else
t, s = t + 1, s + 1
end
end
if found then
if t == s then
return Hani
end
return get_script(t > s and "Hant" or "Hans")
end
else
sc = get_script(sc)
if not length then
length = ulen(text)
end
-- Count characters by removing everything in the script's charset and comparing to the original length.
local charset = sc.characters
local count = charset and length - ulen((ugsub(text, "[" .. charset .. "]+", ""))) or 0
if count >= length then
return sc
elseif count > bestcount then
bestcount = count
bestscript = sc
end
end
end
-- Return best matching script, or otherwise None.
return bestscript or get_script("None")
end
--[==[Returns a <code>Family</code> object for the language family that the language belongs to. See [[Module:families]].]==]
function Language:getFamily()
local family = self._familyObject
if family == nil then
family = self:getFamilyCode()
-- If the value is nil, it's cached as false.
family = family and get_family(family) or false
self._familyObject = family
end
return family or nil
end
--[==[Returns the family code in the language's data file.]==]
function Language:getFamilyCode()
local family = self._familyCode
if family == nil then
-- If the value is nil, it's cached as false.
family = self._data[3] or false
self._familyCode = family
end
return family or nil
end
function Language:getFamilyName()
local family = self._familyName
if family == nil then
family = self:getFamily()
-- If the value is nil, it's cached as false.
family = family and family:getCanonicalName() or false
self._familyName = family
end
return family or nil
end
do
local function check_family(self, family)
if type(family) == "table" then
family = family:getCode()
end
if self:getFamilyCode() == family then
return true
end
local self_family = self:getFamily()
if self_family:inFamily(family) then
return true
-- If the family isn't a real family (e.g. creoles) check any ancestors.
elseif self_family:inFamily("qfa-not") then
local ancestors = self:getAncestors()
for _, ancestor in ipairs(ancestors) do
if ancestor:inFamily(family) then
return true
end
end
end
end
--[==[Check whether the language belongs to `family` (which can be a family code or object). A list of objects can be given in place of `family`; in that case, return true if the language belongs to any of the specified families. Note that some languages (in particular, certain creoles) can have multiple immediate ancestors potentially belonging to different families; in that case, return true if the language belongs to any of the specified families.]==]
function Language:inFamily(...)
if self:getFamilyCode() == nil then
return false
end
return check_inputs(self, check_family, false, ...)
end
end
function Language: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, nil, true, true) or false
self._parentObject = parent
end
return parent or nil
end
function Language: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 Language:getParentName()
local parent = self._parentName
if parent == nil then
parent = self:getParent()
-- If the value is nil, it's cached as false.
parent = parent and parent:getCanonicalName() or false
self._parentName = parent
end
return parent or nil
end
function Language:getParentChain()
local chain = self._parentChain
if chain == nil then
chain = {}
local parent, n = self:getParent(), 0
while parent do
n = n + 1
chain[n] = parent
parent = parent:getParent()
end
self._parentChain = chain
end
return chain
end
do
local function check_lang(self, lang)
for _, parent in ipairs(self:getParentChain()) do
if (type(lang) == "string" and lang or lang:getCode()) == parent:getCode() then
return true
end
end
end
function Language:hasParent(...)
return check_inputs(self, check_lang, false, ...)
end
end
--[==[
If the language is etymology-only, this iterates through parents until a full language or family is found, and the
corresponding object is returned. If the language is a full language, then it simply returns itself.
]==]
function Language:getFull()
local full = self._fullObject
if full == nil then
full = self:getFullCode()
full = full == self._code and self or get_by_code(full)
self._fullObject = full
end
return full
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding code is returned. If the language is a full language, then it simply returns the
language code.
]==]
function Language:getFullCode()
return self._fullCode or self._code
end
--[==[
If the language is an etymology-only language, this iterates through parents until a full language or family is
found, and the corresponding canonical name is returned. If the language is a full language, then it simply returns
the canonical name of the language.
]==]
function Language:getFullName()
local full = self._fullName
if full == nil then
full = self:getFull():getCanonicalName()
self._fullName = full
end
return full
end
--[==[Returns a table of <code class="nf">Language</code> objects for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestors()
local ancestors = self._ancestorObjects
if ancestors == nil then
ancestors = {}
local ancestor_codes = self:getAncestorCodes()
if #ancestor_codes > 0 then
for _, ancestor in ipairs(ancestor_codes) do
insert(ancestors, get_by_code(ancestor, nil, true))
end
else
local fam = self:getFamily()
local protoLang = fam and fam:getProtoLanguage() or nil
-- For the cases where the current language is the proto-language
-- of its family, or an etymology-only language that is ancestral to that
-- proto-language, we need to step up a level higher right from the
-- start.
if protoLang and (
protoLang:getCode() == self._code or
(self:hasType("etymology-only") and protoLang:hasAncestor(self))
) then
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
while not protoLang and not (not fam or fam:getCode() == "qfa-not") do
fam = fam:getFamily()
protoLang = fam and fam:getProtoLanguage() or nil
end
insert(ancestors, protoLang)
end
self._ancestorObjects = ancestors
end
return ancestors
end
do
-- Avoid a language being its own ancestor via class inheritance. We only need to check for this if the language has inherited an ancestor table from its parent, because we never want to drop ancestors that have been explicitly set in the data.
-- Recursively iterate over ancestors until we either find self or run out. If self is found, return true.
local function check_ancestor(self, lang)
local codes = lang:getAncestorCodes()
if not codes then
return nil
end
for i = 1, #codes do
local code = codes[i]
if code == self._code then
return true
end
local anc = get_by_code(code, nil, true)
if check_ancestor(self, anc) then
return true
end
end
end
--[==[Returns a table of <code class="nf">Language</code> codes for all languages that this language is directly descended from. Generally this is only a single language, but creoles, pidgins and mixed languages can have multiple ancestors.]==]
function Language:getAncestorCodes()
if self._ancestorCodes then
return self._ancestorCodes
end
local data = self._data
local codes = data.ancestors
if codes == nil then
codes = {}
self._ancestorCodes = codes
return codes
end
codes = split(codes, ",", true, true)
self._ancestorCodes = codes
-- If there are no codes or the ancestors weren't inherited data, there's nothing left to check.
if #codes == 0 or self:getData(false, "raw").ancestors ~= nil then
return codes
end
local i, code = 1
while i <= #codes do
code = codes[i]
if check_ancestor(self, self) then
remove(codes, i)
else
i = i + 1
end
end
return codes
end
end
--[==[Given a list of language objects or codes, returns true if at least one of them is an ancestor. This includes any etymology-only children of that ancestor. If the language's ancestor(s) are etymology-only languages, it will also return true for those language parent(s) (e.g. if Vulgar Latin is the ancestor, it will also return true for its parent, Latin). However, a parent is excluded from this if the ancestor is also ancestral to that parent (e.g. if Classical Persian is the ancestor, Persian would return false, because Classical Persian is also ancestral to Persian).]==]
function Language:hasAncestor(...)
local function iterateOverAncestorTree(node, func, parent_check)
local ancestors = node:getAncestors()
local ancestorsParents = {}
for _, ancestor in ipairs(ancestors) do
-- When checking the parents of the other language, and the ancestor is also a parent, skip to the next ancestor, so that we exclude any etymology-only children of that parent that are not directly related (see below).
local ret = (parent_check or not node:hasParent(ancestor)) and
func(ancestor) or iterateOverAncestorTree(ancestor, func, parent_check)
if ret then
return ret
end
end
-- Check the parents of any ancestors. We don't do this if checking the parents of the other language, so that we exclude any etymology-only children of those parents that are not directly related (e.g. if the ancestor is Vulgar Latin and we are checking New Latin, we want it to return false because they are on different ancestral branches. As such, if we're already checking the parent of New Latin (Latin) we don't want to compare it to the parent of the ancestor (Latin), as this would be a false positive; it should be one or the other).
if not parent_check then
return nil
end
for _, ancestor in ipairs(ancestors) do
local ancestorParents = ancestor:getParentChain()
for _, ancestorParent in ipairs(ancestorParents) do
if ancestorParent:getCode() == self._code or ancestorParent:hasAncestor(ancestor) then
break
else
insert(ancestorsParents, ancestorParent)
end
end
end
for _, ancestorParent in ipairs(ancestorsParents) do
local ret = func(ancestorParent)
if ret then
return ret
end
end
end
local function do_iteration(otherlang, parent_check)
-- otherlang can't be self
if (type(otherlang) == "string" and otherlang or otherlang:getCode()) == self._code then
return false
end
repeat
if iterateOverAncestorTree(
self,
function(ancestor)
return ancestor:getCode() == (type(otherlang) == "string" and otherlang or otherlang:getCode())
end,
parent_check
) then
return true
elseif type(otherlang) == "string" then
otherlang = get_by_code(otherlang, nil, true)
end
otherlang = otherlang:getParent()
parent_check = false
until not otherlang
end
local parent_check = true
for _, otherlang in ipairs{...} do
local ret = do_iteration(otherlang, parent_check)
if ret then
return true
end
end
return false
end
do
local function construct_node(lang, memo)
local branch, ancestors = {lang = lang:getCode()}
memo[lang:getCode()] = branch
for _, ancestor in ipairs(lang:getAncestors()) do
if ancestors == nil then
ancestors = {}
end
insert(ancestors, memo[ancestor:getCode()] or construct_node(ancestor, memo))
end
branch.ancestors = ancestors
return branch
end
function Language:getAncestorChain()
local chain = self._ancestorChain
if chain == nil then
chain = construct_node(self, {})
self._ancestorChain = chain
end
return chain
end
end
function Language:getAncestorChainOld()
local chain = self._ancestorChain
if chain == nil then
chain = {}
local step = self
while true do
local ancestors = step:getAncestors()
step = #ancestors == 1 and ancestors[1] or nil
if not step then
break
end
insert(chain, step)
end
self._ancestorChain = chain
end
return chain
end
local function fetch_descendants(self, fmt)
local descendants, family = {}, self:getFamily()
-- Iterate over all three datasets.
for _, data in ipairs{
require("Module:languages/code to canonical name"),
require("Module:etymology languages/code to canonical name"),
require("Module:families/code to canonical name"),
} do
for code in pairs(data) do
local lang = get_by_code(code, nil, true, true)
-- Test for a descendant. Earlier tests weed out most candidates, while the more intensive tests are only used sparingly.
if (
code ~= self._code and -- Not self.
lang:inFamily(family) and -- In the same family.
(
family:getProtoLanguageCode() == self._code or -- Self is the protolanguage.
self:hasDescendant(lang) or -- Full hasDescendant check.
(lang:getFullCode() == self._code and not self:hasAncestor(lang)) -- Etymology-only child which isn't an ancestor.
)
) then
if fmt == "object" then
insert(descendants, lang)
elseif fmt == "code" then
insert(descendants, code)
elseif fmt == "name" then
insert(descendants, lang:getCanonicalName())
end
end
end
end
return descendants
end
function Language:getDescendants()
local descendants = self._descendantObjects
if descendants == nil then
descendants = fetch_descendants(self, "object")
self._descendantObjects = descendants
end
return descendants
end
function Language:getDescendantCodes()
local descendants = self._descendantCodes
if descendants == nil then
descendants = fetch_descendants(self, "code")
self._descendantCodes = descendants
end
return descendants
end
function Language:getDescendantNames()
local descendants = self._descendantNames
if descendants == nil then
descendants = fetch_descendants(self, "name")
self._descendantNames = descendants
end
return descendants
end
do
local function check_lang(self, lang)
if type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasAncestor(self) then
return true
end
end
function Language:hasDescendant(...)
return check_inputs(self, check_lang, false, ...)
end
end
local function fetch_children(self, fmt)
local m_etym_data = require(etymology_languages_data_module)
local self_code, children = self._code, {}
for code, lang in pairs(m_etym_data) do
local _lang = lang
repeat
local parent = _lang.parent
if parent == self_code then
if fmt == "object" then
insert(children, get_by_code(code, nil, true))
elseif fmt == "code" then
insert(children, code)
elseif fmt == "name" then
insert(children, lang[1])
end
break
end
_lang = m_etym_data[parent]
until not _lang
end
return children
end
function Language:getChildren()
local children = self._childObjects
if children == nil then
children = fetch_children(self, "object")
self._childObjects = children
end
return children
end
function Language:getChildrenCodes()
local children = self._childCodes
if children == nil then
children = fetch_children(self, "code")
self._childCodes = children
end
return children
end
function Language:getChildrenNames()
local children = self._childNames
if children == nil then
children = fetch_children(self, "name")
self._childNames = children
end
return children
end
function Language:hasChild(...)
local lang = ...
if not lang then
return false
elseif type(lang) == "string" then
lang = get_by_code(lang, nil, true)
end
if lang:hasParent(self) then
return true
end
return self:hasChild(select(2, ...))
end
--[==[Returns the name of the main category of that language. Example: {{code|lua|"French language"}} for French, whose category is at [[:Category:French language]]. Unless optional argument <code>nocap</code> is given, the language name at the beginning of the returned value will be capitalized. This capitalization is correct for category names, but not if the language name is lowercase and the returned value of this function is used in the middle of a sentence.]==]
function Language:getCategoryName(nocap)
local name = self._categoryName
if name == nil then
name = self:getCanonicalName()
-- If a substrate, omit any leading article.
if self:getFamilyCode() == "qfa-sub" then
name = name:gsub("^the ", ""):gsub("^a ", "")
end
-- Only add " language" if a full language.
if self:hasType("full") then
-- Unless the canonical name already ends with "language", "lect" or their derivatives, add " language".
if not (match(name, "^ভাষা") or match(name, "[Ll]ect$")) then
name = name .. " ভাষা"
end
end
self._categoryName = name
end
if nocap then
return name
end
return mw.getContentLanguage():ucfirst(name)
end
--[==[Creates a link to the category; the link text is the canonical name.]==]
function Language:makeCategoryLink()
return make_link(self, ":Category:" .. self:getCategoryName(), self:getDisplayForm())
end
function Language:getStandardCharacters(sc)
local standard_chars = self._data.standard_chars
if type(standard_chars) ~= "table" then
return standard_chars
elseif sc and type(sc) ~= "string" then
check_object("script", nil, sc)
sc = sc:getCode()
end
if (not sc) or sc == "None" then
local scripts = {}
for _, script in pairs(standard_chars) do
insert(scripts, script)
end
return concat(scripts)
end
if standard_chars[sc] then
return standard_chars[sc] .. (standard_chars[1] or "")
end
end
--[==[
Strip diacritics from display text `text` (in a language-specific fashion), which is in the script `sc`. If `sc` is
omitted or {nil}, the script is autodetected. This also strips certain punctuation characters from the end and (in the
case of Spanish upside-down question mark and exclamation points) from the beginning; strips any whitespace at the
end of the text or between the text and final stripped punctuation characters; and applies some language-specific
Unicode normalizations to replace discouraged characters with their prescribed alternatives. Return the stripped text.
]==]
function Language:stripDiacritics(text, sc)
if (not text) or text == "" then
return text
end
sc = checkScript(text, self, sc)
text = normalize(text, sc)
-- FIXME, rename makeEntryName to stripDiacritics and get rid of second and third return values
-- everywhere
text, _, _ = iterateSectionSubstitutions(self, text, sc, nil, nil,
self._data.strip_diacritics or self._data.entry_name, "strip_diacritics", "stripDiacritics")
text = umatch(text, "^[¿¡]?(.-[^%s%p].-)%s*[؟?!;՛՜ ՞ ՟?!︖︕।॥။၊་།]?$") or text
return text
end
--[==[
Convert a ''logical'' pagename (the pagename as it appears to the user, after diacritics and punctuation have been
stripped) to a ''physical'' pagename (the pagename as it appears in the MediaWiki database). Reasons for a difference
between the two are (a) unsupported titles such as `[ ]` (with square brackets in them), `#` (pound/hash sign) and
`¯\_(ツ)_/¯` (with underscores), as well as overly long titles of various sorts; (b) "mammoth" pages that are split into
parts (e.g. `a`, which is split into physical pagenames `a/languages A to L` and `a/languages M to Z`). For almost all
purposes, you should work with logical and not physical pagenames. But there are certain use cases that require physical
pagenames, such as checking the existence of a page or retrieving a page's contents.
`pagename` is the logical pagename to be converted. `is_reconstructed_or_appendix` indicates whether the page is in the
`Reconstruction` or `Appendix` namespaces. If it is omitted or has the value {nil}, the pagename is checked for an
initial asterisk, and if found, the page is assumed to be a `Reconstruction` page. Setting a value of `false` or `true`
to `is_reconstructed_or_appendix` disables this check and allows for mainspace pagenames that begin with an asterisk.
]==]
function Language:logicalToPhysical(pagename, is_reconstructed_or_appendix)
-- FIXME: This probably shouldn't happen but it happens when makeEntryName() receives nil.
if pagename == nil then
track("nil-passed-to-logicalToPhysical")
return nil
end
local initial_asterisk
if is_reconstructed_or_appendix == nil then
local pagename_minus_initial_asterisk
initial_asterisk, pagename_minus_initial_asterisk = pagename:match("^(%*)(.*)$")
if pagename_minus_initial_asterisk then
is_reconstructed_or_appendix = true
pagename = pagename_minus_initial_asterisk
elseif self:hasType("appendix-constructed") then
is_reconstructed_or_appendix = true
end
end
if not is_reconstructed_or_appendix then
-- Check if the pagename is a listed unsupported title.
local unsupportedTitles = load_data(links_data_module).unsupported_titles
if unsupportedTitles[pagename] then
return "Unsupported titles/" .. unsupportedTitles[pagename]
end
end
-- Set `unsupported` as true if certain conditions are met.
local unsupported
-- Check if there's an unsupported character. \239\191\189 is the replacement character U+FFFD, which can't be typed
-- directly here due to an abuse filter. Unix-style dot-slash notation is also unsupported, as it is used for
-- relative paths in links, as are 3 or more consecutive tildes. Note: match is faster with magic
-- characters/charsets; find is faster with plaintext.
if (
match(pagename, "[#<>%[%]_{|}]") or
find(pagename, "\239\191\189") or
match(pagename, "%f[^%z/]%.%.?%f[%z/]") or
find(pagename, "~~~")
) then
unsupported = true
-- If it looks like an interwiki link.
elseif find(pagename, ":") then
local prefix = gsub(pagename, "^:*(.-):.*", ulower)
if (
load_data("Module:data/namespaces")[prefix] or
load_data("Module:data/interwikis")[prefix]
) then
unsupported = true
end
end
-- Escape unsupported characters so they can be used in titles. ` is used as a delimiter for this, so a raw use of
-- it in an unsupported title is also escaped here to prevent interference; this is only done with unsupported
-- titles, though, so inclusion won't in itself mean a title is treated as unsupported (which is why it's excluded
-- from the earlier test).
if unsupported then
-- FIXME: This conversion needs to be different for reconstructed pages with unsupported characters. There
-- aren't any currently, but if there ever are, we need to fix this e.g. to put them in something like
-- Reconstruction:Proto-Indo-European/Unsupported titles/`lowbar``num`.
local unsupported_characters = load_data(links_data_module).unsupported_characters
pagename = pagename:gsub("[#<>%[%]_`{|}\239]\191?\189?", unsupported_characters)
:gsub("%f[^%z/]%.%.?%f[%z/]", function(m)
return (gsub(m, "%.", "`period`"))
end)
:gsub("~~~+", function(m)
return (gsub(m, "~", "`tilde`"))
end)
pagename = "Unsupported titles/" .. pagename
elseif not is_reconstructed_or_appendix then
-- Check if this is a mammoth page. If so, which subpage should we link to?
local m_links_data = load_data(links_data_module)
local mammoth_page_type = m_links_data.mammoth_pages[pagename]
if mammoth_page_type then
local canonical_name = self:getFullName()
if canonical_name ~= "Translingual" and canonical_name ~= "English" then
local this_subpage
local L2_sort_key = get_L2_sort_key(canonical_name)
for _, subpage_spec in ipairs(m_links_data.mammoth_page_subpage_types[mammoth_page_type]) do
-- unpack() fails utterly on data loaded using mw.loadData() even if offsets are given
local subpage, pattern = subpage_spec[1], subpage_spec[2]
if pattern == true or L2_sort_key:match(pattern) then
this_subpage = subpage
break
end
end
if not this_subpage then
error(("Internal error: Bad data in mammoth_page_subpage_pages in [[Module:links/data]] for mammoth page %s, type %s; last entry didn't have 'true' in it"):format(
pagename, mammoth_page_type))
end
pagename = pagename .. "/" .. this_subpage
end
end
end
return (initial_asterisk or "") .. pagename
end
--[==[
Strip the diacritics from a display pagename and convert the resulting logical pagename into a physical pagename.
This allows you, for example, to retrieve the contents of the page or check its existence. WARNING: This is deprecated
and will be going away. It is a simple composition of `self:stripDiacritics` and `self:logicalToPhysical`; most callers
only want the former, and if you need both, call them both yourself.
`text` and `sc` are as in `self:stripDiacritics`, and `is_reconstructed_or_appendix` is as in `self:logicalToPhysical`.
]==]
function Language:makeEntryName(text, sc, is_reconstructed_or_appendix)
return self:logicalToPhysical(self:stripDiacritics(text, sc), is_reconstructed_or_appendix)
end
--[==[Generates alternative forms using a specified method, and returns them as a table. If no method is specified, returns a table containing only the input term.]==]
function Language:generateForms(text, sc)
local generate_forms = self._data.generate_forms
if generate_forms == nil then
return {text}
end
sc = checkScript(text, self, sc)
return require("Module:" .. self._data.generate_forms).generateForms(text, self, sc)
end
--[==[Creates a sort key for the given stripped text, following the rules appropriate for the language. This removes
diacritical marks from the stripped text if they are not considered significant for sorting, and may perform some other
changes. Any initial hyphen is also removed, and anything in parentheses is removed as well.
The <code>sort_key</code> setting for each language in the data modules defines the replacements made by this function, or it gives the name of the module that takes the stripped text and returns a sortkey.]==]
function Language:makeSortKey(text, sc)
if (not text) or text == "" then
return text
end
if match(text, "<[^<>]+>") then
track("track HTML tag")
end
-- Remove directional characters, bold, italics, soft hyphens, strip markers and HTML tags.
-- FIXME: Partly duplicated with remove_formatting() in [[Module:links]].
text = ugsub(text, "[\194\173\226\128\170-\226\128\174\226\129\166-\226\129\169]", "")
text = text:gsub("('*)'''(.-'*)'''", "%1%2"):gsub("('*)''(.-'*)''", "%1%2")
text = gsub(unstrip(text), "<[^<>]+>", "")
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
-- Remove initial hyphens and * unless the term only consists of spacing + punctuation characters.
text = ugsub(text, "^([-]*)[-־ـ᠊*]+([-]*)(.*[^%s%p].*)", "%1%2%3")
sc = checkScript(text, self, sc)
text = normalize(text, sc)
text = removeCarets(text, sc)
-- For languages with dotted dotless i, ensure that "İ" is sorted as "i", and "I" is sorted as "ı".
if self:hasDottedDotlessI() then
text = gsub(text, "I\204\135", "i") -- decomposed "İ"
:gsub("I", "ı")
text = sc:toFixedNFD(text)
end
-- Convert to lowercase, make the sortkey, then convert to uppercase. Where the language has dotted dotless i, it is
-- usually not necessary to convert "i" to "İ" and "ı" to "I" first, because "I" will always be interpreted as
-- conventional "I" (not dotless "İ") by any sorting algorithms, which will have been taken into account by the
-- sortkey substitutions themselves. However, if no sortkey substitutions have been specified, then conversion is
-- necessary so as to prevent "i" and "ı" both being sorted as "I".
--
-- An exception is made for scripts that (sometimes) sort by scraping page content, as that means they are sensitive
-- to changes in capitalization (as it changes the target page).
if not sc:sortByScraping() then
text = ulower(text)
end
local actual_substitution_data
-- Don't trim whitespace here because it's significant at the beginning of a sort key or sort base.
text, _, actual_substitution_data = iterateSectionSubstitutions(self, text, sc, nil, nil, self._data.sort_key,
"sort_key", "makeSortKey", "notrim")
if not sc:sortByScraping() then
if self:hasDottedDotlessI() and not actual_substitution_data then
text = text:gsub("ı", "I"):gsub("i", "İ")
text = sc:toFixedNFC(text)
end
text = uupper(text)
end
-- Remove parentheses, as long as they are either preceded or followed by something.
text = gsub(text, "(.)[()]+", "%1"):gsub("[()]+(.)", "%1")
text = escape_risky_characters(text)
return text
end
--[==[Create the form used as as a basis for display text and transliteration. FIXME: Rename to correctInputText().]==]
local function processDisplayText(text, self, sc, keepCarets, keepPrefixes)
local subbedChars = {}
text, subbedChars = doTempSubstitutions(text, subbedChars, keepCarets)
text = decode_uri(text, "PATH")
text = checkNoEntities(self, text)
sc = checkScript(text, self, sc)
text = normalize(text, sc)
text, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, keepCarets, self._data.display_text,
"display_text", "makeDisplayText")
text = removeCarets(text, sc)
-- Remove any interwiki link prefixes (unless they have been escaped or this has been disabled).
if find(text, ":") and not keepPrefixes then
local rep
repeat
text, rep = gsub(text, "\\\\(\\*:)", "\3%1")
until rep == 0
text = gsub(text, "\\:", "\4")
while true do
local prefix = gsub(text, "^(.-):.+", function(m1)
return (gsub(m1, "\244[\128-\191]*", ""))
end)
-- Check if the prefix is an interwiki, though ignore capitalised Wiktionary:, which is a namespace.
if not prefix or prefix == text or prefix == "Wiktionary"
or not (load_data("Module:data/interwikis")[ulower(prefix)] or prefix == "") then
break
end
text = gsub(text, "^(.-):(.*)", function(m1, m2)
local ret = {}
for subbedChar in gmatch(m1, "\244[\128-\191]*") do
insert(ret, subbedChar)
end
return concat(ret) .. m2
end)
end
text = gsub(text, "\3", "\\"):gsub("\4", ":")
end
return text, subbedChars
end
--[==[Make the display text (i.e. what is displayed on the page).]==]
function Language:makeDisplayText(text, sc, keepPrefixes)
if not text or text == "" then
return text
end
local subbedChars
text, subbedChars = processDisplayText(text, self, sc, nil, keepPrefixes)
text = escape_risky_characters(text)
return undoTempSubstitutions(text, subbedChars)
end
--[==[Transliterates the text from the given script into the Latin script (see
[[Wiktionary:Transliteration and romanization]]). The language must have the <code>translit</code> property for this to
work; if it is not present, {{code|lua|nil}} is returned.
The <code>sc</code> parameter is handled by the transliteration module, and how it is handled is specific to that
module. Some transliteration modules may tolerate {{code|lua|nil}} as the script, others require it to be one of the
possible scripts that the module can transliterate, and will throw an error if it's not one of them. For this reason,
the <code>sc</code> parameter should always be provided when writing non-language-specific code.
The <code>module_override</code> parameter is used to override the default module that is used to provide the
transliteration. This is useful in cases where you need to demonstrate a particular module in use, but there is no
default module yet, or you want to demonstrate an alternative version of a transliteration module before making it
official. It should not be used in real modules or templates, only for testing. All uses of this parameter are tracked
by [[Wiktionary:Tracking/languages/module_override]].
'''Known bugs''':
* This function assumes {tr(s1) .. tr(s2) == tr(s1 .. s2)}. When this assertion fails, wikitext markups like <nowiki>'''</nowiki> can cause wrong transliterations.
* HTML entities like <code>&apos;</code>, often used to escape wikitext markups, do not work.
]==]
function Language:transliterate(text, sc, module_override)
-- If there is no text, or the language doesn't have transliteration data and there's no override, return nil.
if not text or text == "" or text == "-" then
return text
end
-- If the script is not transliteratable (and no override is given), return nil.
sc = checkScript(text, self, sc)
if not (sc:isTransliterated() or module_override) then
-- temporary tracking to see if/when this gets triggered
track("non-transliterable")
track("non-transliterable/" .. self._code)
track("non-transliterable/" .. sc:getCode())
track("non-transliterable/" .. sc:getCode() .. "/" .. self._code)
return nil
end
-- Remove any strip markers.
text = unstrip(text)
-- Do not process the formatting into PUA characters for certain languages.
local processed = load_data(languages_data_module).substitution[self._code] ~= "none"
-- Get the display text with the keepCarets flag set.
local subbedChars
if processed then
text, subbedChars = processDisplayText(text, self, sc, true)
end
-- Transliterate (using the module override if applicable).
text, subbedChars = iterateSectionSubstitutions(self, text, sc, subbedChars, true, module_override or
self._data.translit, "translit", "tr")
if not text then
return nil
end
-- Incomplete transliterations return nil.
local charset = sc.characters
if charset and umatch(text, "[" .. charset .. "]") then
-- Remove any characters in Latin, which includes Latin characters also included in other scripts (as these are
-- false positives), as well as any PUA substitutions. Anything remaining should only be script code "None"
-- (e.g. numerals).
local check_text = ugsub(text, "[" .. get_script("Latn").characters .. "-]+", "")
-- Set none_is_last_resort_only flag, so that any non-None chars will cause a script other than "None" to be
-- returned.
if find_best_script_without_lang(check_text, true):getCode() ~= "None" then
return nil
end
end
if processed then
text = escape_risky_characters(text)
text = undoTempSubstitutions(text, subbedChars)
end
-- If the script does not use capitalization, then capitalize any letters of the transliteration which are
-- immediately preceded by a caret (and remove the caret).
if text and not sc:hasCapitalization() and text:find("^", 1, true) then
text = processCarets(text, "%^([\128-\191\244]*%*?)([^\128-\191\244][\128-\191]*)", function(m1, m2)
return m1 .. uupper(m2)
end)
end
-- Track module overrides.
if module_override ~= nil then
track("module_override")
end
return text
end
do
local function handle_language_spec(self, spec, sc)
local ret = self["_" .. spec]
if ret == nil then
ret = self._data[spec]
if type(ret) == "string" then
ret = list_to_set(split(ret, ",", true, true))
end
self["_" .. spec] = ret
end
if type(ret) == "table" then
ret = ret[sc:getCode()]
end
return not not ret
end
function Language:overrideManualTranslit(sc)
return handle_language_spec(self, "override_translit", sc)
end
function Language:link_tr(sc)
return handle_language_spec(self, "link_tr", sc)
end
end
--[==[Returns {{code|lua|true}} if the language has a transliteration module, or {{code|lua|false}} if it doesn't.]==]
function Language:hasTranslit()
return not not self._data.translit
end
--[==[Returns {{code|lua|true}} if the language uses the letters I/ı and İ/i, or {{code|lua|false}} if it doesn't.]==]
function Language:hasDottedDotlessI()
return not not self._data.dotted_dotless_i
end
function Language:toJSON(opts)
local strip_diacritics, strip_diacritics_patterns, strip_diacritics_remove_diacritics = self._data.strip_diacritics
if strip_diacritics then
if strip_diacritics.from then
strip_diacritics_patterns = {}
for i, from in ipairs(strip_diacritics.from) do
insert(strip_diacritics_patterns, {from = from, to = strip_diacritics.to[i] or ""})
end
end
strip_diacritics_remove_diacritics = strip_diacritics.remove_diacritics
end
-- mainCode should only end up non-nil if dontCanonicalizeAliases is passed to make_object().
-- props should either contain zero-argument functions to compute the value, or the value itself.
local props = {
ancestors = function() return self:getAncestorCodes() end,
canonicalName = function() return self:getCanonicalName() end,
categoryName = function() return self:getCategoryName("nocap") end,
code = self._code,
mainCode = self._mainCode,
parent = function() return self:getParentCode() end,
full = function() return self:getFullCode() end,
stripDiacriticsPatterns = strip_diacritics_patterns,
stripDiacriticsRemoveDiacritics = strip_diacritics_remove_diacritics,
family = function() return self:getFamilyCode() end,
aliases = function() return self:getAliases() end,
varieties = function() return self:getVarieties() end,
otherNames = function() return self:getOtherNames() end,
scripts = function() return self:getScriptCodes() end,
type = function() return keys_to_list(self:getTypes()) end,
wikimediaLanguages = function() return self:getWikimediaLanguageCodes() end,
wikidataItem = function() return self:getWikidataItem() end,
wikipediaArticle = function() return self:getWikipediaArticle(true) end,
}
local ret = {}
for prop, val in pairs(props) do
if not opts.skip_fields or not opts.skip_fields[prop] then
if type(val) == "function" then
ret[prop] = val()
else
ret[prop] = val
end
end
end
-- 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.getDataModuleName(code)
local letter = match(code, "^(%l)%l%l?$")
return "Module:" .. (
letter == nil and "languages/data/exceptional" or
#code == 2 and "languages/data/2" or
"languages/data/3/" .. letter
)
end
get_data_module_name = export.getDataModuleName
function export.getExtraDataModuleName(code)
return get_data_module_name(code) .. "/extra"
end
get_extra_data_module_name = export.getExtraDataModuleName
do
local function make_stack(data)
local key_types = {
[2] = "unique",
aliases = "unique",
otherNames = "unique",
type = "append",
varieties = "unique",
wikipedia_article = "unique",
wikimedia_codes = "unique"
}
local function __index(self, k)
local stack, key_type = getmetatable(self), key_types[k]
-- Data that isn't inherited from the parent.
if key_type == "unique" then
local v = stack[stack[make_stack]][k]
if v == nil then
local layer = stack[0]
if layer then -- Could be false if there's no extra data.
v = layer[k]
end
end
return v
-- Data that is appended by each generation.
elseif key_type == "append" then
local parts, offset, n = {}, 0, stack[make_stack]
for i = 1, n do
local part = stack[i][k]
if part == nil then
offset = offset + 1
else
parts[i - offset] = part
end
end
return offset ~= n and concat(parts, ",") or nil
end
local n = stack[make_stack]
while true do
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
local v = layer[k]
if v ~= nil then
return v
end
n = n - 1
end
end
local function __newindex()
error("table is read-only")
end
local function __pairs(self)
-- Iterate down the stack, caching keys to avoid duplicate returns.
local stack, seen = getmetatable(self), {}
local n = stack[make_stack]
local iter, state, k, v = pairs(stack[n])
return function()
repeat
repeat
k = iter(state, k)
if k == nil then
n = n - 1
local layer = stack[n]
if not layer then -- Could be false if there's no extra data.
return nil
end
iter, state, k = pairs(layer)
end
until not (k == nil or seen[k])
-- Get the value via a lookup, as the one returned by the
-- iterator will be the raw value from the current layer,
-- which may not be the one __index will return for that
-- key. Also memoize the key in `seen` (even if the lookup
-- returns nil) so that it doesn't get looked up again.
-- TODO: store values in `self`, avoiding the need to create
-- the `seen` table. The iterator will need to iterate over
-- `self` with `next` first to find these on future loops.
v, seen[k] = self[k], true
until v ~= nil
return k, v
end
end
local __ipairs = require(table_module).indexIpairs
function make_stack(data)
local stack = {
data,
[make_stack] = 1, -- stores the length and acts as a sentinel to confirm a given metatable is a stack.
__index = __index,
__newindex = __newindex,
__pairs = __pairs,
__ipairs = __ipairs,
}
stack.__metatable = stack
return setmetatable({}, stack), stack
end
return make_stack(data)
end
local function get_stack(data)
local stack = getmetatable(data)
return stack and type(stack) == "table" and stack[make_stack] and stack or nil
end
--[==[
<span style="color: var(--wikt-palette-red,#BA0000)">This function is not for use in entries or other content pages.</span>
Returns a blob of data about the language. The format of this blob is undocumented, and perhaps unstable; it's intended for things like the module's own unit-tests, which are "close friends" with the module and will be kept up-to-date as the format changes. If `extra` is set, any extra data in the relevant `/extra` module will be included. (Note that it will be included anyway if it has already been loaded into the language object.) If `raw` is set, then the returned data will not contain any data inherited from parent objects.
-- Do NOT use these methods!
-- All uses should be pre-approved on the talk page!
]==]
function Language:getData(extra, raw)
if extra then
self:loadInExtraData()
end
local data = self._data
-- If raw is not set, just return the data.
if not raw then
return data
end
local stack = get_stack(data)
-- If there isn't a stack or its length is 1, return the data. Extra data (if any) will be included, as it's stored at key 0 and doesn't affect the reported length.
if stack == nil then
return data
end
local n = stack[make_stack]
if n == 1 then
return data
end
local extra = stack[0]
-- If there isn't any extra data, return the top layer of the stack.
if extra == nil then
return stack[n]
end
-- If there is, return a new stack which has the top layer at key 1 and the extra data at key 0.
data, stack = make_stack(stack[n])
stack[0] = extra
return data
end
function Language:loadInExtraData()
-- Only full languages have extra data.
if not self:hasType("language", "full") then
return
end
local data = self._data
-- If there's no stack, create one.
local stack = get_stack(self._data)
if stack == nil then
data, stack = make_stack(data)
-- If already loaded, return.
elseif stack[0] ~= nil then
return
end
self._data = data
-- Load extra data from the relevant module and add it to the stack at key 0, so that the __index and __pairs metamethods will pick it up, since they iterate down the stack until they run out of layers.
local code = self._code
local modulename = get_extra_data_module_name(code)
-- No data cached as false.
stack[0] = modulename and load_data(modulename)[code] or false
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getDataModuleName()
local name = self._dataModuleName
if name == nil then
name = self:hasType("etymology-only") and etymology_languages_data_module or
get_data_module_name(self._mainCode or self._code)
self._dataModuleName = name
end
return name
end
--[==[Returns the name of the module containing the language's data. Currently, this is always [[Module:scripts/data]].]==]
function Language:getExtraDataModuleName()
local name = self._extraDataModuleName
if name == nil then
name = not self:hasType("etymology-only") and get_extra_data_module_name(self._mainCode or self._code) or false
self._extraDataModuleName = name
end
return name or nil
end
function export.makeObject(code, data, dontCanonicalizeAliases)
local data_type = type(data)
if data_type ~= "table" then
error(("bad argument #2 to 'makeObject' (table expected, got %s)"):format(data_type))
end
-- Convert any aliases.
local input_code = code
code = normalize_code(code)
input_code = dontCanonicalizeAliases and input_code or code
local parent
if data.parent then
parent = get_by_code(data.parent, nil, true, true)
else
parent = Language
end
parent.__index = parent
local lang = {_code = input_code}
-- This can only happen if dontCanonicalizeAliases is passed to make_object().
if code ~= input_code then
lang._mainCode = code
end
local parent_data = parent._data
if parent_data == nil then
-- Full code is the same as the code.
lang._fullCode = parent._code or code
else
-- Copy full code.
lang._fullCode = parent._fullCode
local stack = get_stack(parent_data)
if stack == nil then
parent_data, stack = make_stack(parent_data)
end
-- Insert the input data as the new top layer of the stack.
local n = stack[make_stack] + 1
data, stack[n], stack[make_stack] = parent_data, data, n
end
lang._data = data
return setmetatable(lang, parent)
end
make_object = export.makeObject
end
--[==[Finds the language whose code matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">paramForError</code> is {{code|lua|true}}, a generic error message mentioning the bad code is generated; otherwise <code class="n">paramForError</code> should be a string or number specifying the parameter that the code came from, and this parameter will be mentioned in the error message along with the bad code. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.]==]
function export.getByCode(code, paramForError, allowEtymLang, allowFamily)
-- Track uses of paramForError, ultimately so it can be removed, as error-handling should be done by [[Module:parameters]], not here.
if paramForError ~= nil then
track("paramForError")
end
if type(code) ~= "string" then
local typ
if not code then
typ = "nil"
elseif check_object("language", true, code) then
typ = "a language object"
elseif check_object("family", true, code) then
typ = "a family object"
else
typ = "a " .. type(code)
end
error("The function getByCode expects a string as its first argument, but received " .. typ .. ".")
end
local m_data = load_data(languages_data_module)
if m_data.aliases[code] or m_data.track[code] then
track(code)
end
local norm_code = normalize_code(code)
-- Get the data, checking for etymology-only languages if allowEtymLang is set.
local data = load_data(get_data_module_name(norm_code))[norm_code] or
allowEtymLang and load_data(etymology_languages_data_module)[norm_code]
-- If no data was found and allowFamily is set, check the family data. If the main family data was found, make the object with [[Module:families]] instead, as family objects have different methods. However, if it's an etymology-only family, use make_object in this module (which handles object inheritance), and the family-specific methods will be inherited from the parent object.
if data == nil and allowFamily then
data = load_data("Module:families/data")[norm_code]
if data ~= nil then
if data.parent == nil then
return make_family_object(norm_code, data)
elseif not allowEtymLang then
data = nil
end
end
end
local retval = code and data and make_object(code, data)
if not retval and paramForError then
require("Module:languages/errorGetBy").code(code, paramForError, allowEtymLang, allowFamily)
end
return retval
end
get_by_code = export.getByCode
--[==[Finds the language whose canonical name (the name used to represent that language on Wiktionary) or other name matches the one provided. If it exists, it returns a <code class="nf">Language</code> object representing the language. Otherwise, it returns {{code|lua|nil}}, unless <code class="n">paramForError</code> is given, in which case an error is generated. If <code class="n">allowEtymLang</code> is specified, etymology-only language codes are allowed and looked up along with normal language codes. If <code class="n">allowFamily</code> is specified, language family codes are allowed and looked up along with normal language codes.
The canonical name of languages should always be unique (it is an error for two languages on Wiktionary to share the same canonical name), so this is guaranteed to give at most one result.
This function is powered by [[Module:languages/canonical names]], which contains a pre-generated mapping of full-language canonical names to codes. It is generated by going through the [[:Category:Language data modules]] for full languages. When <code class="n">allowEtymLang</code> is specified for the above function, [[Module:etymology languages/canonical names]] may also be used, and when <code class="n">allowFamily</code> is specified for the above function, [[Module:families/canonical names]] may also be used.]==]
function export.getByCanonicalName(name, errorIfInvalid, allowEtymLang, allowFamily)
local byName = load_data("Module:languages/canonical names")
local code = byName and byName[name]
if not code and allowEtymLang then
byName = load_data("Module:etymology languages/canonical names")
code = byName and byName[name] or
byName[gsub(name, " [Ss]ubstrate$", "")] or
byName[gsub(name, "^a ", "")] or
byName[gsub(name, "^a ", ""):gsub(" [Ss]ubstrate$", "")] or
-- For etymology families like "ira-pro".
-- FIXME: This is not ideal, as it allows " languages" to be appended to any etymology-only language, too.
byName[match(name, "^(.*) languages$")]
end
if not code and allowFamily then
byName = load_data("Module:families/canonical names")
code = byName[name] or byName[match(name, "^(.*) languages$")]
end
local retval = code and get_by_code(code, errorIfInvalid, allowEtymLang, allowFamily)
if not retval and errorIfInvalid then
require("Module:languages/errorGetBy").canonicalName(name, allowEtymLang, allowFamily)
end
return retval
end
--[==[Used by [[Module:languages/data/2]] (et al.) and [[Module:etymology languages/data]], [[Module:families/data]], [[Module:scripts/data]] and [[Module:writing systems/data]] to finalize the data into the format that is actually returned.]==]
function export.finalizeData(data, main_type, variety)
local fields = {"type"}
if main_type == "language" then
insert(fields, 4) -- script codes
insert(fields, "ancestors")
insert(fields, "link_tr")
insert(fields, "override_translit")
insert(fields, "wikimedia_codes")
elseif main_type == "script" then
insert(fields, 3) -- writing system codes
end -- Families and writing systems have no extra fields to process.
local fields_len = #fields
for _, entity in next, data do
if variety then
-- Move parent from 3 to "parent" and family from "family" to 3. These are different for the sake of convenience, since very few varieties have the family specified, whereas all of them have a parent.
entity.parent, entity[3], entity.family = entity[3], entity.family
-- Give the type "regular" iff not a variety and no other types are assigned.
elseif not (entity.type or entity.parent) then
entity.type = "regular"
end
for i = 1, fields_len do
local key = fields[i]
local field = entity[key]
if field and type(field) == "string" then
entity[key] = gsub(field, "%s*,%s*", ",")
end
end
end
return data
end
--[==[For backwards compatibility only; modules should require the error themselves.]==]
function export.err(lang_code, param, code_desc, template_tag, not_real_lang)
return require("Module:languages/error")(lang_code, param, code_desc, template_tag, not_real_lang)
end
return export
k2ah8cx1jlmt6f42er8o2bgqfu2ub0p
বিষয়শ্রেণী:লাতিন ভাষা
14
7631
510568
277739
2026-06-10T03:15:26Z
Hiyuune
11971
510568
wikitext
text/x-wiki
{{auto cat}}
[[বিষয়শ্রেণী:সকল ভাষা]]
[[বিষয়শ্রেণী:ইতালীয় ভাষাসমূহ]]
[[বিষয়শ্রেণী:লাতিন লিপির ভাষা]]
[[বিষয়শ্রেণী:সকল বিলুপ্ত ভাষা]]
hj8yuoqf3u36isqdywn9ikulwtillvy
510573
510568
2026-06-10T03:29:44Z
Hiyuune
11971
510573
wikitext
text/x-wiki
{{auto cat|ইতালি}}
[[বিষয়শ্রেণী:সকল ভাষা]]
[[বিষয়শ্রেণী:ইতালীয় ভাষাসমূহ]]
[[বিষয়শ্রেণী:লাতিন লিপির ভাষা]]
[[বিষয়শ্রেণী:সকল বিলুপ্ত ভাষা]]
eikj4fimya6gsaa596dqcg85t4gn4rj
nick
0
28385
510562
175987
2026-06-09T14:27:28Z
Redmin
6857
লেক্সিম লিংকার এক্সটেনশনের সাহায্যে উইকিউপাত্ত লেক্সিম L18049-এর সাথে সংযোগ তৈরি করছি
510562
wikitext
text/x-wiki
{{আরও দেখুন|Nick}}
== {{langname|en}} ==
=== উচ্চারণ ===
* {{উচ্চারণ-ভঙ্গি|RP|GA}} {{আধ্বব|en|/nɪk/}}
* {{অডিও|en|en-us-nick.ogg|অডিও ({{উচ্চারণ/GA}})}}
* {{অডিও|en|en-au-nick.ogg|অডিও (অস্ট্রেলিয়া)}}
* {{সমোচ্চারিত|en|Nick}}
* {{অন্ত্যমিল|en|ɪk}}
=== বিশেষ্য ===
{{en-বিশেষ্য}}
# [[সংকটমুহূর্ত]], [[খাঁজ]], [[শুভক্ষণ]]
{{লে|L18049|না|meaning=# খাঁজ কাটা, ঠিক সময়মত ধরা}}
9qvufg2yoh0hu69z53t335l1ckdn8dt
বিষয়শ্রেণী:ইংরেজি লেমা
14
47812
510577
109531
2026-06-10T03:35:12Z
Hiyuune
11971
510577
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
উইকিঅভিধান:যাচাইকরণের অনুরোধ
4
49404
510596
116972
2026-06-10T10:11:04Z
Redmin
6857
-DPL
510596
wikitext
text/x-wiki
<noinclude>
{{Wiktionary:Request pages}}
{{shortcut|WT:RFVE|WT:RFV:en}}
__NEWSECTIONLINK__
'''এই পৃষ্ঠাটি বাংলা ভুক্তিগুলোর জন্য।''' অন্যান্য ভাষার ভুক্তিগুলোর জন্য দেখুন [[উইকিঅভিধান:যাচাইয়ের অনুরোধ/অবাংলা]].
<div style="float:right;background:#F9F9F9;color:#000;">
<dl style="background:#F2F2F2;color:#000;text-align:center;"><dt>Newest 10 [[:Category:Requests for verification in English entries|tagged RFVs]]</dt></dl>
<ul style="list-style-type:none; list-style-image: none;"><li>
</li></ul>
</div>
{{Wiktionary:Requests for verification/Header}}
<div style="float:right;background:#F9F9F9;color:#000;">
<dl style="background:#F2F2F2;color:#000;text-align:center;"><dt>Oldest 100 [[:Category:Requests for verification in English entries|tagged RFVs]]</dt></dl>
<ul style="list-style-type:none; list-style-image: none;"><li>
</li></ul>
</div>
</noinclude>
9hfq1ipmwutozqffj66h980wliog1h8
মডিউল:languages/canonical names
828
51809
510570
451707
2026-06-10T03:24:39Z
Hiyuune
11971
510570
Scribunto
text/plain
return {
["'আর'আরে"] = "alu", -- 'Are'are
["আ'উ"] = "aou", -- A'ou
["আ-হমাও"] = "hmd", -- A-Hmao
["আ-পুচিকওয়ার"] = "apq", -- A-Pucikwar
["আরি"] = "aiw", -- Aari
["আআসাক্স"] = "aas", -- Aasax
["আবা"] = "utp", -- Aba
["আবাগা"] = "abg", -- Abaga
["আবাই"] = "poz-abi", -- Abai
["আবাই সুঙ্গাই"] = "abf", -- Abai Sungai
["আবানিয়ম"] = "abm", -- Abanyom
["আবাউ"] = "aau", -- Abau
["আবাজা"] = "abq", -- Abaza
["আবেনাকি"] = "abe", -- Abenaki
["আবেনলেন আয়তা"] = "abp", -- Abenlen Ayta
["আবিজি"] = "abi", -- Abidji
["আবিনোম্ন"] = "bsa", -- Abinomn
["আবিপন"] = "axb", -- Abipón
["আবিশিরা"] = "ash", -- Abishira
["আবখাজ"] = "ab", -- Abkhaz
["আবোম"] = "aob", -- Abom
["আবোন"] = "abo", -- Abon
["আব্রোন"] = "abr", -- Abron
["আবু"] = "ado", -- Abu
["আবু'"] = "aah", -- Abu'
["আবুয়া"] = "abn", -- Abua
["আবুই"] = "abz", -- Abui
["আবুন"] = "kgr", -- Abun
["আবুং"] = "abl", -- Abung
["আবুরা"] = "abu", -- Abure
["আবুরাণি"] = "mgj", -- Abureni
["আবে"] = "aba", -- Abé
["আকাতেপেক মে'ফা"] = "tpx", -- Acatepec Me'phaa
["আচেনিস"] = "ace", -- Acehnese
["আচাগুয়া"] = "aca", -- Achagua
["আচাং"] = "acn", -- Achang
["আচে"] = "yif", -- Ache
["আচেরন"] = "acz", -- Acheron
["আচি"] = "acr", -- Achi
["আচোলি"] = "ach", -- Acholi
["আচুয়ার"] = "acu", -- Achuar
["আচুমাবি"] = "acv", -- Achumawi
["আশে"] = "guq", -- Aché
["আক্রোয়া"] = "acs", -- Acroá
["আদাবে"] = "adb", -- Adabe
["আদাই"] = "xad", -- Adai
["আদামোরোব সাইন ল্যাঙ্গুয়েজ"] = "ads", -- Adamorobe Sign Language
["আদাং"] = "adn", -- Adang
["আদাংবে"] = "adq", -- Adangbe
["আদাংমে"] = "ada", -- Adangme
["আদাপ"] = "adp", -- Adap
["আদাবেন"] = "tiu", -- Adasen
["আদেলে"] = "ade", -- Adele
["আঢোলা"] = "adh", -- Adhola
["আদি"] = "adi", -- Adi
["আদিউক্রু"] = "adj", -- Adioukrou
["আদিঠিনঙিথিগ"] = "dth", -- Adithinngithigh
["আদিবাসী ওড়িয়া"] = "ort", -- Adivasi Odia
["আদিবাসী গারাশিয়া"] = "gas", -- Adiwasi Garasia
["আদজা"] = "ajg", -- Adja
["আদনিয়ামাতানহা"] = "adt", -- Adnyamathanha
["আদনরা"] = "adr", -- Adonara
["আদুগে"] = "adu", -- Aduge
["আদিঘে"] = "ady", -- Adyghe
["আদজেরা"] = "adz", -- Adzera
["আদুনি"] = "art-adu", -- Adûni
["একা"] = "aez", -- Aeka
["একিয়োম"] = "awi", -- Aekyom
["এ্যাকুইয়ান"] = "xae", -- Aequian
["আয়ের"] = "aeq", -- Aer
["আফাদে"] = "aal", -- Afade
["আফার"] = "aa", -- Afar
["আফগান সাইন ল্যাঙ্গুয়েজ"] = "afg", -- Afghan Sign Language
["আফিত্তি"] = "aft", -- Afitti
["আফ্রা"] = "ulf", -- Afra
["আফ্রিকান রোম্যান্স"] = "roa-afr", -- African Romance
["আফ্রিহিলি"] = "afh", -- Afrihili
["আফ্রিকান্স"] = "af", -- Afrikaans
["আফ্রো-সেমিনোল ক্রেওল"] = "afs", -- Afro-Seminole Creole
["আগারাবি"] = "agd", -- Agarabi
["আগারিয়া"] = "agi", -- Agariya
["আজাতু"] = "agc", -- Agatu
["আগাভোটাগুয়েরা"] = "avo", -- Agavotaguerra
["আগাভাম"] = "alg-aga", -- Agawam
["আঘেম"] = "agq", -- Aghem
["আঘু"] = "ahh", -- Aghu
["আঘু তার্রংগালা"] = "gtu", -- Aghu Tharrnggala
["আঘুল"] = "agx", -- Aghul
["আঘওয়ান"] = "xag", -- Aghwan
["আজি"] = "aif", -- Agi
["আগব"] = "kit", -- Agob
["আগোই"] = "ibm", -- Agoi
["আগুয়াক্যাটেকা"] = "agu", -- Aguacateca
["আগুয়ানো"] = "aga", -- Aguano
["আগুয়ারুনা"] = "agr", -- Aguaruna
["আগুননা"] = "aug", -- Aguna
["আগুনান মানোবো"] = "msm", -- Agusan Manobo
["আগুতাইনেণ"] = "agn", -- Agutaynen
["আগওয়াগউনে"] = "yay", -- Agwagwune
["আহান্টা"] = "aha", -- Ahanta
["আহিরানি"] = "ahr", -- Ahirani
["আহম"] = "aho", -- Ahom
["আথনা"] = "aht", -- Ahtna
["আহওয়াই"] = "nfd", -- Ahwai
["আই-চাম"] = "aih", -- Ai-Cham
["আইঘোন"] = "aix", -- Aighon
["আইকান্না"] = "tba", -- Aikanã
["আইকলেপ"] = "mwg", -- Aiklep
["আইমেলে"] = "ail", -- Aimele
["আইমোল"] = "aim", -- Aimol
["আইনবাই"] = "aic", -- Ainbai
["আইনু"] = "ain", -- Ainu
["আইওম"] = "aki", -- Aiome
["আইরোরান"] = "air", -- Airoran
["আইসি"] = "mmq", -- Aisi
["আইটন"] = "aio", -- Aiton
["আজা"] = "aja", -- Aja
["আজাওয়া"] = "ajw", -- Ajawa
["আজিএ"] = "aji", -- Ajië
["আজিয়িনিনকা আপুরকায়ালি"] = "cpc", -- Ajyíninka Apurucayali
["আক"] = "akq", -- Ak
["আকা (সেন্ট্রাল আফ্রিকা)"] = "axk", -- Aka (Central Africa)
["আকা (সুদান)"] = "soh", -- Aka (Sudan)
["আকা-বিয়া"] = "abj", -- Aka-Bea
["আকা-বো"] = "akm", -- Aka-Bo
["আকা-কারি"] = "aci", -- Aka-Cari
["আকা-কেদে"] = "akx", -- Aka-Kede
["আকা-কোল"] = "aky", -- Aka-Kol
["আকা-কোরা"] = "ack", -- Aka-Kora
["আকান"] = "ak", -- Akan
["আকার-বালে"] = "acl", -- Akar-Bale
["আকাসেলেম"] = "aks", -- Akaselem
["আকাটেক"] = "knj", -- Akatek
["আকাওয়াইও"] = "ake", -- Akawaio
["আকে"] = "aik", -- Ake
["আকেবু"] = "keu", -- Akebu
["আকেই"] = "tsr", -- Akei
["আকেউ"] = "aeu", -- Akeu
["আখা"] = "ahk", -- Akha
["আখভাক"] = "akv", -- Akhvakh
["আক্কাদিয়ান"] = "akk", -- Akkadian
["আক্কলা সামি"] = "sia", -- Akkala Sami
["আকলানন"] = "akl", -- Aklanon
["আকোলেত"] = "akt", -- Akolet
["আকুসে"] = "bss", -- Akoose
["আকোয়ে"] = "miw", -- Akoye
["আকপা"] = "akf", -- Akpa
["আকপেস"] = "ibe", -- Akpes
["আক্রুকায়"] = "afi", -- Akrukay
["আকুকু"] = "ayk", -- Akuku
["আকুম"] = "aku", -- Akum
["আকুনত্সু"] = "aqz", -- Akuntsu
["আকুরিও"] = "ako", -- Akurio
["আকুয়াগেল"] = "bey", -- Akuwagel
["আকুয়া"] = "akw", -- Akwa
["আকইয়াউং আরি"] = "nqy", -- Akyaung Ari
["আল-সায়্যিদ বেদুয়িন সাইন ল্যাঙ্গুয়েজ"] = "syy", -- Al-Sayyid Bedouin Sign Language
["আলাবা"] = "alw", -- Alaba
["আলাবামা"] = "akz", -- Alabama
["আলাবাত আইল্যান্ড আগটা"] = "dul", -- Alabat Island Agta
["আলাকাট্লাটজালা মিক্সটেক"] = "mim", -- Alacatlatzala Mixtec
["আলাগ্যো"] = "ala", -- Alago
["আলাগওয়া"] = "wbj", -- Alagwa
["আলাক"] = "alk", -- Alak
["আলাম্বলাক"] = "amp", -- Alamblak
["আলাংগান"] = "alj", -- Alangan
["আলানিক"] = "xln", -- Alanic
["আলাপমুনতে"] = "apv", -- Alapmunte
["আলাস-ক্লুয়েট বাটাক"] = "btz", -- Alas-Kluet Batak
["আলাওয়া"] = "alh", -- Alawa
["আলাজাপা"] = "nai-ala", -- Alazapa
["আলবেনিয়ান"] = "sq", -- Albanian
["আলবেনিয়ান সাইন ল্যাঙ্গুয়েজ"] = "sqk", -- Albanian Sign Language
["আলচুক্কা"] = "tuw-alk", -- Alchuka
["আলকোজাউকা মিক্সটেক"] = "xta", -- Alcozauca Mixtec
["আলেগে"] = "alf", -- Alege
["আলেকানো"] = "gah", -- Alekano
["আলেমানিক জার্মান"] = "gsw", -- Alemannic German
["আলিউত"] = "ale", -- Aleut
["আলজেরিয়ান আরবি"] = "arq", -- Algerian Arabic
["আলজেরিয়ান সাইন ল্যাঙ্গুয়েজ"] = "asp", -- Algerian Sign Language
["আলগনকুইন"] = "alq", -- Algonquin
["আলি"] = "aiy", -- Ali
["আল্লাদিয়ান"] = "ald", -- Alladian
["আল্লার"] = "all", -- Allar
["আল্লেন্টিয়াক"] = "sai-all", -- Allentiac
["আলংগিথ"] = "aid", -- Alngith
["আলো ফোলা"] = "ypo", -- Alo Phola
["আলোরেসে"] = "aol", -- Alorese
["আলোয়াপাম জাপোটেক"] = "zaq", -- Aloápam Zapotec
["আলসিয়া"] = "aes", -- Alsea
["আলু"] = "mte", -- Alu
["আলু কুরুম্বা"] = "xua", -- Alu Kurumba
["আলুগু"] = "aub", -- Alugu
["আলুমু-তেসু"] = "aab", -- Alumu-Tesu
["আলুনে"] = "alp", -- Alune
["আলুংগুল"] = "aus-alu", -- Alungul
["আলুও"] = "yna", -- Aluo
["আলুর"] = "alz", -- Alur
["আলুটিইক"] = "ems", -- Alutiiq
["আলুতর"] = "alr", -- Alutor
["আলভিরি-ভিদারি"] = "avd", -- Alviri-Vidari
["আলিয়াওয়ার"] = "aly", -- Alyawarr
["আমা"] = "amm", -- Ama
["আমাহাই"] = "amq", -- Amahai
["আমাহুয়াকা"] = "amc", -- Amahuaca
["আমাইমোন"] = "ali", -- Amaimon
["আমাল"] = "aad", -- Amal
["আম্মানাব"] = "amn", -- Amanab
["আমানায়ে"] = "ama", -- Amanayé
["আমারা"] = "aie", -- Amara
["আমারাকায়েরি"] = "amr", -- Amarakaeri
["আমারাসি"] = "aaz", -- Amarasi
["আমারিজানা"] = "awd-ama", -- Amarizana
["আমাসি"] = "alv-ama", -- Amasi
["আমাতলান জাপোটেক"] = "zpo", -- Amatlán Zapotec
["আম্বা"] = "rwm", -- Amba
["আমবאי"] = "amk", -- Ambai
["আমবাকিক"] = "aew", -- Ambakich
["আম্বালা আয়তা"] = "abc", -- Ambala Ayta
["আম্বেলাউ"] = "amv", -- Ambelau
["আম্বেলে"] = "ael", -- Ambele
["আম্বলং"] = "alm", -- Amblong
["আম্বো"] = "amb", -- Ambo
["আম্বোনিজ মালয়"] = "abs", -- Ambonese Malay
["আমব্রাক"] = "aag", -- Ambrak
["আম্বুল"] = "apo", -- Ambul
["আম্বুলাস"] = "abt", -- Ambulas
["আমদাং"] = "amj", -- Amdang
["আমেলে"] = "aey", -- Amele
["আমেরিকান সাইন ল্যাঙ্গুয়েজ"] = "ase", -- American Sign Language
["আমগানাড ইফুকাও"] = "ifa", -- Amganad Ifugao
["আমহারিক"] = "am", -- Amharic
["আমি"] = "amy", -- Ami
["আমিস"] = "ami", -- Amis
["আম্মোনাইট"] = "sem-amm", -- Ammonite
["আমো"] = "amo", -- Amo
["আমোল"] = "alx", -- Amol
["আমলতেপেক মিক্সটেক"] = "mbz", -- Amoltepec Mixtec
["আমন্দাওয়া"] = "adw", -- Amondawa
["আমোরিট"] = "sem-amo", -- Amorite
["আম্পানং"] = "apg", -- Ampanang
["আম্পারি ডোগন"] = "aqd", -- Ampari Dogon
["আমরি কার্বি"] = "ajz", -- Amri Karbi
["আমতো"] = "amt", -- Amto
["আমুরদাগ"] = "amg", -- Amurdag
["আনা টিংগা ডোগন"] = "dti", -- Ana Tinga Dogon
["আনাং"] = "anw", -- Anaang
["আনাকালঙ্গু"] = "akg", -- Anakalangu
["আনাম"] = "pda", -- Anam
["আনাম্বে"] = "aan", -- Anambé
["আনামগুর"] = "imi", -- Anamgura
["আনাসি"] = "bpo", -- Anasi
["আনউয়া"] = "awd-ana", -- Anauyá
["প্রাচীন গ্রিক"] = "grc", -- Ancient Greek
["প্রাচীন লিগুরিয়ান"] = "xlg", -- Ancient Ligurian
["প্রাচীন ম্যাসিডোনিয়ান"] = "xmk", -- Ancient Macedonian
["প্রাচীন উত্তর আরবি"] = "xna", -- Ancient North Arabian
["প্রাচীন জাপোটেক"] = "xzp", -- Ancient Zapotec
["আন্দাই"] = "afd", -- Andai
["আন্দাজিন"] = "ajn", -- Andajin
["আন্দালুসিয়ান আরবি"] = "xaa", -- Andalusian Arabic
["আন্দামান ক্রেওল হিন্দি"] = "hca", -- Andaman Creole Hindi
["আন্দাকি"] = "ana", -- Andaqui
["আন্দারুম"] = "aod", -- Andarum
["আন্দেগেরিবিনহা"] = "adg", -- Andegerebinha
["আন্ধ"] = "anr", -- Andh
["আন্দি"] = "ani", -- Andi
["আন্দিও"] = "bzb", -- Andio
["আন্দজিংগিথ"] = "aus-and", -- Andjingith
["আন্দোয়া"] = "anb", -- Andoa
["আন্দোকে"] = "ano", -- Andoque
["আন্দোকেয়ারো"] = "sai-and", -- Andoquero
["আন্দরা-হুস"] = "anx", -- Andra-Hus
["আনেইটিইউম"] = "aty", -- Aneityum
["আনেম"] = "anz", -- Anem
["আনেমে ওয়েক"] = "aby", -- Aneme Wake
["আনফিলো"] = "myo", -- Anfillo
["আংগাতাহা"] = "agm", -- Angaataha
["আংগাইতে"] = "aqt", -- Angaité
["আংগাল"] = "age", -- Angal
["আংগাল এনেন"] = "aoe", -- Angal Enen
["আংগাল হেনিং"] = "akh", -- Angal Heneng
["আংগামি"] = "njm", -- Angami
["আংগেভিন"] = "roa-ang", -- Angevin
["আংগুরুক ইয়ালি"] = "yli", -- Angguruk Yali
["আংগিকা"] = "anp", -- Angika
["আংকামুথি"] = "avm", -- Angkamuthi
["আংকোল বাটাক"] = "akb", -- Angkola Batak
["আংকুলা"] = "aus-ang", -- Angkula
["আংলোরোমানি"] = "rme", -- Angloromani
["আংগোলারা"] = "aoa", -- Angolar
["আংগোর"] = "agg", -- Angor
["আংগোরাম"] = "aog", -- Angoram
["আঙ্গোস্টুরাস টুনেবো"] = "tnd", -- Angosturas Tunebo
["আংগুত্থিমরি"] = "awg", -- Anguthimri
["আনি ফোয়া"] = "ypn", -- Ani Phowa
["আনিই"] = "blo", -- Anii
["আনিমেরি"] = "anf", -- Animere
["আনিন্দিলিয়াকওয়া"] = "aoi", -- Anindilyakwa
["আনজাম"] = "boj", -- Anjam
["আংকাভে"] = "aak", -- Ankave
["আনমাটিয়ের"] = "amx", -- Anmatyerre
["আননবোনেস"] = "fab", -- Annobonese
["আনং"] = "nun", -- Anong
["আনোর"] = "anj", -- Anor
["আনসেরমা"] = "ans", -- Anserma
["আনসুস"] = "and", -- Ansus
["আন্টাকারিঙ্গা"] = "ant", -- Antakarinya
["অ্যান্টিগুয়া ও বারবুডা ক্রেওল ইংরেজি"] = "aig", -- Antigua and Barbuda Creole English
["অ্যান্টালিয়ান ক্রেওল"] = "gcf", -- Antillean Creole
["আনু"] = "anl", -- Anu
["আনূয়াক"] = "anu", -- Anuak
["আনফো"] = "cko", -- Anufo
["আনুকি"] = "aui", -- Anuki
["আনাস"] = "auq", -- Anus
["আনূটা"] = "aud", -- Anuta
["আনয়ি"] = "any", -- Anyi
["আনয়িন মোরোফো"] = "mtb", -- Anyin Morofo
["আঁনাল"] = "anm", -- Anāl
["আও"] = "njo", -- Ao
["আওহেং"] = "pni", -- Aoheng
["আওরে"] = "aor", -- Aore
["আপ মা"] = "kbx", -- Ap Ma
["আপভ্রংশ"] = "inc-apa", -- Apabhramsa
["আপালাচি"] = "xap", -- Apalachee
["আপালাই"] = "apy", -- Apalaí
["আপালি"] = "ena", -- Apali
["আপাস্কো-আপোলা মিক্সটেক"] = "mip", -- Apasco-Apoala Mixtec
["আপাতানি"] = "apt", -- Apatani
["আপিয়াকা"] = "api", -- Apiaká
["আপিনায়ে"] = "apn", -- Apinayé
["আপমা"] = "app", -- Apma
["আপোলিস্টা"] = "awd-apo", -- Apolista
["আপ্রুমু আইজি"] = "ahp", -- Aproumu Aizi
["আপুরিন্যা"] = "apu", -- Apurinã
["আপুতাই"] = "apx", -- Aputai
["আকুইতানিয়ান"] = "xaq", -- Aquitanian
["আরবানা"] = "ard", -- Arabana
["আরাবেলা"] = "arl", -- Arabela
["আরবি"] = "ar", -- Arabic
["আরাগোনীয়"] = "an", -- Aragonese
["আরাকি"] = "akr", -- Araki
["আরাকওয়াল"] = "rkw", -- Arakwal
["আরালে-টাবুলহান"] = "atq", -- Aralle-Tabulahan
["আরামাইক"] = "arc", -- Aramaic
["আরাম্বা"] = "stk", -- Arammba
["আরানাদান"] = "aaf", -- Aranadan
["আরানামা-তামিক"] = "xrt", -- Aranama-Tamique
["আরান্দাই"] = "jbj", -- Arandai
["আরাওনা"] = "aro", -- Araona
["আরাাপাহো"] = "arp", -- Arapaho
["আরাপাসো"] = "arj", -- Arapaso
["আরারা-কারো"] = "arr", -- Arara-Karo
["আরারান্ডেওয়ারা"] = "xaj", -- Ararandewára
["আরাভেটে"] = "awt", -- Araweté
["আরাওম"] = "awm", -- Arawum
["আরবোর"] = "arv", -- Arbore
["আরচি"] = "aqc", -- Archi
["আরে"] = "mwc", -- Are
["আরেবা"] = "aea", -- Areba
["আরেম"] = "aem", -- Arem
["আর্জেন্টাইন সাইন ল্যাঙ্গুয়েজ"] = "aed", -- Argentine Sign Language
["আরগোববা"] = "agj", -- Argobba
["আরগুনি"] = "agf", -- Arguni
["আরহুয়াকো"] = "arh", -- Arhuaco
["আরহা"] = "aqr", -- Arhâ
["আরহো"] = "aok", -- Arhö
["আরি"] = "aac", -- Ari
["আরিবওয়াটসা"] = "laz", -- Aribwatsa
["আরিবওয়াং"] = "ylu", -- Aribwaung
["আরিফামা-মিনিয়াফিয়া"] = "aai", -- Arifama-Miniafia
["আরিগিদি"] = "aqg", -- Arigidi
["আরিকাপু"] = "ark", -- Arikapú
["আরিকারা"] = "ari", -- Arikara
["আরিকেম"] = "ait", -- Arikem
["আরিন"] = "xrn", -- Arin
["আরিনগা"] = "luc", -- Aringa
["আরমাজিক"] = "xrm", -- Armazic
["আর্মেনীয়"] = "hy", -- Armenian
["আর্মেনীয় সাইন ল্যাঙ্গুয়েজ"] = "aen", -- Armenian Sign Language
["অ্যারোমানিয়ান"] = "rup", -- Aromanian
["আরোপ-লোকেপ"] = "apr", -- Arop-Lokep
["আরোপ-সিসানো"] = "aps", -- Arop-Sissano
["আরোসি"] = "aia", -- Arosi
["আররিতিনগিগ"] = "rrt", -- Arritinngithigh
["আর্তা"] = "atz", -- Arta
["আরুয়া"] = "aru", -- Arua
["আরুয়ামু"] = "msy", -- Aruamu
["আরুয়েক"] = "aur", -- Aruek
["আরুওপ"] = "lsr", -- Aruop
["আরুতানি"] = "atx", -- Arutani
["আরুয়া"] = "arx", -- Aruá
["আস"] = "asz", -- As
["আসারো'ও"] = "mtv", -- Asaro'o
["আশে"] = "ahs", -- Ashe
["আশকুন"] = "ask", -- Ashkun
["আশো চিন"] = "csh", -- Asho Chin
["আশোকান প্রাকৃত"] = "inc-ash", -- Ashokan Prakrit
["আশরাফ"] = "cus-ash", -- Ashraaf
["আশানিনকা"] = "cni", -- Asháninka
["আশেনিনকা পাজোনাল"] = "cjo", -- Ashéninka Pajonal
["আশেনিনকা পেরেনে"] = "prq", -- Ashéninka Perené
["আসি"] = "bno", -- Asi
["আসিলুলু"] = "asl", -- Asilulu
["আসকোপান"] = "eiv", -- Askopan
["আসোয়া"] = "asv", -- Asoa
["অসমীয়া"] = "as", -- Assamese
["আসান"] = "xss", -- Assan
["আসসাঙ্গোরি"] = "sjg", -- Assangori
["আসসিনীবোইন"] = "asb", -- Assiniboine
["আসিরিয়ান নিও-আরামাইক"] = "aii", -- Assyrian Neo-Aramaic
["আস্টুরিয়ান"] = "ast", -- Asturian
["আসু"] = "aum", -- Asu
["আসুয়ে আওয়ু"] = "psa", -- Asue Awyu
["আসুম্বোয়া"] = "aua", -- Asumboa
["আসুনসিওন মিক্সটেপেক জাপোটেক"] = "zoo", -- Asunción Mixtepec Zapotec
["আসুর"] = "asr", -- Asuri
["আতা"] = "atm", -- Ata
["আতা মানোবো"] = "atd", -- Ata Manobo
["আটাকাপা"] = "aqp", -- Atakapa
["আতাম্পায়া"] = "amz", -- Atampaya
["আতানকেস"] = "cba-ata", -- Atanques
["আটাতলাহুকা মিক্সটেক"] = "mib", -- Atatláhuca Mixtec
["আতয়াল"] = "tay", -- Atayal
["আতেম্বলে"] = "ate", -- Atemble
["আতেসো"] = "teo", -- Ateso
["আথপারে"] = "aph", -- Athpare
["আতি"] = "atk", -- Ati
["আতিকামেক"] = "atj", -- Atikamekw
["আটোওহেইম"] = "aqm", -- Atohwaim
["আতোং (ক্যামেরুন)"] = "ato", -- Atong (Cameroon)
["আতোং (ভারত)"] = "aot", -- Atong (India)
["আতোরাদা"] = "aox", -- Atorada
["আটসাহুয়াকা"] = "atc", -- Atsahuaca
["আটসাম"] = "cch", -- Atsam
["আটসুগউই"] = "atw", -- Atsugewi
["আত্তাপাদি কুরুম্বা"] = "pkr", -- Attapady Kurumba
["আতিয়ে"] = "ati", -- Attié
["আউ"] = "avt", -- Au
["আউহেলাভা"] = "kud", -- Auhelawa
["আউকন"] = "djk", -- Aukan
["আউলুয়া"] = "aul", -- Aulua
["আউরা"] = "aux", -- Aurá
["আউশি"] = "auh", -- Aushi
["আউশিরি"] = "avs", -- Aushiri
["আউস্লান"] = "asf", -- Auslan
["অস্ট্রাল"] = "aut", -- Austral
["অস্ট্রেলিয়ান অ্যাবোরিজিনাল সাইন ল্যাঙ্গুয়েজ"] = "asw", -- Australian Aboriginal Sign Language
["অস্ট্রেলিয়ান ক্রিওল"] = "rop", -- Australian Kriol
["অস্ট্রিয়ান সাইন ল্যাঙ্গুয়েজ"] = "asq", -- Austrian Sign Language
["অস্ট্রোনেনেশিয়ান মারি"] = "hob", -- Austronesian Mari
["আউওয়ে"] = "smf", -- Auwe
["আউয়ানা"] = "auy", -- Auyana
["আউয়ে"] = "auu", -- Auye
["আউয়োকাওয়া"] = "auo", -- Auyokawa
["আভার"] = "av", -- Avar
["আভাতাইম"] = "avn", -- Avatime
["আভাউ"] = "avb", -- Avau
["আভাভা"] = "tmb", -- Avava
["আভেস্তান"] = "ae", -- Avestan
["আভিকাম"] = "avi", -- Avikam
["আভোকাআ"] = "avu", -- Avokaya
["আভা-কানোইরো"] = "avv", -- Avá-Canoeiro
["আওয়া (চীন)"] = "vwa", -- Awa (China)
["আওয়া (নিউ গিনি)"] = "awb", -- Awa (New Guinea)
["আওয়া-কুয়াইকার"] = "kwi", -- Awa-Cuaiquer
["আওয়াবাকাল"] = "awk", -- Awabakal
["আওয়াধি"] = "awa", -- Awadhi
["আওয়াক"] = "awo", -- Awak
["আওয়ার"] = "aya", -- Awar
["আওয়ারা"] = "awx", -- Awara
["আউবোনো"] = "awh", -- Awbono
["আউইয়ার"] = "bob", -- Aweer
["আউয়েরা"] = "awr", -- Awera
["আউয়েতি"] = "awe", -- Awetí
["আউইং"] = "azo", -- Awing
["আউজিলা"] = "auj", -- Awjila
["আউংগি"] = "awn", -- Awngi
["আউংথিম"] = "gwm", -- Awngthim
["আউটুব"] = "kmn", -- Awtuw
["আউন"] = "aww", -- Awun
["আউউতু"] = "afu", -- Awutu
["আউয়ি"] = "auw", -- Awyi
["আক্সাম্ব"] = "ahb", -- Axamb
["আক্সি"] = "yix", -- Axi
["আয়াবাদু"] = "ayd", -- Ayabadhu
["আয়াতলা মাজাতেক"] = "vmy", -- Ayautla Mazatec
["আয়রে"] = "aye", -- Ayere
["আয়য়েরেরেনগে"] = "axe", -- Ayerrerenge
["আয়ি"] = "ayq", -- Ayi
["আয়িজী"] = "yyz", -- Ayizi
["আয়িজো"] = "ayb", -- Ayizo
["আয়মারা"] = "ay", -- Aymara
["আয়োমান"] = "sai-ayo", -- Ayomán
["আয়োকেস্কো জাপোটেক"] = "zaf", -- Ayoquesco Zapotec
["আয়োরিও"] = "ayo", -- Ayoreo
["আয়ু"] = "ayu", -- Ayu
["আয়ুতলা মিক্সটেক"] = "miy", -- Ayutla Mixtec
["আজারবাইজানি"] = "az", -- Azerbaijani
["আজহা"] = "aza", -- Azha
["আঝ"] = "yiz", -- Azhe
["আজোয়ু মে'ফা"] = "tpc", -- Azoyú Me'phaa
["বাআ"] = "kwb", -- Baa
["বাগান্দজি"] = "drl", -- Baagandji
["বান"] = "bvj", -- Baan
["বাংগি"] = "bqx", -- Baangi
["বাটোনুম"] = "bba", -- Baatonum
["বাবা"] = "bbw", -- Baba
["বাবা মালয়"] = "mbf", -- Baba Malay
["বাবাংগো"] = "bbm", -- Babango
["বাবাঙ্কি"] = "bbk", -- Babanki
["বাবাতানা"] = "baa", -- Babatana
["বাবিন-উইটসুইট'এন"] = "bcr", -- Babine-Witsuwit'en
["বাবোলে"] = "bvx", -- Babole
["বাবুনগো"] = "bav", -- Babungo
["বাবুজ"] = "bzg", -- Babuza
["বাকামা"] = "bcy", -- Bacama
["বাকানেস মালয়"] = "btj", -- Bacanese Malay
["ব্যাকট্রিয়ান"] = "xbc", -- Bactrian
["বাদা"] = "bhz", -- Bada
["বাদাগা"] = "bfq", -- Badaga
["বাদঞ্চি"] = "bau", -- Badanchi
["বাদে"] = "bde", -- Bade
["বাদেসি"] = "bdz", -- Badeshi
["বাদিমায়া"] = "bia", -- Badimaya
["বাদুই"] = "bac", -- Baduy
["বাদিয়ারা"] = "pbp", -- Badyara
["বেইগগু"] = "bvd", -- Baeggu
["ব্যাকজে"] = "pkc", -- Baekje
["বায়েলেলেয়া"] = "bvc", -- Baelelea
["বাইনান"] = "sai-bae", -- Baenan
["বায়েতোরা"] = "btr", -- Baetora
["বাফানজি"] = "bfj", -- Bafanji
["বাফাও"] = "bwt", -- Bafaw
["বাফিয়া"] = "ksf", -- Bafia
["বাফুট"] = "bfd", -- Bafut
["বাগা কালৌম"] = "bqf", -- Baga Kaloum
["বাগা কোগা"] = "bgo", -- Baga Koga
["বাগা মান্দুরি"] = "bmd", -- Baga Manduri
["বাগা পোকুর"] = "bcg", -- Baga Pokur
["বাগা সিতেমু"] = "bsp", -- Baga Sitemu
["বাগা সোবানে"] = "bsv", -- Baga Sobané
["বাঘেলি"] = "bfy", -- Bagheli
["বাগিরমি"] = "bmi", -- Bagirmi
["বাগো-কুসুন্তু"] = "bqg", -- Bago-Kusuntu
["বাগরি"] = "bgq", -- Bagri
["বাগুয়া"] = "sai-bag", -- Bagua
["বাগূপি"] = "bpi", -- Bagupi
["বাগুসা"] = "bqb", -- Bagusa
["বাগভালার"] = "kva", -- Bagvalal
["বাহা"] = "yha", -- Baha
["বাহাম"] = "bdw", -- Baham
["বাহামিয়ান ক্রেওল"] = "bah", -- Bahamian Creole
["বাহার্না আরবি"] = "abv", -- Baharna Arabic
["বাহাউ"] = "bhv", -- Bahau
["বাহিনেমো"] = "bjh", -- Bahinemo
["বাহিং"] = "bhj", -- Bahing
["বাহনার"] = "bdq", -- Bahnar
["বাহনসুয়াই"] = "bsu", -- Bahonsuai
["বাই"] = "bdj", -- Bai
["বাইবাই"] = "bbf", -- Baibai
["বাইকেনো"] = "bkx", -- Baikeno
["বাইলাং"] = "tbq-blg", -- Bailang
["বাইমা"] = "bqh", -- Baima
["বাইমাক"] = "bmx", -- Baimak
["বাইনৌক-গুনিয়ামলো"] = "bcz", -- Bainouk-Gunyaamolo
["বাইনৌক-গুনয়ুনো"] = "bab", -- Bainouk-Gunyuño
["বাইনৌক-সামিক"] = "bcb", -- Bainouk-Samik
["বাইসো"] = "bsw", -- Baiso
["বাইসা ফালি"] = "fah", -- Baissa Fali
["বাজান"] = "bjs", -- Bajan
["বাজেগানি"] = "bjm", -- Bajelani
["বাজ্জিকা"] = "vjk", -- Bajjika
["বাকা"] = "bkc", -- Baka
["বাকাইরি"] = "bkq", -- Bakairí
["বাকাকা"] = "bqz", -- Bakaka
["বখতিয়ারি"] = "bqi", -- Bakhtiari
["বাকি"] = "bki", -- Baki
["বাকোকো"] = "bkh", -- Bakoko
["বাকোলে"] = "kme", -- Bakole
["বাকপিঙ্কা"] = "bbs", -- Bakpinka
["বাকুলুং"] = "bbu", -- Bakulung
["বাকুম্পাই"] = "bkr", -- Bakumpai
["বাকুং"] = "xkl", -- Bakung
["বাকওয়ে"] = "bjw", -- Bakwé
["বালা"] = "tuw-bal", -- Bala
["বালায়েসাং"] = "bls", -- Balaesang
["বালানগাও"] = "blw", -- Balangao
["বালানগিংগি"] = "sse", -- Balangingi
["বালান্টা-গাঞ্জা"] = "bjt", -- Balanta-Ganja
["বালান্টা-কেন্তোহে"] = "ble", -- Balanta-Kentohe
["বালান্তাক"] = "blz", -- Balantak
["বালাউ"] = "blg", -- Balau
["বালদেয়ামু"] = "bdn", -- Baldemu
["বালি"] = "bcp", -- Bali
["বালিলেডো"] = "poz-bal", -- Baliledo
["বালিনিস"] = "ban", -- Balinese
["বালিনিস মালয়"] = "mhp", -- Balinese Malay
["বালকান গাগাউজ তুর্কি"] = "bgx", -- Balkan Gagauz Turkish
["বালকান রোমানি"] = "rmn", -- Balkan Romani
["বালো"] = "bqo", -- Balo
["বালোই"] = "biz", -- Baloi
["বালং"] = "bnt-bal", -- Balong
["বালটি"] = "bft", -- Balti
["বাল্টিক রোমানি"] = "rml", -- Baltic Romani
["বালুয়ান-পাম"] = "blq", -- Baluan-Pam
["বালুচি"] = "bal", -- Baluchi
["বামাকো সাইন ল্যাঙ্গুয়েজ"] = "bog", -- Bamako Sign Language
["বামাali"] = "bbq", -- Bamali
["বাম্বালাং"] = "bmo", -- Bambalang
["বাম্বাম"] = "ptu", -- Bambam
["বাম্বারা"] = "bm", -- Bambara
["বাম্বاسي"] = "myf", -- Bambassi
["বাম্বিলি-বাম্বুই"] = "baw", -- Bambili-Bambui
["বামেয়াম"] = "bce", -- Bamenyam
["বামু"] = "bcf", -- Bamu
["বামুকুম্বিট"] = "bqt", -- Bamukumbit
["বামুম"] = "bax", -- Bamum
["বামুঙ্কা"] = "bvm", -- Bamunka
["বামওয়ে"] = "bmg", -- Bamwe
["বান খোর সাইন ল্যাঙ্গুয়েজ"] = "bfk", -- Ban Khor Sign Language
["বানা"] = "bcw", -- Bana
["বানাo ইতনেগ"] = "bjx", -- Banao Itneg
["বানারো"] = "byz", -- Banaro
["বান্দা"] = "bnd", -- Banda
["বান্দা মালয়"] = "bpq", -- Banda Malay
["বান্দা-বাম্বারি"] = "liy", -- Banda-Bambari
["বান্দা-বান্দা"] = "bpd", -- Banda-Banda
["বান্দা-মব্রেস"] = "bqk", -- Banda-Mbrès
["বান্দা-ন্দেলে"] = "bfl", -- Banda-Ndélé
["বান্দা-ইয়াংগেরে"] = "yaj", -- Banda-Yangere
["বান্দি"] = "bza", -- Bandi
["বান্দিয়াল"] = "bqj", -- Bandial
["বান্দজালং"] = "bdy", -- Bandjalang
["বাংগালা"] = "bxg", -- Bangala
["বানগান্দু"] = "bgf", -- Bangandu
["বাংগবা"] = "bbe", -- Bangba
["বাংগাই"] = "bgz", -- Banggai
["বাংগি"] = "bni", -- Bangi
["বান্গিমে"] = "dba", -- Bangime
["বাংকা"] = "mfb", -- Bangka
["বানগোলান"] = "bgj", -- Bangolan
["বানগ্রু"] = "sit-ban", -- Bangru
["বানগুবানগু"] = "bnx", -- Bangubangu
["বানগুইনজি"] = "bsj", -- Bangwinji
["বানিয়াভা"] = "bvv", -- Baniva
["বানিওয়া"] = "bwi", -- Baniwa
["বানজারেসে"] = "bjn", -- Banjarese
["বানকা"] = "bxw", -- Banka
["বানকান টেই ডোগন"] = "dbw", -- Bankan Tey Dogon
["বানকন"] = "abb", -- Bankon
["বাননি"] = "bcm", -- Banoni
["বানতাওয়া"] = "bap", -- Bantawa
["বান্টায়ানন"] = "bfx", -- Bantayanon
["বান্টিক"] = "bnq", -- Bantik
["বানয়ুমাসন"] = "map-bms", -- Banyumasan
["বাউলে"] = "bci", -- Baoule
["বারামু"] = "brd", -- Baraamu
["বারাই"] = "bbb", -- Barai
["বারাকাই"] = "baj", -- Barakai
["বারাম কায়ান"] = "kys", -- Baram Kayan
["বারামা"] = "bbg", -- Barama
["বারাম্বু"] = "brm", -- Barambu
["বারামু"] = "bmz", -- Baramu
["বারাপাসি"] = "brp", -- Barapasi
["বারাস"] = "brs", -- Baras
["বারাসানা"] = "bsn", -- Barasana
["বারবারেঞো"] = "boi", -- Barbareño
["বারক্লেভিলে গ্রেবো"] = "gry", -- Barclayville Grebo
["বার্দি"] = "bcj", -- Bardi
["বারিন"] = "bva", -- Barein
["বার্গাম"] = "mlp", -- Bargam
["বারী"] = "bfa", -- Bari
["বারিয়াই"] = "bch", -- Bariai
["বারিজী"] = "bjc", -- Bariji
["বারিকানচি"] = "bxo", -- Barikanchi
["বারিকওয়া"] = "jbk", -- Barikewa
["বার্নগার্লা"] = "bjb", -- Barngarla
["বারোক"] = "bjk", -- Barok
["বারোম্বি"] = "bbi", -- Barombi
["বারানবিনা"] = "aus-bra", -- Barranbinya
["বারো নিগ্রো টুনবো"] = "tbn", -- Barro Negro Tunebo
["ব্যারো পয়েন্ট"] = "bpt", -- Barrow Point
["বারুগা"] = "bjz", -- Baruga
["বারুনগগাম"] = "aus-brm", -- Barunggam
["বারুয়া"] = "byr", -- Baruya
["বারওয়ে"] = "bwg", -- Barwe
["বারজানি ইহুদি নিও-আরামাইক"] = "bjf", -- Barzani Jewish Neo-Aramaic
["বারে"] = "bae", -- Baré
["বারি"] = "mot", -- Barí
["বাসা"] = "bzw", -- Basa
["বাসা-গুমনা"] = "bsl", -- Basa-Gumna
["বাসা-গুরমানা"] = "buj", -- Basa-Gurmana
["বাসা"] = "bas", -- Basaa
["বাসাপ"] = "bdb", -- Basap
["বাসায়"] = "byq", -- Basay
["বাশকার্দি"] = "bsg", -- Bashkardi
["বাশকির"] = "ba", -- Bashkir
["বাসকেতো"] = "bst", -- Basketo
["বাস্ক"] = "eu", -- Basque
["বাস্ক-আইসল্যান্ডিক পিডগিন"] = "crp-bip", -- Basque-Icelandic Pidgin
["বাসা"] = "bsq", -- Bassa
["বাসা-কন্টগোরা"] = "bsr", -- Bassa-Kontagora
["বাসসারি"] = "bsc", -- Bassari
["বাসসোসি"] = "bsi", -- Bassossi
["বাটা"] = "bta", -- Bata
["বাটাআন আয়তা"] = "ayt", -- Bataan Ayta
["বাটাড ইফুকাও"] = "ifb", -- Batad Ifugao
["বাটাঙ্গা"] = "bnm", -- Batanga
["বাটেক"] = "btq", -- Batek
["বাটেরি"] = "btv", -- Bateri
["বাথারি"] = "bhm", -- Bathari
["বাটি (ক্যামেরুন)"] = "btc", -- Bati (Cameroon)
["বাটি (ইন্দোনেশিয়া)"] = "bvt", -- Bati (Indonesia)
["বাটস"] = "bbl", -- Bats
["বাতু"] = "btu", -- Batu
["বাটুই"] = "zbt", -- Batui
["বাটুলে"] = "bay", -- Batuley
["বাউ"] = "bbd", -- Bau
["বাউ বিদায়ু"] = "sne", -- Bau Bidayuh
["বাউচি"] = "bsf", -- Bauchi
["বাউরে"] = "brg", -- Baure
["বাউরিয়া"] = "bge", -- Bauria
["বাউরো"] = "bxa", -- Bauro
["বাউওয়াকি"] = "bwk", -- Bauwaki
["বাউজি"] = "bvz", -- Bauzi
["বাভারিয়ান"] = "bar", -- Bavarian
["বাওম চিন"] = "bgr", -- Bawm Chin
["বে মিউক"] = "mkq", -- Bay Miwok
["বায়ালি"] = "bjy", -- Bayali
["বায়বায়ানন"] = "bvy", -- Baybayanon
["বায়গো"] = "byg", -- Baygo
["বায়োগুলা"] = "nai-bay", -- Bayogoula
["বায়োনো"] = "byl", -- Bayono
["বায়োট"] = "bda", -- Bayot
["বায়ুনগু"] = "bxj", -- Bayungu
["বাজিগর"] = "bfr", -- Bazigar
["বাইনৌঙ্ক গুবীয়ের"] = "alv-bgu", -- Baïnounk Gubëeher
["বিয়ামি"] = "beo", -- Beami
["বিয়ারি"] = "dra-bry", -- Beary
["বিভার"] = "bea", -- Beaver
["বেবা"] = "bfp", -- Beba
["বেবে"] = "bzv", -- Bebe
["বেবেলে"] = "beb", -- Bebele
["বেবেলি"] = "bek", -- Bebeli
["বেবিল"] = "bxp", -- Bebil
["বেদিক"] = "tnr", -- Bedik
["বেডজন্ড"] = "bjv", -- Bedjond
["বেডোয়ানাস"] = "bed", -- Bedoanas
["বিয়াকি"] = "bkf", -- Beeke
["বিয়েলি"] = "bxq", -- Beele
["বিয়েম্বে"] = "beq", -- Beembe
["বিয়েজেন"] = "bnz", -- Beezen
["বেফাং"] = "bby", -- Befang
["বেগেরে-এজার"] = "bqv", -- Begbere-Ejar
["বেজা"] = "bej", -- Beja
["বেকাটি'"] = "bei", -- Bekati'
["বেকওয়ারা"] = "bkv", -- Bekwarra
["বেকওয়েল"] = "bkw", -- Bekwel
["বেলাইত"] = "beg", -- Belait
["বেলান্ডা বোর"] = "bxb", -- Belanda Bor
["বেলান্ডা ভিরি"] = "bvi", -- Belanda Viri
["বেলারুশিয়ান"] = "be", -- Belarusian
["বেলহারিয়া"] = "byw", -- Belhariya
["বেলি"] = "blm", -- Beli
["বেলিজিয়ান ক্রেওল"] = "bzj", -- Belizean Creole
["বেলা কুলা"] = "blc", -- Bella Coola
["বেল্লারি"] = "brw", -- Bellari
["বেল্টার ক্রেওল"] = "art-bel", -- Belter Creole
["বেম্বা"] = "bem", -- Bemba
["বেম্বে"] = "bmb", -- Bembe
["বেন টে"] = "dbt", -- Ben Tey
["বেনা"] = "yun", -- Bena
["বেনাবেনা"] = "bef", -- Benabena
["বেঞ্চ"] = "bcq", -- Bench
["বেন্দে"] = "bdp", -- Bende
["বেন্দি"] = "bct", -- Bendi
["বেনেরাফ"] = "bnv", -- Beneraf
["বেং"] = "nhb", -- Beng
["বেংগা"] = "bng", -- Benga
["বাংলা"] = "bn", -- বাংলা
["বেংগোই"] = "bgy", -- Benggoi
["বেংকালে সাইন ল্যাঙ্গুয়েজ"] = "bqy", -- Bengkala Sign Language
["বেন্টোং"] = "bnu", -- Bentong
["বেনিয়াদু'"] = "byd", -- Benyadu'
["বিওথুক"] = "bue", -- Beothuk
["বেপোর"] = "bie", -- Bepour
["বেরা"] = "brf", -- Bera
["বেরাকু"] = "bxv", -- Berakou
["বেরাও মালয়"] = "bve", -- Berau Malay
["বেরাওয়ান"] = "lod", -- Berawan
["বেরবাইস ক্রেওল ডাচ"] = "brc", -- Berbice Creole Dutch
["বার্গিশ"] = "gmw-bgh", -- Bergish
["বেরিক"] = "bkl", -- Berik
["বেরিনোমো"] = "bit", -- Berinomo
["বেরোম"] = "bom", -- Berom
["বার্তা"] = "wti", -- Berta
["বার্তি"] = "byt", -- Berti
["বেসিচি"] = "mhe", -- Besisi
["বেসমে"] = "bes", -- Besme
["বেসোয়া"] = "bep", -- Besoa
["বেটাফ"] = "bfe", -- Betaf
["বেটাউই"] = "bew", -- Betawi
["বেটে"] = "byf", -- Bete
["বেটে-বেন্দি"] = "btt", -- Bete-Bendi
["বেটোই"] = "sai-bet", -- Betoi
["বেটা কুরুম্বা"] = "xub", -- Betta Kurumba
["বেজতা"] = "kap", -- Bezhta
["ভাদ্রওয়াহী"] = "bhd", -- Bhadrawahi
["ভালায়"] = "bhx", -- Bhalay
["ভারিয়া"] = "bha", -- Bharia
["ভাতরি"] = "bgw", -- Bhatri
["ভাত্তিয়ালি"] = "bht", -- Bhattiyali
["ভায়া"] = "bhe", -- Bhaya
["ভেলে"] = "bhy", -- Bhele
["ভিলালি"] = "bhi", -- Bhilali
["ভিলি"] = "bhb", -- Bhili
["ভোজপুরী"] = "bho", -- Bhojpuri
["ভোটি কিন্নৌরি"] = "nes", -- Bhoti Kinnauri
["ভুনজিয়া"] = "bhu", -- Bhunjia
["বিয়াফাদা"] = "bif", -- Biafada
["বিয়াজে"] = "bdf", -- Biage
["বিয়াক"] = "bhw", -- Biak
["বিয়ালি"] = "beh", -- Biali
["বিয়ান মারিন্দ"] = "bpv", -- Bian Marind
["বিয়ানগাই"] = "big", -- Biangai
["বিয়াও"] = "byk", -- Biao
["বিয়াও মন"] = "bmt", -- Biao Mon
["বিয়াও-জিয়াও মিয়েন"] = "bje", -- Biao-Jiao Mien
["বিয়াটা বিদায়ু"] = "bth", -- Biatah Bidayuh
["বিবালী"] = "bcn", -- Bibaali
["বিবুলমান"] = "xbp", -- Bibbulman
["বিদিও"] = "bid", -- Bidiyo
["বিদ্বারা"] = "bym", -- Bidyara
["বিদিওগো"] = "bjg", -- Bidyogo
["বিয়েম"] = "bmc", -- Biem
["বিয়েরেবো"] = "bnk", -- Bierebo
["বিয়েরিয়া"] = "brj", -- Bieria
["বিয়েতে"] = "biu", -- Biete
["বিগ নাম্বাস"] = "nmb", -- Big Nambas
["বিগা"] = "bhc", -- Biga
["বিগাম্বাল"] = "xbe", -- Bigambal
["বিহ"] = "ibh", -- Bih
["বিহারি"] = "bh", -- Bihari
["বিজোরি"] = "bix", -- Bijori
["বিকারু"] = "bic", -- Bikaru
["বিকোল সেন্ট্রাল"] = "bcl", -- Bikol Central
["বিকিয়া"] = "byb", -- Bikya
["বিলা"] = "bip", -- Bila
["বিলাকুরা"] = "bql", -- Bilakura
["বিলাসপুরি"] = "kfs", -- Bilaspuri
["বিলবা"] = "bpz", -- Bilba
["বিলবিল"] = "brz", -- Bilbil
["বিলে"] = "bil", -- Bile
["বিলিয়াউ"] = "bcu", -- Biliau
["বিলোxi"] = "bll", -- Biloxi
["বিলুয়া"] = "blb", -- Bilua
["বিলুর"] = "bxf", -- Bilur
["বিমা"] = "bhp", -- Bima
["বিমিন"] = "bhl", -- Bimin
["বিমোবা"] = "bim", -- Bimoba
["বিনা"] = "bmn", -- Bina
["বিনাহারী"] = "bxz", -- Binahari
["বিনান্দেরে"] = "bhg", -- Binandere
["বিনাওয়া"] = "byj", -- Binawa
["বিন্ডাল"] = "xbd", -- Bindal
["বাইন"] = "bon", -- Bine
["বিনজি"] = "bpj", -- Binji
["বিনোংগান ইতনেগ"] = "itb", -- Binongan Itneg
["বিন্টাউনা"] = "bne", -- Bintauna
["বিন্টুলু"] = "bny", -- Bintulu
["বিনুকিদ"] = "bkd", -- Binukid
["বিনুমারিয়েন"] = "bjr", -- Binumarien
["বিপি"] = "biq", -- Bipi
["বিরাও"] = "brr", -- Birao
["বিরগিদ"] = "brk", -- Birgid
["বিরগিট"] = "btf", -- Birgit
["বিরহোর"] = "biy", -- Birhor
["বিরি"] = "bzr", -- Biri
["বিরিতাই"] = "bqq", -- Biritai
["বিরি"] = "bvq", -- Birri
["বিরপায়ি"] = "xbj", -- Birrpayi
["বিরওয়া"] = "brl", -- Birwa
["বিসেনি"] = "ije", -- Biseni
["বিষ্ণুপ্রিয়া মণিপুরি"] = "bpy", -- Bishnupriya Manipuri
["বিশুও"] = "bwh", -- Bishuo
["বিসইস"] = "bnw", -- Bisis
["বিসলামা"] = "bi", -- Bislama
["বিসোরিও"] = "bir", -- Bisorio
["বিসা"] = "bib", -- Bissa
["বিসু"] = "bzi", -- Bisu
["বিট"] = "bgk", -- Bit
["বিতারে"] = "brt", -- Bitare
["বিতুর"] = "mcc", -- Bitur
["বিওয়াট"] = "bwm", -- Biwat
["বিয়ো"] = "byo", -- Biyo
["বিয়োম"] = "bpm", -- Biyom
["ব্লাব্লাঙ্গা"] = "blp", -- Blablanga
["ব্ল্যাক স্পিচ"] = "art-bsp", -- Black Speech
["ব্ল্যাকফুট"] = "bla", -- Blackfoot
["ব্ল্যাফে"] = "bfh", -- Blafe
["ব্লাগার"] = "beu", -- Blagar
["ব্লাং"] = "blr", -- Blang
["ব্লিন"] = "byn", -- Blin
["বো"] = "bgl", -- Bo
["বো-রুকুল"] = "mae", -- Bo-Rukul
["বো-উং"] = "mux", -- Bo-Ung
["বোয়ানো (মালুকু)"] = "bzn", -- Boano (Maluku)
["বোয়ানো (সুলাওয়েসি)"] = "bzl", -- Boano (Sulawesi)
["বোবোংক্কো"] = "bgb", -- Bobongko
["বোবোট"] = "bty", -- Bobot
["বোডো (সেন্ট্রাল আফ্রিকা)"] = "boy", -- Bodo (Central Africa)
["বোডো (ভারত)"] = "brx", -- Bodo (India)
["বোডো গাদাবা"] = "gbj", -- Bodo Gadaba
["বোডো পার্জা"] = "bdv", -- Bodo Parja
["বোফি"] = "bff", -- Bofi
["বোজা"] = "bvw", -- Boga
["বোগায়া"] = "boq", -- Bogaya
["বোগোম"] = "bux", -- Boghom
["বোগুরু"] = "bqu", -- Boguru
["বোহটান নিও-আরামাইক"] = "bhn", -- Bohtan Neo-Aramaic
["বোইকিন"] = "bzf", -- Boikin
["বোকার"] = "sit-bok", -- Bokar
["বোখা"] = "ybk", -- Bokha
["বোকো"] = "bqc", -- Boko
["বোকোবারু"] = "bus", -- Bokobaru
["বোকোটো"] = "bdt", -- Bokoto
["বোকি"] = "bky", -- Bokyi
["বোলা"] = "bnp", -- Bola
["বোলাক"] = "art-blk", -- Bolak
["বোলানগো"] = "bld", -- Bolango
["বোলে"] = "bol", -- Bole
["বোলগো"] = "bvo", -- Bolgo
["বোলিয়া"] = "bli", -- Bolia
["বোলিনাও"] = "smk", -- Bolinao
["বলিভিয়ান সাইন ল্যাঙ্গুয়েজ"] = "bvl", -- Bolivian Sign Language
["বোলুকি"] = "bkt", -- Boloki
["বোলোন"] = "bof", -- Bolon
["বোলোন্ডো"] = "bzm", -- Bolondo
["বোলংগান"] = "blj", -- Bolongan
["বোলিউ"] = "ply", -- Bolyu
["বোম"] = "bmf", -- Bom
["বোমাঙ্কু"] = "bnt-bon", -- Boma Nkuu
["বোমা য়ুমু"] = "bnt-boy", -- Boma Yumu
["বোম্বোলি"] = "bml", -- Bomboli
["বোম্বোমা"] = "bws", -- Bomboma
["বোমিতাবা"] = "zmx", -- Bomitaba
["বোমু"] = "bmq", -- Bomu
["বোমওয়ালি"] = "bmw", -- Bomwali
["বনগুলা"] = "glc", -- Bon Gula
["বোনাল"] = "peh", -- Bonan
["বন্ডেই"] = "bou", -- Bondei
["বন্ডো"] = "bfw", -- Bondo
["বন্ডউকৌ কুলাংগো"] = "kzc", -- Bondoukou Kulango
["বন্ডুম ডোম ডোগন"] = "dbu", -- Bondum Dom Dogon
["বোনেরাটে"] = "bna", -- Bonerate
["বংগি"] = "bdg", -- Bonggi
["বংগো"] = "bpg", -- Bonggo
["বংগিলি"] = "bui", -- Bongili
["বংগো"] = "bot", -- Bongo
["বংগু"] = "bpu", -- Bongu
["বঞ্জো"] = "bok", -- Bonjo
["বোনকেং"] = "bvg", -- Bonkeng
["বোনকিমান"] = "bop", -- Bonkiman
["বুকান"] = "bnb", -- Bookan
["বুন"] = "bnl", -- Boon
["বুর"] = "bvf", -- Boor
["বোরা"] = "boa", -- Bora
["বর্ডার কুনআ"] = "kvn", -- Border Kuna
["বোরেই"] = "gai", -- Borei
["বোরো"] = "xxb", -- Boro
["বোরোং"] = "ksr", -- Borong
["বোরুকা"] = "brn", -- Boruca
["বোরোরো"] = "bor", -- Borôro
["বোসেলেওয়া"] = "bwf", -- Boselewa
["বোসগুন"] = "bqs", -- Bosngun
["বোটে-মাজি"] = "bmj", -- Bote-Majhi
["বোটলিখ"] = "bph", -- Botlikh
["বোটোলান সাম্বাল"] = "sbl", -- Botolan Sambal
["বৌনা কুলানগো"] = "nku", -- Bouna Kulango
["বর্বোনnais-Berrichon"] = "roa-bbn", -- Bourbonnais-Berrichon
["বোরগুইগনন"] = "roa-brg", -- Bourguignon
["বুইয়েই"] = "pcc", -- Bouyei
["বোজাবা"] = "bzo", -- Bozaba
["ব্রাগাত"] = "aof", -- Bragat
["ব্রাহুই"] = "brh", -- Brahui
["ব্রজ"] = "bra", -- Braj
["ব্রাজিলিয়ান সাইন ল্যাঙ্গুয়েজ"] = "bzs", -- Brazilian Sign Language
["ব্রেক কারেন"] = "kvl", -- Brek Karen
["ব্রেহম"] = "buq", -- Brem
["ব্রেরি"] = "brq", -- Breri
["ব্রেটোন"] = "br", -- Breton
["ব্রিব্রি"] = "bzd", -- Bribri
["ব্রিটিশ সাইন ল্যাঙ্গুয়েজ"] = "bfi", -- British Sign Language
["ব্রোক্কাট"] = "bro", -- Brokkat
["ব্রোকপাকে"] = "sgt", -- Brokpake
["ব্রোকসকাট"] = "bkk", -- Brokskat
["ব্রুক'স পয়েন্ট পালাওয়ানো"] = "plw", -- Brooke's Point Palawano
["ব্রুম পিয়ার্লিং লাগার পিডগিন"] = "bpl", -- Broome Pearling Lugger Pidgin
["ব্রুনাই বিসায়া"] = "bsb", -- Brunei Bisaya
["ব্রুনাই মালয়"] = "kxd", -- Brunei Malay
["ব্রুনি আইল্যান্ড"] = "xpz", -- Bruny Island
["বু"] = "jid", -- Bu
["বু-নাও বুনু"] = "bwx", -- Bu-Nao Bunu
["বুয়া"] = "bub", -- Bua
["বুয়ালখাও চিন"] = "cbl", -- Bualkhaw Chin
["বুয়ামু"] = "box", -- Buamu
["বুবে"] = "bvb", -- Bube
["বুবি"] = "buw", -- Bubi
["বুবিয়া"] = "bbx", -- Bubia
["বুদেহ স্টিয়েনগ"] = "stt", -- Budeh Stieng
["বুদিবুড"] = "btp", -- Budibud
["বুদোং-বুদোং"] = "bdx", -- Budong-Budong
["বুদু"] = "buu", -- Budu
["বুদুখ"] = "bdk", -- Budukh
["বুদুম্মা"] = "bdm", -- Buduma
["বুডজা"] = "bja", -- Budza
["বুয়েনা ভিস্তা ইয়োকুত্স"] = "yok-bvy", -- Buena Vista Yokuts
["বুগান"] = "bbh", -- Bugan
["বুঘোটু"] = "bgt", -- Bughotu
["বুগিনীস"] = "bug", -- Buginese
["বুগলেরে"] = "sab", -- Buglere
["বগুন"] = "bgg", -- Bugun
["বুহি'নন বিকোল"] = "ubl", -- Buhi'non Bikol
["বুহিদ"] = "bku", -- Buhid
["বুহুটু"] = "bxh", -- Buhutu
["বুজিয়াল"] = "byh", -- Bujhyal
["বুকার-সাদুং বিদায়ু"] = "sdo", -- Bukar-Sadung Bidayuh
["বুকাত"] = "bvk", -- Bukat
["বুকাওয়া"] = "buk", -- Bukawa
["বুখারী"] = "bhh", -- Bukhari
["বুকিত মালয়"] = "bvu", -- Bukit Malay
["বুকিতান"] = "bkn", -- Bukitan
["বুকিয়িপ"] = "ape", -- Bukiyip
["বুকসা"] = "tkb", -- Buksa
["বুকুস"] = "bxk", -- Bukusu
["বুলগার"] = "xbo", -- Bulgar
["বুলগেরীয়"] = "bg", -- Bulgarian
["বুলগেরীয় সাইন ল্যাঙ্গুয়েজ"] = "bqn", -- Bulgarian Sign Language
["বুলগেবি"] = "bmp", -- Bulgebi
["বুলি (ঘানা)"] = "bwu", -- Buli (Ghana)
["বুলি (ইন্দোনেশিয়া)"] = "bzq", -- Buli (Indonesia)
["বুলো স্টিয়েনগ"] = "sti", -- Bulo Stieng
["বুলু (ক্যামেরুন)"] = "bum", -- Bulu (Cameroon)
["বুলু (নিউ গিনি)"] = "bjl", -- Bulu (New Guinea)
["বুম"] = "bmv", -- Bum
["বুমাজি"] = "byp", -- Bumaji
["বুমং"] = "bvp", -- Bumang
["বুম্বিটা আরাপেশ"] = "aon", -- Bumbita Arapesh
["বুমথাংখা"] = "kjz", -- Bumthangkha
["বুন"] = "buv", -- Bun
["বুনা"] = "bvn", -- Buna
["বুনাবা"] = "bck", -- Bunaba
["বুনাক"] = "bfn", -- Bunak
["বুনামা"] = "bdd", -- Bunama
["বুন্দেলি"] = "bns", -- Bundeli
["বুং"] = "bqd", -- Bung
["বুংগাইন"] = "but", -- Bungain
["বুংগান্দিটজ"] = "xbg", -- Bunganditj
["বুংকু"] = "bkz", -- Bungku
["বুংগু"] = "wun", -- Bungu
["বুনোজে"] = "dgb", -- Bunoge
["বুনুন"] = "bnn", -- Bunun
["বুওল"] = "blf", -- Buol
["বুরা"] = "bwr", -- Bura
["বুরা মাবাং"] = "mde", -- Bura Mabang
["বুরাক"] = "bys", -- Burak
["বুরাকা"] = "bkg", -- Buraka
["বুরারা"] = "bvr", -- Burarra
["বুরাতে"] = "bti", -- Burate
["বুরদুনা"] = "bxn", -- Burduna
["বুরে"] = "bvh", -- Bure
["বার্গুন্দিয়ান"] = "gme-bur", -- Burgundian
["বুর্জি"] = "bji", -- Burji
["বুরম্বার"] = "vrt", -- Burmbar
["বর্মী"] = "my", -- Burmese
["বুরমেসো"] = "bzu", -- Burmeso
["বুরু (ইন্দোনেশিয়া)"] = "mhs", -- Buru (Indonesia)
["বুরু (নাইজেরিয়া)"] = "bqw", -- Buru (Nigeria)
["বুরুই"] = "bry", -- Burui
["বুরুমাকোক"] = "aip", -- Burumakok
["বুরুন"] = "bdi", -- Burun
["বুরুঞ্জে"] = "bds", -- Burunge
["বুরুশস্কি"] = "bsk", -- Burushaski
["বুরুসু"] = "bqr", -- Burusu
["বুরুয়াই"] = "asi", -- Buruwai
["বুরিয়াত"] = "bua", -- Buryat
["বুসা"] = "bqp", -- Busa
["বুসাম"] = "bxs", -- Busam
["বুসামি"] = "bsm", -- Busami
["বুসাং কায়ান"] = "bfg", -- Busang Kayan
["বুশুন"] = "buf", -- Bushoong
["বুসো"] = "bso", -- Buso
["বুসোয়া"] = "bup", -- Busoa
["বুসা"] = "dox", -- Bussa
["বুসুউ"] = "bju", -- Busuu
["বুটবুট কালিংগা"] = "kyb", -- Butbut Kalinga
["বাটচুলা"] = "xby", -- Butchulla
["বুটমাস-তুর"] = "bnr", -- Butmas-Tur
["বুতুয়ানোন"] = "btw", -- Butuanon
["বুওয়াল"] = "bhs", -- Buwal
["বুয়েও"] = "xpy", -- Buyeo
["বুয়ু"] = "byi", -- Buyu
["বুয়ুয়ান জিনো"] = "jiy", -- Buyuan Jino
["বওয়া"] = "bww", -- Bwa
["বওয়াইদোকা"] = "bwd", -- Bwaidoka
["বওয়ালা"] = "bnt-bwa", -- Bwala
["বওয়ানাবওয়ানা"] = "tte", -- Bwanabwana
["বওয়াতু"] = "bwa", -- Bwatoo
["বওয়ে কারেন"] = "bwe", -- Bwe Karen
["বওয়েলা"] = "bwl", -- Bwela
["বুইলে"] = "bwc", -- Bwile
["বুইসি"] = "bwz", -- Bwisi
["বিয়াংসি"] = "bee", -- Byangsi
["বিয়াপ"] = "mkk", -- Byep
["বাদি কানুম"] = "khd", -- Bädi Kanum
["কাআক"] = "msq", -- Caac
["ক্যাবিয়ারি"] = "cbb", -- Cabiyarí
["ক্যাবরে"] = "awd-cab", -- Cabre
["কাবেকার"] = "cjp", -- Cabécar
["কাকালক্সটেপেক মিক্সটেক"] = "miu", -- Cacaloxtepec Mixtec
["কাকাপেরা"] = "ccr", -- Cacaopera
["কাচগিয়া রোগলাই"] = "roc", -- Cacgia Roglai
["কাকুয়া"] = "cbv", -- Cacua
["ক্যাকান"] = "sai-cac", -- Cacán
["ক্যাডডো"] = "cad", -- Caddo
["ক্যাফুনডো"] = "ccd", -- Cafundó
["কাহুয়ারাণো"] = "cah", -- Cahuarano
["কাহুইলা"] = "chl", -- Cahuilla
["কাইজিয়া"] = "sit-cai", -- Caijia
["কাজনস জাপোটেক"] = "zad", -- Cajonos Zapotec
["চাকা"] = "ckx", -- Caka
["চাকফেম-মুশেরে"] = "cky", -- Cakfem-Mushere
["ক্যালাব্রিয়ান গ্রিক"] = "grk-cal", -- Calabrian Greek
["ক্যালামিয়ান তাগবানওয়া"] = "tbk", -- Calamian Tagbanwa
["কালুসা"] = "nai-cal", -- Calusa
["কালুয়ানু"] = "clu", -- Caluyanun
["কালো"] = "rmq", -- Caló
["ক্যা মেরিনেস নর্তে আগটা"] = "abd", -- Camarines Norte Agta
["ক্যামেরুন মাম্বিলা"] = "mcu", -- Cameroon Mambila
["ক্যামেরুন পিডগিন"] = "wes", -- Cameroon Pidgin
["কামপালগিয়ান"] = "cml", -- Campalagian
["কামসা"] = "kbh", -- Camsá
["কাম্থো"] = "cmt", -- Camtho
["কামুনিক"] = "xcc", -- Camunic
["কান্দোশি-শাপরা"] = "cbu", -- Candoshi-Shapra
["কানেলা"] = "ram", -- Canela
["কানিচানা"] = "caz", -- Canichana
["ক্যান্টাব্রিয়ান"] = "roa-can", -- Cantabrian
["ক্যান্টনিজ"] = "yue", -- Cantonese
["কাও মিয়াও"] = "cov", -- Cao Miao
["কাওলান"] = "mlc", -- Caolan
["কাপানাহুয়া"] = "kaq", -- Capanahua
["কাপিজোণ"] = "cps", -- Capiznon
["ক্যাপাডোসিয়ান গ্রিক"] = "cpg", -- Cappadocian Greek
["কাকুইনতে"] = "cot", -- Caquinte
["কার নিকোবারেসে"] = "caq", -- Car Nicobarese
["কারা"] = "cfd", -- Cara
["কারাবায়ো"] = "cby", -- Carabayo
["কারামান্তা"] = "crf", -- Caramanta
["কারানকি"] = "sai-caq", -- Caranqui
["কারাপানা"] = "cbc", -- Carapana
["কারিয়ান"] = "xcr", -- Carian
["কারিয়ায়ে"] = "awd-kar", -- Cariay
["ক্যারিবিয়ান হিন্দুস্থানি"] = "hns", -- Caribbean Hindustani
["ক্যারিবিয়ান জাভানিস"] = "jvn", -- Caribbean Javanese
["কারিজোনা"] = "cbd", -- Carijona
["ক্যারোলিনা আলগনকুইয়ান"] = "crr", -- Carolina Algonquian
["ক্যারোলিনিয়ান"] = "cal", -- Carolinian
["কার্পাথিয়ান রোমানি"] = "rmc", -- Carpathian Romani
["কার্পাথিয়ান রুসাইন"] = "rue", -- Carpathian Rusyn
["ক্যারিয়ার"] = "crx", -- Carrier
["কাশিবো-ক্যাকাতাইব"] = "cbr", -- Cashibo-Cacataibo
["কাশিনাহুয়া"] = "cbs", -- Cashinahua
["কাসিগুরান দুমাগাত আগটা"] = "dgc", -- Casiguran Dumagat Agta
["কাসুয়ারিনা কোস্ট আসমাত"] = "asc", -- Casuarina Coast Asmat
["ক্যাটাকাও"] = "sai-cat", -- Catacao
["কাতালান"] = "ca", -- Catalan
["কাতালান সাইন ল্যাঙ্গুয়েজ"] = "csc", -- Catalan Sign Language
["কাটাওবা"] = "chc", -- Catawba
["কাটুকুইনারু"] = "sai-ctq", -- Catuquinaru
["কাতিও চিবা"] = "cba-cat", -- Catío Chibcha
["কাউকা"] = "cca", -- Cauca
["কাভিনিঞা"] = "cav", -- Cavineña
["কাইউবাবা"] = "cyb", -- Cayubaba
["কাইউগা"] = "cay", -- Cayuga
["কাইউস"] = "xcy", -- Cayuse
["ক্যাজকান"] = "azc-caz", -- Cazcan
["কানারি"] = "sai-cnr", -- Cañari
["সেবিয়ারা সেনুফো"] = "sef", -- Cebaara Senoufo
["সেবুয়ানো"] = "ceb", -- Cebuano
["সেলটিবেরিয়ান"] = "xce", -- Celtiberian
["সেন"] = "cen", -- Cen
["সেন্ট্রাল আসমাত"] = "cns", -- Central Asmat
["সেন্ট্রাল অ্যাটলাস তামালাইট"] = "tzm", -- Central Atlas Tamazight
["সেন্ট্রাল আওয়ু"] = "awu", -- Central Awyu
["সেন্ট্রাল বাই"] = "bca", -- Central Bai
["সেন্ট্রাল বনটোক"] = "lbk", -- Central Bontoc
["সেন্ট্রাল কাগায়ান আগটা"] = "agt", -- Central Cagayan Agta
["সেন্ট্রাল দুসুন"] = "dtp", -- Central Dusun
["সেন্ট্রাল ফ্রাঙ্কোনিয়ান"] = "gmw-cfr", -- Central Franconian
["সেন্ট্রাল গ্রেবো"] = "grv", -- Central Grebo
["সেন্ট্রাল হুয়াসটেকা নাহুয়াতল"] = "nch", -- Central Huasteca Nahuatl
["সেন্ট্রাল হুইশুই হুমং"] = "hmc", -- Central Huishui Hmong
["সেন্ট্রাল কুর্দিশ"] = "ckb", -- Central Kurdish
["সেন্ট্রাল মাহুয়াতলান জাপোটেকো"] = "zam", -- Central Mahuatlán Zapoteco
["সেন্ট্রাল মালয়"] = "pse", -- Central Malay
["সেন্ট্রাল মানসি"] = "mns-cen", -- Central Mansi
["সেন্ট্রাল মাসেলা"] = "mxz", -- Central Masela
["সেন্ট্রাল মাশান হুমং"] = "hmm", -- Central Mashan Hmong
["সেন্ট্রাল মাজাহুয়া"] = "maz", -- Central Mazahua
["সেন্ট্রাল মেলানাও"] = "mel", -- Central Melanau
["সেন্ট্রাল মিন"] = "czo", -- Central Min
["সেন্ট্রাল মনং"] = "cmo", -- Central Mnong
["সেন্ট্রাল নাহুয়াতল"] = "nhn", -- Central Nahuatl
["সেন্ট্রাল নিকোবারেসে"] = "ncb", -- Central Nicobarese
["সেন্ট্রাল ওজিবওয়া"] = "ojc", -- Central Ojibwa
["সেন্ট্রাল পালাওয়ানো"] = "plc", -- Central Palawano
["সেন্ট্রাল পামে"] = "pbs", -- Central Pame
["সেন্ট্রাল পোমো"] = "poo", -- Central Pomo
["সেন্ট্রাল পুয়েব্লা নাহুয়াতল"] = "ncx", -- Central Puebla Nahuatl
["সেন্ট্রাল সামা"] = "sml", -- Central Sama
["সেন্ট্রাল সাইবেরিয়ান ইয়ুপিক"] = "ess", -- Central Siberian Yupik
["সেন্ট্রাল সিয়েরা মিওক"] = "csm", -- Central Sierra Miwok
["সেন্ট্রাল সুবানেন"] = "syb", -- Central Subanen
["সেন্ট্রাল তাগবানওয়া"] = "tgt", -- Central Tagbanwa
["সেন্ট্রাল তারাহুমারা"] = "tar", -- Central Tarahumara
["সেন্ট্রাল টেকে"] = "nzu", -- Central Teke
["সেন্ট্রাল টুনেবো"] = "tuf", -- Central Tunebo
["সেন্টুউম"] = "cet", -- Centúúm
["সার্মা"] = "cme", -- Cerma
["চ'ওলতি'"] = "myn-chl", -- Ch'olti'
["চ'ওরতি'"] = "caa", -- Ch'orti'
["চাপ উউরং"] = "tjw", -- Chaap Wuurong
["চাচি"] = "cbi", -- Chachi
["চাদিয়ান আরবি"] = "shu", -- Chadian Arabic
["চাদিয়ান সাইন ল্যাঙ্গুয়েজ"] = "cds", -- Chadian Sign Language
["চাডং"] = "cdy", -- Chadong
["চাগাতাই"] = "chg", -- Chagatai
["চাহা"] = "sem-cha", -- Chaha
["চাইমা"] = "ciy", -- Chaima
["চায়রেল"] = "sit-cha", -- Chairel
["চাক"] = "ckh", -- Chak
["চাকালি"] = "cli", -- Chakali
["চাকমা"] = "ccp", -- Chakma
["চালা"] = "cll", -- Chala
["চালডিয়ান নিও-আরামাইক"] = "cld", -- Chaldean Neo-Aramaic
["চালি"] = "tgf", -- Chali
["চামাকোকো"] = "ceg", -- Chamacoco
["চামালান"] = "cji", -- Chamalal
["চাম্বা ডাকা"] = "ccg", -- Chamba Daka
["চাম্বা লেকো"] = "ndi", -- Chamba Leko
["চাম্বিয়ালি"] = "cdh", -- Chambeali
["চাম্ব্রি"] = "can", -- Chambri
["চামিকুরো"] = "ccc", -- Chamicuro
["চামলিং"] = "rab", -- Chamling
["চামোরো"] = "ch", -- Chamorro
["চাম্পেনোই"] = "roa-cha", -- Champenois
["চাং"] = "nbc", -- Chang
["চাংগ্রিওয়া"] = "cga", -- Changriwa
["চাংথাং"] = "cna", -- Changthang
["চান্টিয়াল"] = "chx", -- Chantyal
["চানা"] = "sai-chn", -- Chaná
["চানে"] = "caj", -- Chané
["চাপাকুরা"] = "sai-chp", -- Chapacura
["চারা"] = "cra", -- Chara
["চারুয়া"] = "sai-chr", -- Charrua
["চাউদাংসি"] = "cdn", -- Chaudangsi
["চাউরা"] = "crv", -- Chaura
["চাভাকানো"] = "cbk", -- Chavacano
["চায়াহুইটা"] = "cbt", -- Chayahuita
["চায়ুকো মিক্সটেক"] = "mih", -- Chayuco Mixtec
["চাজুম্বা মিক্সটেক"] = "xtb", -- Chazumba Mixtec
["চে"] = "ruk", -- Che
["চেচেন"] = "ce", -- Chechen
["চেক হলো"] = "mrn", -- Cheke Holo
["চে মাকুম"] = "xch", -- Chemakum
["চেনাপিয়ান"] = "cjn", -- Chenapian
["চেনচু"] = "cde", -- Chenchu
["চেনউয়া"] = "cnu", -- Chenoua
["চেপাং"] = "cdm", -- Chepang
["চেপিয়া"] = "ycp", -- Chepya
["চেরেপোন"] = "cpn", -- Cherepon
["চেরোকি"] = "chr", -- Cherokee
["চেসু"] = "ych", -- Chesu
["চেটকোকো-তোলোওয়া"] = "ctc", -- Chetco-Tolowa
["চেওং"] = "cwg", -- Chewong
["চেয়েন"] = "chy", -- Cheyenne
["ছত্তিশগঢ়ী"] = "hne", -- Chhattisgarhi
["ছিন্তানগে"] = "ctn", -- Chhintange
["ছুলুং"] = "cur", -- Chhulung
["চিয়াংমাই সাইন ল্যাঙ্গুয়েজ"] = "csd", -- Chiangmai Sign Language
["চিয়াপানেক"] = "cip", -- Chiapanec
["চিবচা"] = "chb", -- Chibcha
["চিকাহুয়াxtla ত্রিqui"] = "trs", -- Chicahuaxtla Triqui
["চিচেওয়া"] = "ny", -- Chichewa
["চিচিকাপান জাপোটেক"] = "zpv", -- Chichicapan Zapotec
["চিচিমেকা-জোনাজ"] = "pei", -- Chichimeca-Jonaz
["চিচোনি-চিডজিহানা-চিকাউমা"] = "coh", -- Chichonyi-Chidzihana-Chikauma
["চিকাসাও"] = "cic", -- Chickasaw
["চিকোমুসেলটেক"] = "cob", -- Chicomuceltec
["চিদুরুম্মা"] = "dug", -- Chiduruma
["চিগমেকাটিটলান মিক্সটেক"] = "mii", -- Chigmecatitlán Mixtec
["চিলকোটিন"] = "clc", -- Chilcotin
["চিলিয়ান সাইন ল্যাঙ্গুয়েজ"] = "csg", -- Chilean Sign Language
["চিলিসো"] = "clh", -- Chilisso
["চিলতেপেক চিনান্টেক"] = "csa", -- Chiltepec Chinantec
["চিমালপা জোক"] = "zoh", -- Chimalapa Zoque
["চিমারিকো"] = "cid", -- Chimariko
["চিমিলার"] = "cbg", -- Chimila
["চিমউইনি"] = "bnt-cmw", -- Chimwiini
["চিনালী"] = "cih", -- Chinali
["চিনবন চিন"] = "cnb", -- Chinbon Chin
["চীনা"] = "zh", -- Chinese
["চীনা পিডগিন ইংরেজি"] = "cpi", -- Chinese Pidgin English
["চীনা সাইন ল্যাঙ্গুয়েজ"] = "csl", -- Chinese Sign Language
["চিনুক"] = "chh", -- Chinook
["চিনুক জারগন"] = "chn", -- Chinook Jargon
["চিপায়া"] = "cap", -- Chipaya
["চিপেওয়ান"] = "chp", -- Chipewyan
["চিকুইহুইট্লান মাজাতেক"] = "maq", -- Chiquihuitlán Mazatec
["চিকুইমুলিল্লা"] = "nai-chi", -- Chiquimulilla
["চিকুইতানো"] = "cax", -- Chiquitano
["চিরিকাহুয়া"] = "apm", -- Chiricahua
["চিরিনো"] = "sai-chi", -- Chirino
["চিরিপা"] = "nhd", -- Chiripá
["চিরু"] = "cdf", -- Chiru
["চিতিমচা"] = "ctm", -- Chitimacha
["চিতকুলী কিন্নৌরি"] = "cik", -- Chitkuli Kinnauri
["চট্টগ্রামীয়"] = "ctg", -- Chittagonian
["চিতওয়ানিয়া থারু"] = "the", -- Chitwania Tharu
["চিওয়ারি"] = "iow", -- Chiwere
["চোয়াপান জাপোটেক"] = "zpc", -- Choapan Zapotec
["চোচাঙ্গাকা"] = "cgk", -- Chocangaca
["চোচোতেক"] = "coz", -- Chochotec
["চোকতাও"] = "cho", -- Choctaw
["চোড্রি"] = "cdi", -- Chodri
["চোক্রি নাগ"] = "nri", -- Chokri Naga
["চোকওয়ে"] = "cjk", -- Chokwe
["চোলে"] = "ctu", -- Chol
["চোলন"] = "cht", -- Cholón
["চং"] = "cog", -- Chong
["চোনী"] = "cda", -- Choni
["চোনো"] = "sai-cno", -- Chono
["চোপি"] = "cce", -- Chopi
["চোতে নাগ"] = "nct", -- Chothe Naga
["চ্রাউ"] = "crw", -- Chrau
["চ্রু"] = "cje", -- Chru
["চুয়াবো"] = "chw", -- Chuabo
["চুয়ানচিয়ানডিয়ান ক্লাস্টার মিয়াও"] = "cqd", -- Chuanqiandian Cluster Miao
["চুয়াভে"] = "cjv", -- Chuave
["চুগ"] = "cvg", -- Chug
["চুয"] = "cac", -- Chuj
["চুকা"] = "cuh", -- Chuka
["চুকচি"] = "ckt", -- Chukchi
["চুকওয়া"] = "cuw", -- Chukwa
["চুলিম"] = "clw", -- Chulym
["চুম্বুরুং"] = "ncu", -- Chumburung
["চুরহী"] = "cdj", -- Churahi
["চার্চ স্লাভোনিক"] = "zls-chs", -- Church Slavonic
["চুরুইয়া"] = "sai-chu", -- Churuya
["চুত"] = "scb", -- Chut
["চুকিসে"] = "chk", -- Chuukese
["চুভান"] = "xcv", -- Chuvan
["চুভাশ"] = "cv", -- Chuvash
["চ্যাকোবো"] = "cao", -- Chácobo
["চি গ্বে"] = "cib", -- Ci Gbe
["চিয়া-চিয়া"] = "cia", -- Cia-Cia
["চিবা্ক"] = "ckl", -- Cibak
["চিসিপু"] = "awc", -- Cicipu
["চিগুয়ায়ো"] = "nai-cig", -- Ciguayo
["সিমব্রিয়ান"] = "cim", -- Cimbrian
["চিনামিগুইন মানোবো"] = "mkx", -- Cinamiguin Manobo
["সিন্ডা-রেগি-তিয়াল"] = "cdr", -- Cinda-Regi-Tiyal
["সিনি"] = "cie", -- Cineni
["চিনতা লারগা"] = "cin", -- Cinta Larga
["চিশিংগিনি"] = "asg", -- Cishingini
["সিটাক"] = "txt", -- Citak
["সিওগাই"] = "tgd", -- Ciwogai
["ক্লাসিক্যাল গেলিক"] = "ghc", -- Classical Gaelic
["ক্লাসিক্যাল গুয়ারাণী"] = "gn-cls", -- Classical Guaraní
["ক্লাসিক্যাল মান্ডাইক"] = "myz", -- Classical Mandaic
["ক্লাসিক্যাল মঙ্গোলিয়ান"] = "cmg", -- Classical Mongolian
["ক্লাসিক্যাল নাহুয়াতল"] = "nci", -- Classical Nahuatl
["ক্লাসিক্যাল নেওয়ার"] = "nwc", -- Classical Newar
["ক্লাসিক্যাল কেচুয়া"] = "qwc", -- Classical Quechua
["ক্লাসিক্যাল সিরিয়াক"] = "syc", -- Classical Syriac
["ক্লাসিক্যাল তিব্বতি"] = "xct", -- Classical Tibetan
["কোয়াহুইলটেকো"] = "xcw", -- Coahuilteco
["কোস্ট মিওক"] = "csi", -- Coast Miwok
["কোস্টাল কাদাজান"] = "kzj", -- Coastal Kadazan
["কোস্টাল কোনজো"] = "kjc", -- Coastal Konjo
["কোয়াটেকাস আল্টাস জাপোটেক"] = "zca", -- Coatecas Altas Zapotec
["কোয়াটেপেক নাহুয়াতল"] = "naz", -- Coatepec Nahuatl
["কোয়াটলান মিক্সে"] = "mco", -- Coatlán Mixe
["কোয়াটলান জাপোটেক"] = "zps", -- Coatlán Zapotec
["কোয়াটজোসপান মিক্সটেক"] = "miz", -- Coatzospan Mixtec
["কোকামা"] = "cod", -- Cocama
["কোচিমি"] = "coj", -- Cochimi
["কোকোপা"] = "coc", -- Cocopa
["কোকোস আইল্যান্ডস মালয়"] = "coa", -- Cocos Islands Malay
["কোয়েরুনা"] = "sai-coe", -- Coeruna
["কুইয়ার ডি'আলেন"] = "crd", -- Coeur d'Alene
["কোফান"] = "con", -- Cofán
["কোগুই"] = "kog", -- Cogui
["কোল"] = "liw", -- Col
["কলম্বিয়ান সাইন ল্যাঙ্গুয়েজ"] = "csn", -- Colombian Sign Language
["কলোনিয়া তোভার জার্মান"] = "gct", -- Colonia Tovar German
["কলম্বিয়া-ওয়েনাচি"] = "col", -- Columbia-Wenatchi
["কোলান"] = "sai-col", -- Colán
["কোমালতেপেক চিনান্টেক"] = "cco", -- Comaltepec Chinantec
["কমানচে"] = "com", -- Comanche
["কোমেচিনগন"] = "sai-cmg", -- Comechingon
["কোমেক্রুডো"] = "xcm", -- Comecrudo
["কমিউনিকেশনসস্প্রাক"] = "art-com", -- Communicationssprache
["কোমো করিম"] = "cfg", -- Como Karim
["কোমোক্স"] = "coo", -- Comox
["কন"] = "cno", -- Con
["কুস"] = "csz", -- Coos
["কোপাইনাল জোক"] = "zoc", -- Copainalá Zoque
["কোপালা ত্রিqui"] = "trc", -- Copala Triqui
["কোপালেন"] = "sai-cop", -- Copallén
["কপ্টিক"] = "cop", -- Coptic
["কোquil"] = "coq", -- Coquille
["কোরা"] = "crn", -- Cora
["কোরি"] = "cry", -- Cori
["কর্নিশ"] = "kw", -- Cornish
["কোরোডো পুরি"] = "sai-crd", -- Coroado Puri
["কোর্সিকান"] = "co", -- Corsican
["কোসোলেয়াকাকে নাহুয়াতল"] = "nhk", -- Cosoleacaque Nahuatl
["কোস্টারিকান সাইন ল্যাঙ্গুয়েজ"] = "csr", -- Costa Rican Sign Language
["কোতাবাতো মানোবো"] = "mta", -- Cotabato Manobo
["কোটোনামে"] = "xcn", -- Cotoname
["কাউলিতজ"] = "cow", -- Cowlitz
["কোয়াইমা"] = "coy", -- Coyaima
["কয়োতেপেক পোপলোকা"] = "pbf", -- Coyotepec Popoloca
["কয়ুতলা তোতোনাক"] = "toc", -- Coyutla Totonac
["ক্রি"] = "cr", -- Cree
["ক্রিক"] = "mus", -- Creek
["ক্রিমিয়ান গথিক"] = "gme-cgo", -- Crimean Gothic
["ক্রিমিয়ান তাতার"] = "crh", -- Crimean Tatar
["ক্রোয়েশিয়ান সাইন ল্যাঙ্গুয়েজ"] = "csq", -- Croatian Sign Language
["ক্রস রিভার মেম্বে"] = "mfn", -- Cross River Mbembe
["ক্রো"] = "cro", -- Crow
["ক্রুজেño"] = "crz", -- Cruzeño
["কুয়া"] = "cua", -- Cua
["কিউবান সাইন ল্যাঙ্গুয়েজ"] = "csf", -- Cuban Sign Language
["কুবিয়েও"] = "cub", -- Cubeo
["কুইভা"] = "sai-cva", -- Cueva
["কুইত্লাতেক"] = "cuy", -- Cuitlatec
["কুলিনা"] = "cul", -- Culina
["কুল্লি"] = "sai-cul", -- Culli
["কুনানাগোটো"] = "cuo", -- Cumanagoto
["কুমব্রিক"] = "xcb", -- Cumbric
["কুন"] = "cuq", -- Cun
["কুং"] = "cug", -- Cung
["কুপেঞো"] = "cup", -- Cupeño
["কুরোনিয়ান"] = "xcu", -- Curonian
["কুর্রিপাকো"] = "kpc", -- Curripaco
["কাটচি-সোয়াহিলি"] = "ccl", -- Cutchi-Swahili
["কুভোক"] = "cuv", -- Cuvok
["কুয়ামেকালকো মিক্সটেক"] = "xtu", -- Cuyamecalco Mixtec
["কুয়ুনোন"] = "cyo", -- Cuyunon
["সুই বওয়ামু"] = "bwy", -- Cwi Bwamu
["সাইপ্রিয়ট আরবি"] = "acy", -- Cypriot Arabic
["চেক"] = "cs", -- Czech
["চেক সাইন ল্যাঙ্গুয়েজ"] = "cse", -- Czech Sign Language
["সেমূহি"] = "cam", -- Cèmuhî
["কুনোং"] = "cnc", -- Cốông
["দা'আ কাইলি"] = "kzf", -- Da'a Kaili
["দাই চিন"] = "dao", -- Daai Chin
["দাকাকা"] = "bpa", -- Daakaka
["দানতানাই'"] = "lni", -- Daantanai'
["দাবানাক"] = "dsh", -- Daasanach
["দাবা"] = "dbq", -- Daba
["দাবার্রে"] = "dbr", -- Dabarre
["দাবে"] = "dbe", -- Dabe
["ডাসিয়ান"] = "xdc", -- Dacian
["দাদানিতিক"] = "sem-dad", -- Dadanitic
["দাদি দাদি"] = "dda", -- Dadi Dadi
["দাদিবি"] = "mps", -- Dadibi
["দাদিয়া"] = "dbd", -- Dadiya
["ডাগা"] = "dgz", -- Daga
["ডাগারি দিউলা"] = "dgd", -- Dagaari Dioula
["ডাগবা"] = "dgk", -- Dagba
["ডাগবানি"] = "dag", -- Dagbani
["ডাগিক"] = "dec", -- Dagik
["ডাগোমান"] = "dgn", -- Dagoman
["দাহালিক"] = "dlk", -- Dahalik
["দাহালো"] = "dal", -- Dahalo
["দাহো-দু"] = "das", -- Daho-Doo
["ডাই"] = "dij", -- Dai
["ডায়ার"] = "drb", -- Dair
["ডাইরি বাটাক"] = "btd", -- Dairi Batak
["ডাকা"] = "dkk", -- Dakka
["ডাকোটা"] = "dak", -- Dakota
["ডাকপা"] = "dka", -- Dakpa
["ডালমাশিয়ান"] = "dlm", -- Dalmatian
["ডালুয়া বেটে"] = "bev", -- Daloa Bété
["ডামা (নাইজেরিয়া)"] = "dmm", -- Dama (Nigeria)
["ডামা (সিয়েরা লিওন)"] = "dmn-dam", -- Dama (Sierra Leone)
["ডামাকাওয়া"] = "dam", -- Damakawa
["ডামাল"] = "uhn", -- Damal
["ডাম্বি"] = "dac", -- Dambi
["ডামেলি"] = "dml", -- Dameli
["ড্যাম্পেলাস"] = "dms", -- Dampelas
["দান"] = "dnj", -- Dan
["দানারু"] = "dnr", -- Danaru
["দানউ"] = "dnu", -- Danau
["দান্দামি মারিয়া"] = "daq", -- Dandami Maria
["দাংগালেয়াত"] = "daa", -- Dangaléat
["দাংগাউরা থারু"] = "thl", -- Dangaura Tharu
["ডেনিশ"] = "da", -- Danish
["ডেনিশ সাইন ল্যাঙ্গুয়েজ"] = "dsl", -- Danish Sign Language
["ডানো"] = "aso", -- Dano
["দানু"] = "dnv", -- Danu
["দানুওয়ার"] = "dhw", -- Danuwar
["ডাও"] = "daz", -- Dao
["দাওন্ডা"] = "dnd", -- Daonda
["দার দাজু দাজু"] = "djc", -- Dar Daju Daju
["দার ফুর দাজু"] = "daj", -- Dar Fur Daju
["দার সিলা দাজু"] = "dau", -- Dar Sila Daju
["দারাই"] = "dry", -- Darai
["ডার্গওয়া"] = "dar", -- Dargwa
["ডার্কিনজুং"] = "xda", -- Darkinjung
["ডারলং"] = "dln", -- Darlong
["দারমিয়া"] = "drd", -- Darmiya
["ডারো-মাতু মেলানাও"] = "dro", -- Daro-Matu Melanau
["ডারুম্বাল"] = "xgm", -- Darumbal
["ডাস"] = "dot", -- Dass
["ডাটিয়ান মিন"] = "nan-dat", -- Datian Min
["দাতুয়াগা"] = "tcc", -- Datooga
["দাউংউরুং"] = "dgw", -- Daungwurrung
["ডাউর"] = "dta", -- Daur
["দাভাবেনিয়ো"] = "daw", -- Davawenyo
["দাওয়াওয়া"] = "dww", -- Dawawa
["দাভেরা-দাভেলুর"] = "ddw", -- Dawera-Daweloor
["দাউরো"] = "dwr", -- Dawro
["ডে"] = "dai", -- Day
["দায়ি"] = "dax", -- Dayi
["দাজাগা"] = "dzg", -- Dazaga
["দেকানি"] = "dcc", -- Deccani
["দেদুয়া"] = "ded", -- Dedua
["দেফাকা"] = "afn", -- Defaka
["দেফি গ্বে"] = "gbh", -- Defi Gbe
["ডেগ"] = "mzw", -- Deg
["ডেগ জিনাগ"] = "ing", -- Deg Xinag
["দেগেমা"] = "deg", -- Degema
["দেগেনান"] = "dge", -- Degenan
["দেহোয়ারি"] = "deh", -- Dehwari
["ডেক"] = "dek", -- Dek
["ডেলা-ওয়েনাল"] = "row", -- Dela-Oenale
["ডেলো"] = "ntr", -- Delo
["ডেল্টা ইয়োকুত্স"] = "yok-dly", -- Delta Yokuts
["ডেম"] = "dem", -- Dem
["ডেমা"] = "dmx", -- Dema
["দেমিশা"] = "dei", -- Demisa
["ডেমোটিক"] = "egx-dem", -- Demotic
["ডেমতা"] = "dmy", -- Demta
["দেনাইনা"] = "tfn", -- Dena'ina
["দেন্দি"] = "ddn", -- Dendi
["দেনগেসে"] = "dez", -- Dengese
["দেংকা"] = "dnk", -- Dengka
["ডেনো"] = "dbb", -- Deno
["দেনিয়া"] = "anv", -- Denya
["দেনী"] = "dny", -- Dení
["দেওরি"] = "der", -- Deori
["দেসানো"] = "des", -- Desano
["দেসিয়া"] = "dso", -- Desiya
["দেওয়াস রায়"] = "dwz", -- Dewas Rai
["দেউইন"] = "dee", -- Dewoin
["দেজফুলি"] = "def", -- Dezfuli
["ডঘউডে"] = "dgh", -- Dghwede
["ধাইসো"] = "dhs", -- Dhaiso
["ঢালানজি"] = "dhl", -- Dhalandji
["ধাঙ্গু"] = "dhg", -- Dhangu
["ধাঙ্কি"] = "dhn", -- Dhanki
["ধাও"] = "nfa", -- Dhao
["ধারুগ"] = "xdk", -- Dharug
["ধাটকি"] = "mki", -- Dhatki
["ধিমাল"] = "dhi", -- Dhimal
["ধিভেহি"] = "dv", -- Dhivehi
["ধোডিয়া"] = "dho", -- Dhodia
["ধোফারি আরবি"] = "adf", -- Dhofari Arabic
["ধুধুরোয়া"] = "ddr", -- Dhudhuroa
["ধুনডারি"] = "dhd", -- Dhundhari
["ধুনগালো"] = "dhx", -- Dhungaloo
["ধুরগা"] = "dhu", -- Dhurga
["ধুওয়াল"] = "dwu", -- Dhuwal
["ধুওয়ায়া"] = "dwy", -- Dhuwaya
["ডিয়া"] = "dia", -- Dia
["দিবাবাওন মানোবো"] = "mbd", -- Dibabawon Manobo
["দিবিয়াসো"] = "dby", -- Dibiyaso
["দিবো"] = "dio", -- Dibo
["ডিকামায় আগটা"] = "duy", -- Dicamay Agta
["ডিডিঙ্গা"] = "did", -- Didinga
["ডিয়েরি"] = "dif", -- Dieri
["ডিগো"] = "dig", -- Digo
["ডিই"] = "dur", -- Dii
["ডিজিম-বুইলিম"] = "cfa", -- Dijim-Bwilim
["ডিলিং"] = "dil", -- Dilling
["ডিমা"] = "jma", -- Dima
["দিমাসা"] = "dis", -- Dimasa
["ডিম্বং"] = "dii", -- Dimbong
["ডাইম"] = "dim", -- Dime
["দিনাপিগুই আগটা"] = "phi-din", -- Dinapigue Agta
["দিনিয়র"] = "mrx", -- Dineor
["ডিং"] = "diz", -- Ding
["ডিঙ্কা"] = "din", -- Dinka
["ডিওডিও"] = "ddi", -- Diodio
["দিরাশা"] = "gdl", -- Dirasha
["দিরি"] = "dwa", -- Diri
["দিরিম"] = "dir", -- Dirim
["ডিসা"] = "dsi", -- Disa
["দিতাম্মারি"] = "tbz", -- Ditammari
["ডিটিডাহট"] = "dtd", -- Ditidaht
["ডিইউয়ে"] = "diy", -- Diuwe
["ডিয়াক্সি-টিলানটংগো মিক্সটেক"] = "xtd", -- Diuxi-Tilantongo Mixtec
["ডিকসন রিফ"] = "dix", -- Dixon Reef
["ডিজিন"] = "mdx", -- Dizin
["ডিজাদজাওয়ারুং"] = "dja", -- Djadjawurrung
["ডজাম্বার্রপুইংগু"] = "djr", -- Djambarrpuyngu
["ডজানগুন"] = "djf", -- Djangun
["ডজাওয়ান"] = "djn", -- Djauan
["ডজাবি"] = "djw", -- Djawi
["ডজিমিনি"] = "dyi", -- Djimini
["ডজিন্যাং"] = "dji", -- Djinang
["ডজিনবা"] = "djb", -- Djinba
["ডজিয়ালি"] = "djl", -- Djiwarli
["ডোবেল"] = "kvo", -- Dobel
["ডোবু"] = "dob", -- Dobu
["ডো"] = "doe", -- Doe
["ডোগা"] = "dgg", -- Doga
["ডোগোরো"] = "dgx", -- Doghoro
["ডোগোসো"] = "dgs", -- Dogoso
["ডোগোসে"] = "dos", -- Dogosé
["ডোগরি"] = "doi", -- Dogri
["ডোগরিব"] = "dgr", -- Dogrib
["ডোগুল ডোম"] = "dbg", -- Dogul Dom
["ডোকা"] = "dbi", -- Doka
["ডোকো-উয়াঙ্গা"] = "uya", -- Doko-Uyanga
["ডলগান"] = "dlg", -- Dolgan
["ডোম"] = "doa", -- Dom
["দোমাকি"] = "dmk", -- Domaaki
["দোমারি"] = "rmt", -- Domari
["ডোমিনিকান সাইন ল্যাঙ্গুয়েজ"] = "doq", -- Dominican Sign Language
["ডম্পো"] = "doy", -- Dompo
["ডমু"] = "dof", -- Domu
["ডমুং"] = "dev", -- Domung
["ডন্ডো"] = "dok", -- Dondo
["ডং"] = "doh", -- Dong
["ডোংগো"] = "doo", -- Dongo
["ডোংগোলাভি"] = "kzh", -- Dongolawi
["ডোংগোটোনো"] = "ddd", -- Dongotono
["ডোংশানবা লালো"] = "yik", -- Dongshanba Lalo
["ডোংজিয়াং"] = "sce", -- Dongxiang
["ডোনো সো ডোগন"] = "dds", -- Donno So Dogon
["ডোন্ডো"] = "dde", -- Doondo
["ডোরাস্কে"] = "cba-dor", -- Dorasque
["ডোরি'ও"] = "dor", -- Dori'o
["ডরিগ"] = "wwo", -- Dorig
["ডোরোমূ-কোকি"] = "kqc", -- Doromu-Koki
["ডোরজে"] = "doz", -- Dorze
["ডোসো"] = "dol", -- Doso
["ডোটেলি"] = "dty", -- Doteli
["ডোথ্রাকি"] = "art-dtk", -- Dothraki
["ডৌরা"] = "don", -- Doura
["ডাউতাই"] = "tds", -- Doutai
["ডয়ায়ো"] = "dow", -- Doyayo
["ড্রেহু"] = "dhv", -- Drehu
["ড্রুং"] = "duu", -- Drung
["ডুয়ালা"] = "dua", -- Duala
["ডুয়ানো"] = "dup", -- Duano
["ডুয়াউ"] = "dva", -- Duau
["ডুবলি"] = "dub", -- Dubli
["ডুবু"] = "dmu", -- Dubu
["ডুগুন"] = "ndu", -- Dugun
["ডুগুরি"] = "dbm", -- Duguri
["ডুগওয়ার"] = "dme", -- Dugwor
["ডুহওয়া"] = "kbz", -- Duhwa
["ডুইট"] = "cba-dui", -- Duit
["ডিউক"] = "nke", -- Duke
["ডুকহান"] = "trk-dkh", -- Dukhan
["ডুলবু"] = "dbo", -- Dulbu
["ডুলি"] = "duz", -- Duli
["ডুমা"] = "dma", -- Duma
["ডুমাইটিক"] = "sem-dum", -- Dumaitic
["ডুম্বেয়া"] = "duf", -- Dumbea
["ডুমি"] = "dus", -- Dumi
["ডাম্পাস"] = "dmv", -- Dumpas
["ডুমুন"] = "dui", -- Dumun
["ডুনা"] = "duc", -- Duna
["ডুনগান"] = "dng", -- Dungan
["ডুংমালি"] = "raa", -- Dungmali
["ডুংগ্রা ভিল"] = "duh", -- Dungra Bhil
["ডুংগু"] = "dbv", -- Dungu
["ডুপানিনগান আগটা"] = "duo", -- Dupaningan Agta
["ডুরা"] = "drq", -- Dura
["দুরি"] = "mvp", -- Duri
["ডুরিয়ানকেরে"] = "dbn", -- Duriankere
["ডুরুওয়া"] = "pci", -- Duruwa
["ডুসনার"] = "dsn", -- Dusner
["ডুসুন ডেয়াহ"] = "dun", -- Dusun Deyah
["ডুসুন মাালাং"] = "duq", -- Dusun Malang
["ডুসুন উইতু"] = "duw", -- Dusun Witu
["ডাচ"] = "nl", -- Dutch
["ডাচ লো স্যাক্সন"] = "nds-nl", -- Dutch Low Saxon
["ডাচ সাইন ল্যাঙ্গুয়েজ"] = "dse", -- Dutch Sign Language
["ডুন"] = "dux", -- Duun
["ডুপা"] = "dae", -- Duupa
["ডুভলে"] = "duv", -- Duvle
["ডুয়াই"] = "dbp", -- Duwai
["ডুয়েট"] = "gve", -- Duwet
["ডোয়াং"] = "nnu", -- Dwang
["ডায়াবুগায়"] = "dyy", -- Dyaabugay
["ডায়াবার্ডিয়াবের"] = "dyb", -- Dyaberdyaber
["ডায়ান"] = "dya", -- Dyan
["ডায়ানগাদি"] = "dyn", -- Dyangadi
["ডিরবাল"] = "dbl", -- Dyirbal
["ডুয়ুগুন"] = "dyd", -- Dyugun
["ডুয়ুলা"] = "dyu", -- Dyula
["ডজা"] = "jen", -- Dza
["ডজালা"] = "dzl", -- Dzala
["ডজানডো"] = "dzn", -- Dzando
["ডজাও মিন"] = "bpn", -- Dzao Min
["ডজোডিঙ্কা"] = "add", -- Dzodinka
["ডজোংখা"] = "dz", -- Dzongkha
["ডজুন"] = "dnn", -- Dzuun
["ডাও"] = "kwa", -- Dâw
["ই"] = "eee", -- E
["ই'মা বুইয়াং"] = "yzg", -- E'ma Buyang
["আর্লি অসমীয়া"] = "inc-oas", -- Early Assamese
["আর্লি মডার্ন কোরিয়ান"] = "ko-ear", -- Early Modern Korean
["আর্লি প্রাচীন ওগহুজ"] = "trk-eog", -- Early Old Oghuz
["আর্লি ত্রিপুরি"] = "xtr", -- Early Tripuri
["পূর্ব সেন্ট্রাল জার্মান"] = "gmw-ecg", -- East Central German
["পূর্ব ডামার"] = "dmr", -- East Damar
["পূর্ব ফ্রাঙ্কোনিয়ান"] = "vmf", -- East Franconian
["পূর্ব ফুতুনা"] = "fud", -- East Futuna
["পূর্ব কেওয়া"] = "kjs", -- East Kewa
["পূর্ব লিম্বা"] = "lma", -- East Limba
["পূর্ব মাকিয়ান"] = "mky", -- East Makian
["পূর্ব মাসেলা"] = "vme", -- East Masela
["পূর্ব নিয়ারা"] = "nle", -- East Nyala
["পূর্ব তারাংগান"] = "tre", -- East Tarangan
["পূর্ব ইয়ুগুর"] = "yuy", -- East Yugur
["পূর্বী আসিipa"] = "acp", -- Eastern Acipa
["পূর্বী অ্যারের্নটে"] = "aer", -- Eastern Arrernte
["পূর্বী বলিভিয়ান গুয়ারাণী"] = "gui", -- Eastern Bolivian Guaraní
["পূর্বী বনটোক"] = "ebk", -- Eastern Bontoc
["পূর্বী ব্রু"] = "bru", -- Eastern Bru
["পূর্বী কানাডিয়ান ইনুকটিটুট"] = "ike", -- Eastern Canadian Inuktitut
["পূর্বী চাম"] = "cjm", -- Eastern Cham
["পূর্বী দুরানগো নাহুয়াতল"] = "azd", -- Eastern Durango Nahuatl
["পূর্বী গোর্খা তামং"] = "tge", -- Eastern Gorkha Tamang
["পূর্বী গুরুং"] = "ggn", -- Eastern Gurung
["পূর্বী হাইল্যান্ড চ্যাটিনো"] = "cly", -- Eastern Highland Chatino
["পূর্বী হাইল্যান্ড ওটোমি"] = "otm", -- Eastern Highland Otomi
["পূর্বী হুয়াসটেকা নাহুয়াতল"] = "nhe", -- Eastern Huasteca Nahuatl
["পূর্বী হুইশুই হুমং"] = "hme", -- Eastern Huishui Hmong
["পূর্বী কারাবোরো"] = "xrb", -- Eastern Karaboro
["পূর্বী কাটূ"] = "ktv", -- Eastern Katu
["পূর্বী কায়াহ"] = "eky", -- Eastern Kayah
["পূর্বী কেরেস"] = "kee", -- Eastern Keres
["পূর্বী খানটি"] = "kca-eas", -- Eastern Khanty
["পূর্বী ক্রান"] = "kqo", -- Eastern Krahn
["পূর্বী লালু"] = "yit", -- Eastern Lalu
["পূর্বী লাওয়া"] = "lwl", -- Eastern Lawa
["পূর্বী মাগার"] = "mgp", -- Eastern Magar
["পূর্বী মানিন্কাকান"] = "emk", -- Eastern Maninkakan
["পূর্বী মারি"] = "mhr", -- Eastern Mari
["পূর্বী মেওহাং"] = "emg", -- Eastern Meohang
["পূর্বী মিন"] = "cdo", -- Eastern Min
["পূর্বী মনং"] = "mng", -- Eastern Mnong
["পূর্বী মুরিয়া"] = "emu", -- Eastern Muria
["পূর্বী নগা'দা"] = "nea", -- Eastern Ngad'a
["পূর্বী নিসু"] = "nos", -- Eastern Nisu
["পূর্বী ওজিবওয়া"] = "ojg", -- Eastern Ojibwa
["পূর্বী পার্বাতে খাম"] = "kif", -- Eastern Parbate Kham
["পূর্বী পেনান"] = "pez", -- Eastern Penan
["পূর্বী পোমো"] = "peb", -- Eastern Pomo
["পূর্বী পিউও"] = "kjp", -- Eastern Pwo
["পূর্বী কিয়ানডং মিয়াও"] = "hmq", -- Eastern Qiandong Miao
["পূর্বী সুবানুন"] = "sfe", -- Eastern Subanun
["পূর্বী তামং"] = "taj", -- Eastern Tamang
["পূর্বী তাউবুইদ"] = "bnj", -- Eastern Tawbuid
["পূর্বী জিয়াংজি মিয়াও"] = "muq", -- Eastern Xiangxi Miao
["পূর্বী জউলা গ্বে"] = "gbx", -- Eastern Xwla Gbe
["এবিরা"] = "igb", -- Ebira
["ইবলাইত"] = "xeb", -- Eblaite
["ইব্রী"] = "ebr", -- Ebrié
["ইবূঘূ"] = "ebg", -- Ebughu
["ইকুয়েডরিয়ান সাইন ল্যাঙ্গুয়েজ"] = "ecs", -- Ecuadorian Sign Language
["এডে কাবা"] = "cbj", -- Ede Cabe
["এডে ইকা"] = "ica", -- Ede Ica
["এডে ইডাকা"] = "idd", -- Ede Idaca
["এডে ইজে"] = "ijj", -- Ede Ije
["এডে নাগো"] = "nqg", -- Ede Nago
["এদেরা আওয়ু"] = "awy", -- Edera Awyu
["এডো"] = "bin", -- Edo
["এডলো"] = "etr", -- Edolo
["এডোমাইট"] = "xdm", -- Edomite
["এডোpi"] = "dbf", -- Edopi
["এফাই"] = "efa", -- Efai
["এফে"] = "efe", -- Efe
["এফিক"] = "efi", -- Efik
["এফুটোপ"] = "ofu", -- Efutop
["এগা"] = "ega", -- Ega
["এগোন"] = "ego", -- Eggon
["মিশরীয়"] = "egy", -- Egyptian
["মিশরীয় আরবি"] = "arz", -- Egyptian Arabic
["মিশরীয় সাইন ল্যাঙ্গুয়েজ"] = "esl", -- Egyptian Sign Language
["এহুউন"] = "ehu", -- Ehueun
["আইপোমেক"] = "eip", -- Eipomek
["এইটিয়েপ"] = "eit", -- Eitiep
["এজাগহাম"] = "etu", -- Ejagham
["এজামাত"] = "eja", -- Ejamat
["একাজুক"] = "eka", -- Ekajuk
["একারি"] = "ekg", -- Ekari
["একলে"] = "khy", -- Ekele
["একী"] = "eki", -- Eki
["একিত"] = "eke", -- Ekit
["একপেয়ে"] = "ekp", -- Ekpeye
["এল আলতো জাপোটেক"] = "zpp", -- El Alto Zapotec
["এল হুগেইরাত"] = "elh", -- El Hugeirat
["এল মোলো"] = "elo", -- El Molo
["ইলামাইট"] = "elx", -- Elamite
["এলেমে"] = "elm", -- Eleme
["এলেপি"] = "ele", -- Elepi
["এলফডালিয়ান"] = "ovd", -- Elfdalian
["এলিপ"] = "ekm", -- Elip
["এলকেই"] = "elk", -- Elkei
["এলই"] = "art-elo", -- Eloi
["এলতেপেক জাপোটেক"] = "zte", -- Elotepec Zapotec
["এলওই"] = "afo", -- Eloyi
["এলসেং"] = "mrf", -- Elseng
["এলু"] = "elu", -- Elu
["এলিমিয়ান"] = "xly", -- Elymian
["এমায়ে"] = "mmw", -- Emae
["এমাি"] = "ema", -- Emai
["এমান"] = "emn", -- Eman
["এমবালো"] = "emb", -- Embaloh
["এম্বেরা-বাউডো"] = "bdc", -- Emberá-Baudó
["এম্বেরা-কাতিও"] = "cto", -- Emberá-Catío
["এম্বেরা-চামি"] = "cmi", -- Emberá-Chamí
["এম্বেরা-তাডো"] = "tdc", -- Emberá-Tadó
["এমবু"] = "ebu", -- Embu
["এমেম"] = "enr", -- Emem
["এমেরিলন"] = "eme", -- Emerillon
["এমিলিয়ান"] = "egl", -- Emilian
["এমপ্লাওয়াস"] = "emw", -- Emplawas
["এন"] = "enc", -- En
["এনাভেনে-নাওয়ে"] = "unk", -- Enawené-Nawé
["এন্ডে"] = "end", -- Ende
["এঙ্গা"] = "enq", -- Enga
["এনগেনি"] = "enn", -- Engenni
["এনগানো"] = "eno", -- Enggano
["ইংরেজি"] = "en", -- English
["এনলহেট"] = "enl", -- Enlhet
["এনরেকং"] = "ptt", -- Enrekang
["এনু"] = "enu", -- Enu
["এনওয়ান"] = "env", -- Enwan
["এনওয়াং"] = "enw", -- Enwang
["এনক্সেট"] = "enx", -- Enxet
["এনিয়া"] = "gey", -- Enya
["ইওটিল"] = "eot", -- Eotile
["এপেনা"] = "sja", -- Epena
["এপি-ওলমেক"] = "xep", -- Epi-Olmec
["এপিয়ে"] = "epi", -- Epie
["এপিগ্রাফিক মায়ান"] = "emy", -- Epigraphic Mayan
["এরাভাল্লান"] = "era", -- Eravallan
["এরাভে"] = "kjy", -- Erave
["এরে"] = "twp", -- Ere
["ইরি"] = "iro-ere", -- Erie
["এরিটাই"] = "ert", -- Eritai
["এরোকওয়ানাস"] = "erw", -- Erokwanas
["এর্রে"] = "err", -- Erre
["এর্রোমিন্সেলা"] = "emx", -- Erromintxela
["এরসু"] = "ers", -- Ersu
["এরুয়া"] = "erh", -- Eruwa
["এরজিয়া"] = "myv", -- Erzya
["এসান"] = "ish", -- Esan
["এসে"] = "mcq", -- Ese
["এসে ইজ্জা"] = "ese", -- Ese Ejja
["এসতেহার্ডি"] = "esh", -- Eshtehardi
["ইসিমি"] = "ags", -- Esimbi
["এসকায়ান"] = "esy", -- Eskayan
["এসমিরালডা"] = "sai-esm", -- Esmeralda
["এসপেরানটো"] = "eo", -- Esperanto
["এসেলেন"] = "esq", -- Esselen
["এস্তাদো দে মেক্সিকো ওটোমি"] = "ots", -- Estado de México Otomi
["এস্টোনিয়ান"] = "et", -- Estonian
["এস্টোনিয়ান সাইন ল্যাঙ্গুয়েজ"] = "eso", -- Estonian Sign Language
["এসুমা"] = "esm", -- Esuma
["এটকেমিন"] = "etc", -- Etchemin
["এটেবি"] = "etb", -- Etebi
["এটেন"] = "etx", -- Eten
["এটিওক্রেটান"] = "ecr", -- Eteocretan
["এটিওসাইপ্রিয়ট"] = "ecy", -- Eteocypriot
["ইথিওপিয়ান সাইন ল্যাঙ্গুয়েজ"] = "eth", -- Ethiopian Sign Language
["এট্কিওয়ান"] = "ich", -- Etkywan
["ইটন (ক্যামেরুন)"] = "eto", -- Eton (Cameroon)
["ইটন (ভানুয়াতু)"] = "etn", -- Eton (Vanuatu)
["ইট্রুস্কান"] = "ett", -- Etruscan
["ইটুলো"] = "utr", -- Etulo
["এভান্ট"] = "bzz", -- Evant
["ইভেন"] = "eve", -- Even
["ইভেনকি"] = "evn", -- Evenki
["ইওয়াগে-নোতু"] = "nou", -- Ewage-Notu
["ইওয়ারহুয়ানা"] = "sai-ewa", -- Ewarhuyana
["এভে"] = "ee", -- Ewe
["এওন্ডো"] = "ewo", -- Ewondo
["এক্সট্রেমাডুরান"] = "ext", -- Extremaduran
["ইয়াক"] = "eya", -- Eyak
["ইজা"] = "eza", -- Ezaa
["ফাগানি"] = "faf", -- Fagani
["ফায়ার আটা"] = "azt", -- Faire Atta
["ফাইটা"] = "faj", -- Faita
["ফাইওল"] = "fai", -- Faiwol
["ফাক্কান্সি"] = "gel", -- Fakkanci
["ফালা"] = "fax", -- Fala
["ফালাম চিন"] = "cfm", -- Falam Chin
["ফালি"] = "fli", -- Fali
["ফালিস্কান"] = "xfa", -- Faliscan
["ফাম"] = "fam", -- Fam
["ফনাগালো"] = "fng", -- Fanagalo
["ফানামাকাত"] = "bjp", -- Fanamaket
["ফাং (বান্টু)"] = "fan", -- Fang (Bantu)
["ফাং (বেবয়েড)"] = "fak", -- Fang (Beboid)
["ফানিয়া"] = "fni", -- Fania
["ফার পশ্চিমি মুরিয়া"] = "fmu", -- Far Western Muria
["ফারেফারে"] = "gur", -- Farefare
["ফারোইস"] = "fo", -- Faroese
["ফাস"] = "fqs", -- Fas
["ফাসু"] = "faa", -- Fasu
["ফাতালিকা"] = "far", -- Fataleka
["ফাতালুক্কু"] = "ddg", -- Fataluku
["ফায়ু"] = "fau", -- Fayu
["ফে'ফে'"] = "fmp", -- Fe'fe'
["ফেদান"] = "pdn", -- Fedan
["ফেমবে"] = "agl", -- Fembe
["ফের"] = "kah", -- Fer
["ফেরোগে"] = "fer", -- Feroge
["ফিজি হিন্দি"] = "hif", -- Fiji Hindi
["ফিজিয়ান"] = "fj", -- Fijian
["ফিলোমেনা মাতা-কোয়াহুইটলান তোতোনাক"] = "tlp", -- Filomena Mata-Coahuitlán Totonac
["ফিংগালিয়ান"] = "gmw-fin", -- Fingallian
["ফিন্সটেরে ইয়াউ"] = "yuw", -- Finisterre Yau
["ফিনিশ"] = "fi", -- Finnish
["ফিনিশ সাইন ল্যাঙ্গুয়েজ"] = "fse", -- Finnish Sign Language
["ফিনিশ-সুইডিশ সাইন ল্যাঙ্গুয়েজ"] = "fss", -- Finnish-Swedish Sign Language
["ফিনোনগান"] = "fag", -- Finongan
["ফিপা"] = "fip", -- Fipa
["ফিরান"] = "fir", -- Firan
["ফিওয়াজ্ঞা"] = "fiw", -- Fiwaga
["ফ্লেমিশ সাইন ল্যাঙ্গুয়েজ"] = "vgt", -- Flemish Sign Language
["ফ্লিন্ডার্স আইল্যান্ড"] = "fln", -- Flinders Island
["ফোয়াউ"] = "flh", -- Foau
["ফোগাহা"] = "ber-fog", -- Fogaha
["Foi"] = "foi", -- Foi
["ফোইয়া ফোইয়া"] = "ffi", -- Foia Foia
["ফোলোপা"] = "ppo", -- Folopa
["ফোমা"] = "fom", -- Foma
["ফন"] = "fon", -- Fon
["ফনগোরো"] = "fgr", -- Fongoro
["ফুডো"] = "fod", -- Foodo
["ফোরক"] = "frq", -- Forak
["ফোরডাটা"] = "frd", -- Fordata
["ফোর"] = "for", -- Fore
["ফরেস্ট এনেটস"] = "enf", -- Forest Enets
["ফরেস্ট নেনেন্টস"] = "syd-fne", -- Forest Nenets
["ফোর্টসেনাল"] = "frt", -- Fortsenal
["ফক্স"] = "sac", -- Fox
["ফ্রাঙ্কো-কমটোইস"] = "roa-fcm", -- Franc-Comtois
["ফ্রান্সিসকো লিওন জোক"] = "zos", -- Francisco León Zoque
["ফ্রাঙ্কো-প্রোভেন্সাল"] = "frp", -- Franco-Provençal
["ফরাসি"] = "fr", -- French
["ফরাসি বেলজিয়ান সাইন ল্যাঙ্গুয়েজ"] = "sfb", -- French Belgian Sign Language
["ফরাসি সাইন ল্যাঙ্গুয়েজ"] = "fsl", -- French Sign Language
["ফ্রিয়ুলিয়ান"] = "fur", -- Friulian
["ফুলা"] = "ff", -- Fula
["ফুলিরু"] = "flr", -- Fuliiru
["ফুলনিও"] = "fun", -- Fulniô
["ফুম"] = "fum", -- Fum
["ফুংওয়া"] = "ula", -- Fungwa
["ফুর"] = "fvr", -- Fur
["ফুরু"] = "fuu", -- Furu
["ফুতুনা-আনিওয়া"] = "fut", -- Futuna-Aniwa
["ফুয়ুগ"] = "fuy", -- Fuyug
["ফওয়ে"] = "fwe", -- Fwe
["ফওয়াই"] = "fwa", -- Fwâi
["ফিয়াম"] = "pym", -- Fyam
["ফিয়ের"] = "fie", -- Fyer
["গা"] = "gaa", -- Ga
["গা'আন্ডা"] = "gqa", -- Ga'anda
["গা'ডাং"] = "gdg", -- Ga'dang
["গাআ"] = "ttb", -- Gaa
["গাম"] = "tbi", -- Gaam
["গাবাদি"] = "kbt", -- Gabadi
["গাবি"] = "gbw", -- Gabi
["গাব্রি"] = "gab", -- Gabri
["গাব্রিয়েলিনো-ফার্নান্দেনো"] = "xgf", -- Gabrielino-Fernandeño
["গাদাং"] = "gdk", -- Gadang
["গাড়দাং"] = "gad", -- Gaddang
["গাড্ডি"] = "gbk", -- Gaddi
["গাদে"] = "ged", -- Gade
["গাদজেরাওয়াং"] = "gdh", -- Gadjerawang
["গাদসুপ"] = "gaj", -- Gadsup
["গাফাত"] = "gft", -- Gafat
["গাগাদু"] = "gbu", -- Gagadu
["গাগাউজ"] = "gag", -- Gagauz
["গাগনোয়া বেটে"] = "btg", -- Gagnoa Bété
["গাহরি"] = "bfu", -- Gahri
["গাইকুন্দি"] = "gbf", -- Gaikundi
["গাইনা"] = "gcn", -- Gaina
["গাল"] = "gap", -- Gal
["গালাম্বু"] = "glo", -- Galambu
["গালাতিয়ান"] = "xga", -- Galatian
["গালেলা"] = "gbi", -- Galela
["গ্যালেয়া"] = "gar", -- Galeya
["গ্যালিস"] = "gce", -- Galice
["গ্যালিশীয়"] = "gl", -- Galician
["গালিন্দিয়ান"] = "xgl", -- Galindian
["গ্যালাইসিয়ান"] = "cel-gal", -- Gallaecian
["গালো"] = "roa-gal", -- Gallo
["গ্যালো-ইটালিক অব বাসিলিকাটা"] = "roa-gib", -- Gallo-Italic of Basilicata
["গ্যালো-ইটালিক অব সিসিলি"] = "roa-gis", -- Gallo-Italic of Sicily
["গাল্লুরেস"] = "sdn", -- Gallurese
["গালো"] = "adl", -- Galo
["গালোলি"] = "gal", -- Galoli
["গামালে খাম"] = "kgj", -- Gamale Kham
["গাম্বেরিয়া"] = "gma", -- Gambera
["গামেলা"] = "sai-gam", -- Gamela
["গামিলারা"] = "kld", -- Gamilaraay
["গামিত"] = "gbl", -- Gamit
["গামকোনোরা"] = "gak", -- Gamkonora
["গামো"] = "gmv", -- Gamo
["গামো-নিংগি"] = "bte", -- Gamo-Ningi
["গান"] = "gan", -- Gan
["গানা"] = "gnq", -- Gana
["গানং"] = "gne", -- Ganang
["গান্ধারী"] = "pgd", -- Gandhari
["গানে"] = "gzn", -- Gane
["গাংগালিয়া"] = "gcd", -- Ganggalida
["গাংলাউ"] = "ggl", -- Ganglau
["গাংতে"] = "gnb", -- Gangte
["গাংগুলু"] = "gnl", -- Gangulu
["গ্যানটস"] = "gao", -- Gants
["গান্জা"] = "gza", -- Ganza
["গানজি"] = "gnz", -- Ganzi
["গাও"] = "gga", -- Gao
["গাপাপাইওয়া"] = "pwg", -- Gapapaiwa
["গারাওয়া"] = "wrk", -- Garawa
["গাড়োয়ালি"] = "gbm", -- Garhwali
["গারিফুনা"] = "cab", -- Garifuna
["গারিংবাল"] = "xgi", -- Garingbal
["গারো"] = "grt", -- Garo
["গার্রে"] = "gex", -- Garre
["গারুস"] = "gyb", -- Garus
["গার্জা"] = "xgr", -- Garza
["গাশোউ"] = "yok-gsy", -- Gashowu
["গাটা'"] = "gaq", -- Gata'
["গালিশ"] = "cel-gau", -- Gaulish
["গাভাক"] = "dmc", -- Gavak
["গাভার"] = "gou", -- Gavar
["গ্যাভিওঁ ডো জিপারানা"] = "gvo", -- Gavião do Jiparaná
["গওয়ার-বাটি"] = "gwt", -- Gawar-Bati
["গাওয়াদা"] = "gwd", -- Gawwada
["গায়া"] = "zra", -- Gaya
["গাইল"] = "gyl", -- Gayil
["গাও"] = "gay", -- Gayo
["গায়োন"] = "sai-gay", -- Gayón
["গবাগ্যি"] = "gbr", -- Gbagyi
["গবান"] = "ggu", -- Gban
["গবানু"] = "gbv", -- Gbanu
["গবানজিরি"] = "gbg", -- Gbanziri
["গবরি"] = "gby", -- Gbari
["গবায়া-বসসোঙ্গোয়া"] = "gbp", -- Gbaya-Bossangoa
["গবায়া-বোজৌম"] = "gbq", -- Gbaya-Bozoum
["গবায়া-এমবোদোমো"] = "gmm", -- Gbaya-Mbodomo
["গবাই"] = "gyg", -- Gbayi
["গবেসি গ্বে"] = "gbs", -- Gbesi Gbe
["গ্বিই"] = "ggb", -- Gbii
["গ্বিন"] = "xgb", -- Gbin
["গ্বিরি-নিরাগু"] = "grh", -- Gbiri-Niragu
["গ্বোলো গ্রেবো"] = "gec", -- Gboloo Grebo
["গচিরিকু"] = "diu", -- Gciriku
["গচুই"] = "gwj", -- Gcwi
["জি"] = "hmj", -- Ge
["জি'এজ"] = "gez", -- Ge'ez
["গেবা কারেন"] = "kvq", -- Geba Karen
["গেবে"] = "gei", -- Gebe
["গেডাগেড"] = "gdd", -- Gedaged
["গেদেও"] = "drs", -- Gedeo
["গেজি"] = "gji", -- Geji
["গেকো কারেন"] = "ghk", -- Geko Karen
["গেলা"] = "nlg", -- Gela
["গেলে'"] = "sbc", -- Gele'
["গেমে"] = "geq", -- Geme
["জেন"] = "gej", -- Gen
["জেন্ডে"] = "gaf", -- Gende
["জংলে"] = "geg", -- Gengle
["জর্জীয়"] = "ka", -- Georgian
["গেপো"] = "ygp", -- Gepo
["গেরা"] = "gew", -- Gera
["জেরকা"] = "gek", -- Gerka
["জার্মান"] = "de", -- German
["জার্মান লো জার্মান"] = "nds-de", -- German Low German
["জার্মান সাইন ল্যাঙ্গুয়েজ"] = "gsg", -- German Sign Language
["জেরুমা"] = "gea", -- Geruma
["গেসের-গোরোম"] = "ges", -- Geser-Gorom
["গেশিজা"] = "ero-gsz", -- Geshiza
["গেই"] = "guv", -- Gey
["ঘাডামেস"] = "gha", -- Ghadames
["ঘানাইয়ান সাইন ল্যাঙ্গুয়েজ"] = "gse", -- Ghanaian Sign Language
["ঘানদ্রুক সাইন ল্যাঙ্গুয়েজ"] = "gds", -- Ghandruk Sign Language
["ঘানংগা"] = "ghn", -- Ghanongga
["ঘারি"] = "gri", -- Ghari
["ঘায়াভি"] = "bmk", -- Ghayavi
["ঘেরা"] = "ghr", -- Ghera
["ঘোমালা'"] = "bbj", -- Ghomala'
["ঘোমার"] = "gho", -- Ghomara
["ঘোতুও"] = "aaa", -- Ghotuo
["ঘুলফান"] = "ghl", -- Ghulfan
["গিয়াংগান"] = "bgi", -- Giangan
["গিবানাওয়া"] = "gib", -- Gibanawa
["গিদার"] = "gid", -- Gidar
["গিকিওডে"] = "acd", -- Gikyode
["গিলাকি"] = "glk", -- Gilaki
["গিলবার্টিজ"] = "gil", -- Gilbertese
["গিলিম্মা"] = "gix", -- Gilima
["গিমি (অস্ট্রোনেশিয়ান)"] = "gip", -- Gimi (Austronesian)
["গিমি (গোরোকা)"] = "gim", -- Gimi (Goroka)
["গিম্মে"] = "kmp", -- Gimme
["গিম্নিনে"] = "gmn", -- Gimnime
["গিনুমান"] = "gnm", -- Ginuman
["গিরাওয়া"] = "bbr", -- Girawa
["গিরিররা"] = "gii", -- Girirra
["গিরিয়ামা"] = "nyf", -- Giryama
["গিথাবুল"] = "gih", -- Githabul
["গিতুয়া"] = "ggt", -- Gitua
["গিটক্সসান"] = "git", -- Gitxsan
["গিয়ুগ"] = "giy", -- Giyug
["গিজর্রা"] = "tof", -- Gizrra
["গ্লারো-ত্বাবো"] = "glr", -- Glaro-Twabo
["গ্লাভদা"] = "glw", -- Glavda
["গ্লিও-উবি"] = "oub", -- Glio-Oubi
["গ্লোসা"] = "igs", -- Glosa
["গনউ"] = "gnu", -- Gnau
["গোয়া'উল্ড"] = "art-gld", -- Goa'uld
["গোয়ারিয়া"] = "gig", -- Goaria
["গোবাসি"] = "goi", -- Gobasi
["গোবু"] = "gox", -- Gobu
["গোডিয়ে"] = "god", -- Godié
["গোদোবেরি"] = "gdo", -- Godoberi
["গোদওয়ারি"] = "gdx", -- Godwari
["গোয়েমাই"] = "ank", -- Goemai
["গোফা"] = "gof", -- Gofa
["গোগো"] = "gog", -- Gogo
["গোগোদলা"] = "ggw", -- Gogodala
["গোগুরিয়েও"] = "zkg", -- Goguryeo
["গোজরি"] = "gju", -- Gojri
["গোকানা"] = "gkn", -- Gokana
["গোকি"] = "tbq-gkh", -- Gokhy
["গোলা"] = "gol", -- Gola
["গোলিন"] = "gvf", -- Golin
["গোলপা"] = "lja", -- Golpa
["গোন্ডি"] = "gon", -- Gondi
["গোন দাউ"] = "goo", -- Gone Dau
["গং"] = "ugo", -- Gong
["গংডুক"] = "goe", -- Gongduk
["গোনজা"] = "gjn", -- Gonja
["গু"] = "gov", -- Goo
["গুনিয়ান্দি"] = "gni", -- Gooniyandi
["গোর"] = "gqr", -- Gor
["গোরোকর"] = "goc", -- Gorakor
["গোরপ"] = "goq", -- Gorap
["গোরেনগ"] = "xgg", -- Goreng
["গোরোনতালো"] = "gor", -- Gorontalo
["গোরোভু"] = "grq", -- Gorovu
["গোরোয়া"] = "gow", -- Gorowa
["গথিক"] = "got", -- Gothic
["গটসচিরিশ"] = "gmw-gts", -- Gottscheerish
["গৌনডো"] = "goy", -- Goundo
["গুরম্যানছেমা"] = "gux", -- Gourmanchéma
["গাওলান"] = "goj", -- Gowlan
["গাওরো"] = "gwf", -- Gowro
["গোজারখানি"] = "goz", -- Gozarkhani
["গ্রানগালি"] = "nli", -- Grangali
["গ্রাস কইয়ারি"] = "kbk", -- Grass Koiari
["গ্রেবো"] = "grb", -- Grebo
["গ্রিক"] = "el", -- Greek
["গ্রিক সাইন ল্যাঙ্গুয়েজ"] = "gss", -- Greek Sign Language
["গ্রিন গেলাও"] = "giq", -- Green Gelao
["গ্রিন হুমং"] = "hnj", -- Green Hmong
["গ্রিনল্যান্ডিক"] = "kl", -- Greenlandic
["গ্রেনাডিয়ান ক্রেওল ইংলিশ"] = "gcl", -- Grenadian Creole English
["গ্রেসী"] = "grs", -- Gresi
["গ্রোমা"] = "gro", -- Groma
["গ্রোস ভেন্ট্র"] = "ats", -- Gros Ventre
["গুয়া"] = "gwx", -- Gua
["গুয়াকি"] = "sai-gua", -- Guachí
["গুয়াহিbo"] = "guh", -- Guahibo
["গুয়াজাজারা"] = "gub", -- Guajajára
["গুয়াজা"] = "gvj", -- Guajá
["গুয়াম্বিয়ানো"] = "gum", -- Guambiano
["গুয়ামো"] = "sai-gmo", -- Guamo
["গুয়ানাo"] = "gvc", -- Guanano
["গুয়ানচে"] = "gnc", -- Guanche
["গুয়ারাণী"] = "gn", -- Guaraní
["গুয়ারাউ"] = "gyr", -- Guarayu
["গুয়াতেমালান সাইন ল্যাঙ্গুয়েজ"] = "gsm", -- Guatemalan Sign Language
["গুয়াতো"] = "gta", -- Guató
["গুয়ায়াবেরো"] = "guo", -- Guayabero
["গুয়াজাকাপান"] = "nai-guz", -- Guazacapán
["গুদং"] = "xgd", -- Gudang
["গুদনজি"] = "nji", -- Gudanji
["গুদে"] = "gde", -- Gude
["গুদু"] = "gdu", -- Gudu
["গুদুফ-গাওয়া"] = "gdf", -- Guduf-Gava
["গুয়েরেরো আমুজগো"] = "amu", -- Guerrero Amuzgo
["গুয়েরেরো নাহুয়াতল"] = "ngu", -- Guerrero Nahuatl
["গুয়েভেয়া দে হুমবোল্ট জাপোটেক"] = "zpg", -- Guevea de Humboldt Zapotec
["গুগাডজ"] = "ggd", -- Gugadj
["গুগু বাঢুন"] = "gdc", -- Gugu Badhun
["গুগু ওয়ারা"] = "wrw", -- Gugu Warra
["গূহূ-সামানে"] = "ghs", -- Guhu-Samane
["গুইয়ানিস ক্রেওল"] = "gcr", -- Guianese Creole
["গুইবেরুয়া বেটে"] = "bet", -- Guiberoua Bété
["গুইনাউ"] = "awd-gnu", -- Guinau
["গিনি ক্যাপেলে"] = "gkp", -- Guinea Kpelle
["গিনি-বিসাউ ক্রেওল"] = "pov", -- Guinea-Bissau Creole
["গিনি-বিসাউ সাইন ল্যাঙ্গুয়েজ"] = "lgs", -- Guinea-Bissau Sign Language
["গিনিয়ান সাইন ল্যাঙ্গুয়েজ"] = "gus", -- Guinean Sign Language
["গুইকিয়ং"] = "gqi", -- Guiqiong
["গুজরাটি"] = "gu", -- Gujarati
["গুলা"] = "glu", -- Gula
["গুলা'আলা"] = "gmb", -- Gula'alaa
["গুলায়"] = "gvl", -- Gulay
["গুলে"] = "gly", -- Gule
["গাল্ফ আরবি"] = "afb", -- Gulf Arabic
["গুল্লাহ"] = "gul", -- Gullah
["গুমালু"] = "gmu", -- Gumalu
["গুমাতজ"] = "gnn", -- Gumatj
["গুমাওয়ানা"] = "gvs", -- Gumawana
["গুমুজ"] = "guk", -- Gumuz
["গুন"] = "guw", -- Gun
["গুনদি"] = "gdi", -- Gundi
["গুনদিজমারা"] = "gjm", -- Gunditjmara
["গুনডুংগুররা"] = "xrd", -- Gundungurra
["গুনগাবুল্লা"] = "gyf", -- Gungabula
["গুনগু"] = "rub", -- Gungu
["গুনটাই"] = "gnt", -- Guntai
["গুনু"] = "yas", -- Gunu
["গুনউইংগু"] = "gup", -- Gunwinggu
["গুনিয়া"] = "gyy", -- Gunya
["গুপা-আবওয়া"] = "gpa", -- Gupa-Abawa
["গুপাপুইনগু"] = "guf", -- Gupapuyngu
["গুর লামা"] = "las", -- Gur Lama
["গুরগোন"] = "gge", -- Guragone
["গুরমালুম"] = "grz", -- Guramalum
["গুরানি"] = "hac", -- Gurani
["গুরেং গুরেং"] = "gnr", -- Gureng Gureng
["গুরগলা"] = "ggg", -- Gurgula
["গুরিয়োসো"] = "grx", -- Guriaso
["গুরিন্ডজি"] = "gue", -- Gurindji
["গুরিন্ডজি ক্রিওল"] = "gjr", -- Gurindji Kriol
["গুরমানা"] = "gvm", -- Gurmana
["গুরো"] = "goa", -- Guro
["গুরুনটুম"] = "grd", -- Guruntum
["গুসান"] = "gsn", -- Gusan
["গুষি"] = "guz", -- Gusii
["গুসিলি"] = "gsl", -- Gusilay
["গুটনিশ"] = "gmq-gut", -- Gutnish
["গুউগু ইয়িমিধির"] = "kky", -- Guugu Yimidhirr
["গুওয়া"] = "xgw", -- Guwa
["গুয়ামু"] = "gwu", -- Guwamu
["গুওয়ার"] = "aus-guw", -- Guwar
["গুয়া"] = "gka", -- Guya
["গুয়ানিজ ক্রেওল ইংলিশ"] = "gyn", -- Guyanese Creole English
["গুয়ানি"] = "gvy", -- Guyani
["গ্যুয়েবি"] = "gie", -- Guébie
["গভোকো"] = "ngs", -- Gvoko
["গওয়া"] = "gwb", -- Gwa
["গওয়াহাটিকে"] = "dah", -- Gwahatike
["গওয়াক"] = "jgk", -- Gwak
["গওয়ামহি-উরি"] = "bga", -- Gwamhi-Wuri
["গওয়ানডারা"] = "gwn", -- Gwandara
["গওয়ারা"] = "alv-gwa", -- Gwara
["গওয়েদা"] = "grw", -- Gweda
["গওয়েনো"] = "gwe", -- Gweno
["গওয়েরে"] = "gwr", -- Gwere
["গুইচ'ইন"] = "gwi", -- Gwich'in
["গিয়ালসুমডো"] = "gyo", -- Gyalsumdo
["গিয়েলে"] = "gyi", -- Gyele
["গিয়েম"] = "gye", -- Gyem
["গুয়েনোয়া"] = "sai-gue", -- Güenoa
["হাবূ"] = "hbu", -- Habu
["হাচিজো"] = "jpx-hcj", -- Hachijō
["হাদ্দিয়া"] = "hdy", -- Hadiyya
["হাডোতি"] = "hoj", -- Hadoti
["হাদ্রামি"] = "xhd", -- Hadrami
["হাডজা"] = "hts", -- Hadza
["হাইকে"] = "aek", -- Haeke
["হাহন"] = "hah", -- Hahon
["হায়ডা"] = "hai", -- Haida
["হায়গওয়াই"] = "hgw", -- Haigwai
["হাইলিউফেং মিন"] = "nan-hlh", -- Hailufeng Min
["হাইনােস"] = "hnm", -- Hainanese
["হাইন্যাজো বোজো"] = "bzx", -- Hainyaxo Bozo
["হাইফং সাইন ল্যাঙ্গুয়েজ"] = "haf", -- Haiphong Sign Language
["হাইসলা"] = "has", -- Haisla
["হাইতিয়ান ক্রেওল"] = "ht", -- Haitian Creole
["হাইতিয়ান ভোদু কালচার ল্যাঙ্গুয়েজ"] = "hvc", -- Haitian Vodoun Culture Language
["হায়ালোম"] = "hgm", -- Haiǁom
["হাজী"] = "hji", -- Haji
["হাজং"] = "haj", -- Hajong
["হাক্কা"] = "hak", -- Hakka
["হাকো"] = "hao", -- Hakö
["হালাং"] = "hal", -- Halang
["হালাং ডোয়ান"] = "hld", -- Halang Doan
["হালবি"] = "hlb", -- Halbi
["হালিয়া"] = "hla", -- Halia
["হালকোমেলেম"] = "hur", -- Halkomelem
["হামাপ"] = "hmu", -- Hamap
["হাম্বা"] = "hba", -- Hamba
["হামার-বান্না"] = "amf", -- Hamer-Banna
["হামতাই"] = "hmt", -- Hamtai
["হাংগা"] = "hag", -- Hanga
["হাংগা হুন্ডি"] = "wos", -- Hanga Hundi
["হানি"] = "hni", -- Hani
["হানয় সাইন ল্যাঙ্গুয়েজ"] = "hab", -- Hanoi Sign Language
["হানুনু"] = "hnn", -- Hanunoo
["হারামি"] = "xha", -- Harami
["হারাাপ্পান"] = "xiv", -- Harappan
["হারারি"] = "har", -- Harari
["হারাজা"] = "nub-har", -- Haraza
["হরিজন কিন্নৌরি"] = "kjo", -- Harijan Kinnauri
["হারোই"] = "hro", -- Haroi
["হারসুসি"] = "hss", -- Harsusi
["হারুয়াই"] = "tmd", -- Haruai
["হারুকু"] = "hrk", -- Haruku
["হরিয়ানভি"] = "bgc", -- Haryanvi
["হারজানি"] = "hrz", -- Harzani
["হাসাইতিক"] = "sem-has", -- Hasaitic
["হাসা"] = "ybj", -- Hasha
["হাসানিয়া আরবি"] = "mey", -- Hassaniya Arabic
["হাটাম"] = "had", -- Hatam
["হাট্টিক"] = "xht", -- Hattic
["হাউসা"] = "ha", -- Hausa
["হাউসা সাইন ল্যাঙ্গুয়েজ"] = "hsl", -- Hausa Sign Language
["হাউশ"] = "sai-hau", -- Haush
["হাভাসুপাই-ওয়ালাপাই-য়াভাপাই"] = "yuf", -- Havasupai-Walapai-Yavapai
["হাভেকে"] = "hvk", -- Haveke
["হাভু"] = "hav", -- Havu
["হাওয়াই'ই পিডগিন সাইন ল্যাঙ্গুয়েজ"] = "hps", -- Hawai'i Pidgin Sign Language
["হাওয়াইয়ান"] = "haw", -- Hawaiian
["হাওয়াইয়ান ক্রেওল"] = "hwc", -- Hawaiian Creole
["হায়া"] = "hay", -- Haya
["এইচডিআই"] = "xed", -- Hdi
["হিব্রু"] = "he", -- Hebrew
["হেহে"] = "heh", -- Hehe
["হেইবান"] = "hbn", -- Heiban
["হেইল্টসুক"] = "hei", -- Heiltsuk
["হেলোং"] = "heg", -- Helong
["হেমা"] = "nix", -- Hema
["হেম্বা"] = "hem", -- Hemba
["হের্দে"] = "hed", -- Herdé
["হেরেরো"] = "hz", -- Herero
["হার্মিট"] = "llf", -- Hermit
["হারনিকান"] = "xhr", -- Hernican
["হেওয়া"] = "ham", -- Hewa
["হেয়ো"] = "auk", -- Heyo
["হিবিতো"] = "hib", -- Hibito
["হিডাটসা"] = "hid", -- Hidatsa
["হিগাোনন"] = "mba", -- Higaonon
["হাই ভ্যালিরিয়ান"] = "art-vlh", -- High Valyrian
["হাইল্যান্ড কোনজো"] = "kjk", -- Highland Konjo
["হাইল্যান্ড ওয়াক্সাকা চন্টাল"] = "chd", -- Highland Oaxaca Chontal
["হাইল্যান্ড পোপোলুকা"] = "poi", -- Highland Popoluca
["হাইল্যান্ড পুয়েব্লা নাহুয়াতল"] = "azz", -- Highland Puebla Nahuatl
["হাইল্যান্ড তোতোনাক"] = "tos", -- Highland Totonac
["হিজাজী আরবি"] = "acw", -- Hijazi Arabic
["হিজুক"] = "hij", -- Hijuk
["হিলিগায়নন"] = "hil", -- Hiligaynon
["হিল মারিয়া"] = "mrr", -- Hill Maria
["হিমারিম্মা"] = "hir", -- Himarimã
["হিন্দি"] = "hi", -- Hindi
["হিন্দি ডোগরি"] = "dgo", -- Hindi Dogri
["হিন্দুরি"] = "hii", -- Hinduri
["হিনুখ"] = "gin", -- Hinukh
["হিরি মোতু"] = "ho", -- Hiri Motu
["হিস্মাইক"] = "sem-his", -- Hismaic
["হিচটি"] = "nai-hit", -- Hitchiti
["হিতাইত"] = "hit", -- Hittite
["হিটূ"] = "htu", -- Hitu
["হিউ"] = "hiw", -- Hiw
["হিক্সকারিয়ানা"] = "hix", -- Hixkaryana
["হ্লাই"] = "lic", -- Hlai
["হ্লেফো ফোয়া"] = "yhl", -- Hlepho Phowa
["হলেরসু"] = "hle", -- Hlersu
["হ্মার"] = "hmr", -- Hmar
["হুমং ডন"] = "hmf", -- Hmong Don
["হুমং ডো"] = "hmv", -- Hmong Dô
["হুমং শুয়া"] = "hmz", -- Hmong Shua
["হমওয়াভেকে"] = "mrk", -- Hmwaveke
["হো"] = "hoc", -- Ho
["হো চি মিন সিটি সাইন ল্যাঙ্গুয়েজ"] = "hos", -- Ho Chi Minh City Sign Language
["হোয়াভা"] = "hoa", -- Hoava
["হবিওত"] = "hoh", -- Hobyót
["হোইয়া হোইয়া"] = "hhi", -- Hoia Hoia
["হোক্কিয়েন"] = "nan-hbl", -- Hokkien
["হোলিকাচুক"] = "hoi", -- Holikachuk
["হোলিয়া"] = "hoy", -- Holiya
["হোলমা"] = "hod", -- Holma
["হোলোহোলো"] = "hoo", -- Holoholo
["হোলো"] = "hol", -- Holu
["হোমা"] = "hom", -- Homa
["হন্ডুরান লেনকা"] = "len", -- Honduran Lenca
["হন্ডুরাস সাইন ল্যাঙ্গুয়েজ"] = "hds", -- Honduras Sign Language
["হোন"] = "juh", -- Hone
["হংকং সাইন ল্যাঙ্গুয়েজ"] = "hks", -- Hong Kong Sign Language
["হোনী"] = "how", -- Honi
["হোপি"] = "hop", -- Hopi
["হর্নড মিয়াও"] = "hrm", -- Horned Miao
["হোরো"] = "hor", -- Horo
["হোরোম"] = "hoe", -- Horom
["হোটে"] = "hot", -- Hote
["হোটি"] = "hti", -- Hoti
["হোভোনগান"] = "hov", -- Hovongan
["হোয়াহোয়া"] = "hhy", -- Hoyahoya
["হোজো"] = "hoz", -- Hozo
["হপন"] = "hpo", -- Hpon
["হ্রাংখোল"] = "hra", -- Hrangkhol
["হ্রুস"] = "hru", -- Hruso
["হ্রে"] = "hre", -- Hrê
["হু"] = "huo", -- Hu
["হুয়াকিপায়েরি"] = "hug", -- Huachipaeri
["হুয়াম্বিসা"] = "hub", -- Huambisa
["হুয়াওরাণি"] = "auc", -- Huaorani
["হুয়ারিজিও"] = "var", -- Huarijio
["হুয়ালু"] = "hud", -- Huaulu
["হুয়াতলা মাজাতেক"] = "mau", -- Huautla Mazatec
["হুয়াভে"] = "huv", -- Huave
["হুয়াক্সকালেকা নাহুয়াতল"] = "nhq", -- Huaxcaleca Nahuatl
["হুবা"] = "hbb", -- Huba
["হুয়েহুয়েতলা তেপেহুয়া"] = "tee", -- Huehuetla Tepehua
["হুয়েটার"] = "cba-hue", -- Huetar
["হুইচোল"] = "hch", -- Huichol
["হুইল্লিচে"] = "huh", -- Huilliche
["হুইতেপেক মিক্সটেক"] = "mxs", -- Huitepec Mixtec
["হুইঝউ"] = "czh", -- Huizhou
["হুকুমিনা"] = "huw", -- Hukumina
["হুলা"] = "hul", -- Hula
["হুলাউলা"] = "huy", -- Hulaulá
["হুলি"] = "hui", -- Huli
["হুলুং"] = "huk", -- Hulung
["হুমবুরি সেন্নি"] = "hmb", -- Humburi Senni
["হুমেনে"] = "huf", -- Humene
["হুন"] = "uth", -- Hun
["হুন্ডে"] = "hke", -- Hunde
["হাং"] = "hnu", -- Hung
["হানগানা"] = "hum", -- Hungana
["হাংগেরি"] = "hu", -- Hungarian
["হাংগেরিয়ান সাইন ল্যাঙ্গুয়েজ"] = "hsh", -- Hungarian Sign Language
["হাংগোরো"] = "nat", -- Hungworo
["হুনজারা-কাইনা কে"] = "hkk", -- Hunjara-Kaina Ke
["হুনিক"] = "xhc", -- Hunnic
["হুনস্রিক"] = "hrx", -- Hunsrik
["হুনজিব"] = "huz", -- Hunzib
["হুপা"] = "hup", -- Hupa
["হুপডে"] = "jup", -- Hupdë
["হুপলা"] = "hap", -- Hupla
["হুর্রিয়ান"] = "xhu", -- Hurrian
["হাটটেরিশ"] = "geh", -- Hutterisch
["হওয়ানা"] = "hwo", -- Hwana
["হায়া"] = "hya", -- Hya
["হিয়াম"] = "jab", -- Hyam
["হ্যান"] = "haa", -- Hän
["হের্তেভিন"] = "hrt", -- Hértevin
["আই-ওয়াক"] = "iwk", -- I-Wak
["ইয়াই"] = "iai", -- Iaai
["ইয়ামালেলে"] = "yml", -- Iamalele
["ইয়াতমুল"] = "ian", -- Iatmul
["ইয়াউ"] = "tmu", -- Iau
["ইবালি টেকে"] = "tek", -- Ibali Teke
["ইবালোই"] = "ibl", -- Ibaloi
["ইবান"] = "iba", -- Iban
["ইবানাগ"] = "ibg", -- Ibanag
["ইবানি"] = "iby", -- Ibani
["ইবাতান"] = "ivb", -- Ibatan
["ইবেরিয়ান"] = "xib", -- Iberian
["ইবিবিও"] = "ibb", -- Ibibio
["ইবিনো"] = "ibn", -- Ibino
["ইবোকো"] = "bkp", -- Iboko
["ইবু"] = "ibu", -- Ibu
["ইবুওরো"] = "ibr", -- Ibuoro
["আইসল্যান্ডীয়"] = "is", -- Icelandic
["আইসল্যান্ডিক সাইন ল্যাঙ্গুয়েজ"] = "icl", -- Icelandic Sign Language
["ইসেভ-মাসি"] = "bec", -- Iceve-Maci
["ইদা'আন"] = "dbj", -- Ida'an
["ইদাখো-ইসুখা-তিরিকি"] = "ida", -- Idakho-Isukha-Tiriki
["ইডাতে"] = "idt", -- Idaté
["ইদেরে"] = "ide", -- Idere
["ইদেসা"] = "ids", -- Idesa
["ইদি"] = "idi", -- Idi
["ইডিওম নিউট্রাল"] = "mis-idn", -- Idiom Neutral
["ইডো"] = "io", -- Ido
["ইডোমা"] = "idu", -- Idoma
["ইডন"] = "idc", -- Idon
["ইডু"] = "clk", -- Idu
["ইডুন"] = "ldb", -- Idun
["ইডুনা"] = "viv", -- Iduna
["ইফো"] = "iff", -- Ifo
["ইফে"] = "ife", -- Ifè
["ইগালা"] = "igl", -- Igala
["ইগানা"] = "igg", -- Igana
["ইগবো"] = "ig", -- Igbo
["ইগেদে"] = "ige", -- Igede
["ইগনাসিয়ানো"] = "ign", -- Ignaciano
["ইগো"] = "ahl", -- Igo
["ইগুতা"] = "nar", -- Iguta
["ইগওয়ে"] = "igw", -- Igwe
["ইহা"] = "ihp", -- Iha
["ইহিয়েভবে"] = "ihi", -- Ihievbe
["ইজা-জুব্বা"] = "vki", -- Ija-Zuba
["ইক"] = "ikx", -- Ik
["ইকা"] = "ikk", -- Ika
["ইকারাংগাল"] = "ikr", -- Ikaranggal
["ইকিজু"] = "ikz", -- Ikizu
["ইকো"] = "iki", -- Iko
["ইকোবি-মেনা"] = "meb", -- Ikobi-Mena
["ইকোমা"] = "ntk", -- Ikoma
["ইকপেং"] = "txi", -- Ikpeng
["ইকপেশি"] = "ikp", -- Ikpeshi
["ইকপোসো"] = "kpo", -- Ikposo
["ইকু-গোরা-আঙ্কওয়া"] = "ikv", -- Iku-Gora-Ankwa
["ইকুলু"] = "ikl", -- Ikulu
["ইকওয়ারে"] = "ikw", -- Ikwere
["ইকও"] = "iqw", -- Ikwo
["ইলা"] = "ilb", -- Ila
["ইলে আ্পে"] = "ila", -- Ile Ape
["ইলগার"] = "ilg", -- Ilgar
["ইলি তুর্কি"] = "ili", -- Ili Turki
["ইলি'উন"] = "ilu", -- Ili'uun
["ইলিয়ানেন মানোবো"] = "mbi", -- Ilianen Manobo
["ইল্লিরিয়ান"] = "xil", -- Illyrian
["ইলোকানো"] = "ilo", -- Ilocano
["ইলোনগোট"] = "ilk", -- Ilongot
["ইলিউ"] = "ilv", -- Ilue
["ইলওয়ানা"] = "mlk", -- Ilwana
["ইমবোংগু"] = "imo", -- Imbongu
["ইমোন্ডা"] = "imn", -- Imonda
["ইম্রোইঙ্গ"] = "imr", -- Imroing
["ইনাবাকনন"] = "abx", -- Inabaknon
["ইনপ্যাং"] = "mzu", -- Inapang
["ইনরি সামি"] = "smn", -- Inari Sami
["ইন্ডাঙ্গা"] = "bnt-ind", -- Indanga
["ভারতীয় সাইন ল্যাঙ্গুয়েজ"] = "ins", -- Indian Sign Language
["ইন্দো-পর্তুগিজ"] = "idb", -- Indo-Portuguese
["ইন্দোনেশিয়ান"] = "id", -- Indonesian
["ইন্দোনেশিয়ান বাজাও"] = "bdl", -- Indonesian Bajau
["ইন্দোনেশিয়ান সাইন ল্যাঙ্গুয়েজ"] = "inl", -- Indonesian Sign Language
["ইন্দ্রি"] = "idr", -- Indri
["ইন্দুস কোহিস্তানি"] = "mvy", -- Indus Kohistani
["ইনেবু ওয়ান"] = "oin", -- Inebu One
["ইনেসেনো"] = "inz", -- Ineseño
["ইনগা"] = "inb", -- Inga
["ইঙ্গ্রিয়ান"] = "izh", -- Ingrian
["ইংগুশ"] = "inh", -- Ingush
["ইনলাওড ইতনেগ"] = "iti", -- Inlaod Itneg
["ইনোকে-ইয়াতে"] = "ino", -- Inoke-Yate
["ইনোংহান"] = "loc", -- Inonhan
["ইনোর"] = "ior", -- Inor
["ইনপুই নাগ"] = "nkf", -- Inpui Naga
["ইন্টারলিঙ্গুয়া"] = "ia", -- Interlingua
["ইন্টারলিঙ্গুয়ে"] = "ie", -- Interlingue
["ইন্টারন্যাশনাল সাইন"] = "ils", -- International Sign
["ইন্টারস্লাভিক"] = "isv", -- Interslavic
["ইন্থা"] = "int", -- Intha
["ইনুইন্নাক্তুন"] = "esx-inq", -- Inuinnaqtun
["ইনুইট সাইন ল্যাঙ্গুয়েজ"] = "iks", -- Inuit Sign Language
["ইনুক্টিটুট"] = "iu", -- Inuktitut
["ইনুক্টুন"] = "esx-ink", -- Inuktun
["ইনুপিয়াক"] = "ik", -- Inupiaq
["ইনুবিয়ালুক্তুন"] = "ikt", -- Inuvialuktun
["ইপাই"] = "nai-ipa", -- Ipai
["ইপালপা আমুজগো"] = "azm", -- Ipalapa Amuzgo
["ইপিকো"] = "ipo", -- Ipiko
["ইপিলি"] = "ipi", -- Ipili
["ইপুলো"] = "ass", -- Ipulo
["ইকুতো"] = "iqu", -- Iquito
["ইর"] = "irr", -- Ir
["ইরান্ত্সে"] = "irn", -- Irantxe
["ইরানুন"] = "ill", -- Iranun
["ইরাকি আরবি"] = "acm", -- Iraqi Arabic
["ইরাক"] = "irk", -- Iraqw
["ইরাারুটু"] = "irh", -- Irarutu
["ইরায়া"] = "iry", -- Iraya
["ইরেসিম"] = "ire", -- Iresim
["ইরিগা বিকোলানো"] = "bto", -- Iriga Bicolano
["আইরিশ"] = "ga", -- Irish
["আইরিশ সাইন ল্যাঙ্গুয়েজ"] = "isg", -- Irish Sign Language
["ইরুল্লা"] = "iru", -- Irula
["ইসাবি"] = "isa", -- Isabi
["ইসান"] = "tts", -- Isan
["ইসানজু"] = "isn", -- Isanzu
["ইসারাগ আগটা"] = "agk", -- Isarog Agta
["ইসৌরিয়ান"] = "mis-isa", -- Isaurian
["ইসকোনাহুয়া"] = "isc", -- Isconahua
["ইসেবে"] = "igo", -- Isebe
["ইশকশিমি"] = "isk", -- Ishkashimi
["ইসিনাই"] = "inn", -- Isinai
["ইসিরওয়া"] = "srl", -- Isirawa
["আইল্যান্ডার ক্রেওল ইংলিশ"] = "icr", -- Islander Creole English
["ইসনাগ"] = "isd", -- Isnag
["ইসোকো"] = "iso", -- Isoko
["ইসরায়েলি সাইন ল্যাঙ্গুয়েজ"] = "isr", -- Israeli Sign Language
["ইসমাস মিক্সে"] = "mir", -- Isthmus Mixe
["ইসমাস জাপোটেক"] = "zai", -- Isthmus Zapotec
["পূর্ব্রিয়ট"] = "ist", -- Istriot
["পূর্ব্রো-রোমানিয়ান"] = "ruo", -- Istro-Romanian
["ইসু"] = "isu", -- Isu
["ইসুভু"] = "szv", -- Isubu
["ইতালীয়"] = "it", -- Italian
["ইতালীয় সাইন ল্যাঙ্গুয়েজ"] = "ise", -- Italian Sign Language
["ইতালীয় গ্রিক"] = "grk-ita", -- Italiot Greek
["ইতাউইট"] = "itv", -- Itawit
["ইটেলমেন"] = "itl", -- Itelmen
["ইতেন"] = "ite", -- Itene
["ইতেরি"] = "itr", -- Iteri
["ইতিক"] = "itx", -- Itik
["ইটো"] = "itw", -- Ito
["ইতোনামা"] = "ito", -- Itonama
["ইতসেকুরি"] = "its", -- Itsekiri
["ইতু মব্ন উজো"] = "itm", -- Itu Mbon Uzo
["ইতুন্দুজিয়া মিক্সটেক"] = "mce", -- Itundujia Mixtec
["ইতজা'"] = "itz", -- Itza'
["ইউ মিয়েন"] = "ium", -- Iu Mien
["ইভাতান"] = "ivv", -- Ivatan
["ইওয়াইজদা"] = "ibd", -- Iwaidja
["ইওয়াল"] = "kbm", -- Iwal
["ইওয়াম"] = "iwm", -- Iwam
["ইউর"] = "iwo", -- Iwur
["ইক্সক্যাটেক"] = "ixc", -- Ixcatec
["ইক্সক্যাটলান মাজাতেক"] = "mzi", -- Ixcatlán Mazatec
["ইক্সিল"] = "ixl", -- Ixil
["ইক্সটায়ুতলা মিক্সটেক"] = "vmj", -- Ixtayutla Mixtec
["ইক্সটেঙ্কো ওটোমি"] = "otz", -- Ixtenco Otomi
["ইয়ায়ু"] = "iya", -- Iyayu
["ইয়িভে"] = "uiv", -- Iyive
["ইয়ো"] = "nca", -- Iyo
["ইয়ো'উয়ুজওয়া চোরোতে"] = "crq", -- Iyo'wujwa Chorote
["ইয়োজওয়া'জা চোরোতে"] = "crt", -- Iyojwa'ja Chorote
["ইজেরে"] = "izr", -- Izere
["ইজি"] = "izz", -- Izi
["ইজি-এজা-ইকও-এমগবো"] = "izi", -- Izi-Ezaa-Ikwo-Mgbo
["ইজোন"] = "ijc", -- Izon
["ইজোরা"] = "cbo", -- Izora
["ইনাপারি"] = "inp", -- Iñapari
["জাবেম"] = "jae", -- Jabem
["জাবুতি"] = "jbt", -- Jabutí
["জাদ"] = "jda", -- Jad
["জাদগালি"] = "jdg", -- Jadgali
["জাহ হুট"] = "jah", -- Jah Hut
["জাহানকা"] = "jad", -- Jahanka
["জাইর আওয়ু"] = "awv", -- Jair Awyu
["জাকালটেক"] = "jac", -- Jakaltek
["জাকাটি"] = "jat", -- Jakati
["জালাপা দে দিয়াজ মাজাতেক"] = "maj", -- Jalapa de Díaz Mazatec
["জালকুনান"] = "bxl", -- Jalkunan
["জ্যামাইকান কান্ট্রি সাইন ল্যাঙ্গুয়েজ"] = "jcs", -- Jamaican Country Sign Language
["জ্যামাইকান ক্রেওল"] = "jam", -- Jamaican Creole
["জ্যামাইকান সাইন ল্যাঙ্গুয়েজ"] = "jls", -- Jamaican Sign Language
["জামামাদি"] = "jaa", -- Jamamadí
["জাম্বি মালয়"] = "jax", -- Jambi Malay
["জ্যামিলতেপেক মিক্সটেক"] = "mxt", -- Jamiltepec Mixtec
["জামিনজুং"] = "djd", -- Jaminjung
["জ্যাম্সে"] = "djm", -- Jamsay
["জ্যামতিশ"] = "gmq-jmk", -- Jamtish
["জান্দাভরা"] = "jnd", -- Jandavra
["জান্ডার"] = "jan", -- Janday
["জাংকাং"] = "djo", -- Jangkang
["জাংশুং"] = "jna", -- Jangshung
["জানজি"] = "jni", -- Janji
["জাপানি"] = "ja", -- Japanese
["জাপানিজ সাইন ল্যাঙ্গুয়েজ"] = "jsl", -- Japanese Sign Language
["জাপফুগ"] = "sit-jap", -- Japhug
["জাপ্রেরিয়া"] = "jru", -- Japrería
["জাকারু"] = "jqr", -- Jaqaru
["জারা"] = "jaf", -- Jara
["জারাই"] = "jra", -- Jarai
["জারোয়া"] = "anq", -- Jarawa
["জারু"] = "ddj", -- Jaru
["জ্যাসিক"] = "ysc", -- Jassic
["জাউনসারী"] = "jns", -- Jaunsari
["জাভানীয়"] = "jv", -- Javanese
["জাভিন্ডো"] = "jvd", -- Javindo
["জাওয়ে"] = "jaz", -- Jawe
["জায়া"] = "jyy", -- Jaya
["জেবেরো"] = "jeb", -- Jebero
["জেহ"] = "jeh", -- Jeh
["জেহাই"] = "jhi", -- Jehai
["জেইকো"] = "sai-jko", -- Jeikó
["জেজু"] = "jje", -- Jeju
["জেমেজ"] = "tow", -- Jemez
["জেনামা বোজো"] = "bze", -- Jenaama Bozo
["জেং"] = "jeg", -- Jeng
["জেন্নু কুরুম্বা"] = "xuj", -- Jennu Kurumba
["জেরে"] = "jer", -- Jere
["জেরি কুও"] = "jek", -- Jeri Kuo
["জার্সি ডাচ"] = "gmw-jdt", -- Jersey Dutch
["জেরু"] = "akj", -- Jeru
["জেরুং"] = "jee", -- Jerung
["ঝানকোট সাইন ল্যাঙ্গুয়েজ"] = "jhs", -- Jhankot Sign Language
["জিয়ামাো"] = "jio", -- Jiamao
["জিবা"] = "juo", -- Jiba
["জিবু"] = "jib", -- Jibu
["জিকারিল্লা"] = "apj", -- Jicarilla
["জি"] = "mis-jie", -- Jie
["জিইড্ডু"] = "jii", -- Jiiddu
["জিলবে"] = "jie", -- Jilbe
["জিলি"] = "mgi", -- Jili
["জিলিম"] = "jil", -- Jilim
["জিমি"] = "jmi", -- Jimi
["জিমজিমেন"] = "jim", -- Jimjimen
["জিন"] = "cjy", -- Jin
["জিনা"] = "jia", -- Jina
["জিংফো"] = "kac", -- Jingpho
["জিংগুলু"] = "jig", -- Jingulu
["জিয়ংনাই বুনু"] = "pnu", -- Jiongnai Bunu
["জিরাযারা"] = "sai-jrj", -- Jirajara
["জিরোল"] = "jul", -- Jirel
["জিরু"] = "jrr", -- Jiru
["জিটা"] = "jit", -- Jita
["জিঝাও"] = "mis-jzh", -- Jizhao
["জ্জু"] = "kaj", -- Jju
["জোবা"] = "job", -- Joba
["জোফোটেক-ব্রোম্নিয়া"] = "jbr", -- Jofotek-Bromnya
["জোলা-ফোনই"] = "dyo", -- Jola-Fonyi
["জোলা-কাসা"] = "csk", -- Jola-Kasa
["জোনকর বুরমাতাগুইল"] = "jeu", -- Jonkor Bourmataguil
["জর্ডানিয়ান সাইন ল্যাঙ্গুয়েজ"] = "jos", -- Jordanian Sign Language
["জোরা"] = "jor", -- Jorá
["জাওউলু"] = "jow", -- Jowulu
["জু"] = "juu", -- Ju
["জুয়াং"] = "jun", -- Juang
["জুবা আরবি"] = "pga", -- Juba Arabic
["জুডেও-ইতালীয়"] = "itk", -- Judeo-Italian
["জুডেও-ফারসি"] = "jpr", -- Judeo-Persian
["জুডেও-তাত"] = "jdt", -- Judeo-Tat
["জুকুন তাকুম"] = "jbu", -- Jukun Takum
["জুমাইটেপেক"] = "nai-jum", -- Jumaytepeque
["জুমজুম"] = "jum", -- Jumjum
["জুমলা সাইন ল্যাঙ্গুয়েজ"] = "jus", -- Jumla Sign Language
["জুমলি"] = "jml", -- Jumli
["জাঙ্গল ইনগা"] = "inj", -- Jungle Inga
["জুকুইলা মিক্সে"] = "mxq", -- Juquila Mixe
["জুর মোডো"] = "bex", -- Jur Modo
["জুরায়"] = "juy", -- Juray
["জুরচেন"] = "juc", -- Jurchen
["জুরূনা"] = "jur", -- Jurúna
["জুটিয়াপা"] = "nai-jtp", -- Jutiapa
["জুটীশ"] = "jut", -- Jutish
["জুয়াল"] = "mwb", -- Juwal
["জুক্সট্লাহুয়াকা মিক্সটেক"] = "vmc", -- Juxtlahuaca Mixtec
["জুওয়াহোয়ান"] = "ktz", -- Juǀ'hoan
["জুইরা-পেপেসা"] = "jwi", -- Jwira-Pepesa
["জুমা"] = "jua", -- Júma
["কি'চে'"] = "quc", -- K'iche'
["কাআমবা"] = "xku", -- Kaamba
["কান"] = "ldl", -- Kaan
["কান চিন"] = "ckn", -- Kaang Chin
["কানসা"] = "gna", -- Kaansa
["কাপুর সাইন ল্যাঙ্গুয়েজ"] = "uks", -- Kaapor Sign Language
["কাবা"] = "ksp", -- Kaba
["কাবালাই"] = "kvf", -- Kabalai
["কাবার্ডিয়ান"] = "kbd", -- Kabardian
["কাবাটি"] = "xkp", -- Kabatei
["কাব্বা-লাকা"] = "lap", -- Kabba-Laka
["কাবিশিয়ানা"] = "tup-kab", -- Kabishiana
["কাবিয়"] = "kbp", -- Kabiyé
["কাবোলা"] = "klz", -- Kabola
["কাবোরে ওয়ান"] = "onk", -- Kabore One
["কাব্রাস"] = "lkb", -- Kabras
["কাবুরি"] = "uka", -- Kaburi
["কাবুতরা"] = "kbu", -- Kabutra
["কাবুভার্দিয়ানু"] = "kea", -- Kabuverdianu
["কাবওয়া"] = "cwa", -- Kabwa
["কাবওয়ারি"] = "kcw", -- Kabwari
["কাবিল"] = "kab", -- Kabyle
["কাচামা-গানজুলেও"] = "kcx", -- Kachama-Ganjule
["কাচারি"] = "xac", -- Kachari
["কাচ্চি"] = "kfr", -- Kachchi
["কাচি কোলি"] = "gjk", -- Kachi Koli
["কাচিপো-বালেসি"] = "koe", -- Kacipo-Balesi
["কাকো'"] = "xkk", -- Kaco'
["কাদাই"] = "kzd", -- Kadai
["কাদার"] = "kej", -- Kadar
["কাডারা"] = "kad", -- Kadara
["কাডারু"] = "kdu", -- Kadaru
["কাদিউউ"] = "kbc", -- Kadiwéu
["কাদো"] = "kdv", -- Kado
["কাডু (মিয়ানমার)"] = "zkd", -- Kadu (Myanmar)
["কাডুগলি"] = "xtc", -- Kadugli
["কাডুও"] = "ktp", -- Kaduo
["কায়েরা"] = "jka", -- Kaera
["কাফা"] = "kbr", -- Kafa
["কাফোয়া"] = "kpu", -- Kafoa
["কাগান কালাগেন"] = "kll", -- Kagan Kalagan
["কাগাতে"] = "syw", -- Kagate
["কাগয়ানেন"] = "cgc", -- Kagayanen
["কাগোমা"] = "kdm", -- Kagoma
["কাগোরো"] = "xkg", -- Kagoro
["কাগুলু"] = "kki", -- Kagulu
["কাহে"] = "hka", -- Kahe
["কাহুয়া"] = "agw", -- Kahua
["কাইয়ান"] = "kct", -- Kaian
["কাইববো"] = "kzb", -- Kaibobo
["কাইডিপং"] = "kzp", -- Kaidipang
["কাইয়েপ"] = "kbw", -- Kaiep
["কাইকাডি"] = "kep", -- Kaikadi
["কাইকে"] = "kzq", -- Kaike
["কাইকু"] = "kkq", -- Kaiku
["কাইমবুলওয়া"] = "zka", -- Kaimbulawa
["কাইম্বে"] = "xai", -- Kaimbé
["কাইংগ্যাং"] = "kgp", -- Kaingang
["কাইরাক"] = "ckr", -- Kairak
["কাইরুরু"] = "kxa", -- Kairiru
["কাইরুই-মিডিকি"] = "krd", -- Kairui-Midiki
["কাইস"] = "kzm", -- Kais
["কাইটাগ"] = "xdq", -- Kaitag
["কাইভি"] = "kce", -- Kaivi
["কাইওয়া"] = "kgk", -- Kaiwá
["কাইয়"] = "tcq", -- Kaiy
["কাইজাকসে"] = "ckq", -- Kajakse
["কাজালী"] = "xkj", -- Kajali
["কাজামান"] = "kag", -- Kajaman
["কাকাবাই"] = "kqf", -- Kakabai
["কাকাবে"] = "kke", -- Kakabe
["কাকানডা"] = "kka", -- Kakanda
["কাকি এ"] = "tbd", -- Kaki Ae
["কাকিহুম"] = "kxe", -- Kakihum
["কাকো"] = "kkj", -- Kako
["কাকওয়া"] = "keo", -- Kakwa
["কালা"] = "kcl", -- Kala
["কালা লাগাও ইয়া"] = "mwp", -- Kala Lagaw Ya
["কালামায়া"] = "lkm", -- Kalaamaya
["কালাবকান"] = "kve", -- Kalabakan
["কালাবারি"] = "ijn", -- Kalabari
["কালাব্রা"] = "kzz", -- Kalabra
["কালাগ্যান"] = "kqe", -- Kalagan
["কলাক্টাং মনপা"] = "kkf", -- Kalaktang Monpa
["কালাম"] = "kmh", -- Kalam
["কালামি"] = "gwc", -- Kalami
["কালামসে"] = "knz", -- Kalamsé
["কালাানাদি"] = "wkl", -- Kalanadi
["কালানগা"] = "kck", -- Kalanga
["কালাও"] = "kly", -- Kalao
["কালাপুইয়া"] = "kyl", -- Kalapuya
["কালারকো"] = "kba", -- Kalarko
["কালশা"] = "kls", -- Kalasha
["কালসুরিয়া"] = "xme-kls", -- Kalasuri
["কালসমা"] = "ine-kal", -- Kalašma
["কালেনজিন"] = "kln", -- Kalenjin
["কালিনাগো"] = "crb", -- Kalinago
["কাল্কাতুংগু"] = "ktg", -- Kalkatungu
["কালকোটি"] = "xka", -- Kalkoti
["কাল্লাওয়ায়া"] = "caw", -- Kallawaya
["কাল্মিক"] = "xal", -- Kalmyk
["কালো ফিনিশ রোমানি"] = "rmf", -- Kalo Finnish Romani
["কালোউ"] = "ywa", -- Kalou
["কালুলি"] = "bco", -- Kaluli
["কালুম্পাং"] = "kli", -- Kalumpang
["কাম"] = "kdx", -- Kam
["কামাকান"] = "vkm", -- Kamakan
["কামং"] = "woi", -- Kamang
["কামানো"] = "kbq", -- Kamano
["কামন্তান"] = "kci", -- Kamantan
["কামাar"] = "keq", -- Kamar
["কামারা"] = "jmr", -- Kamara
["কামারিয়ান"] = "kzx", -- Kamarian
["কামারু"] = "kgx", -- Kamaru
["কামারুপী প্রাকৃত"] = "inc-kam", -- Kamarupi Prakrit
["কামাসা"] = "klp", -- Kamasa
["কামাসাউ"] = "kms", -- Kamasau
["কামাসিয়ান"] = "xas", -- Kamassian
["কামায়ো"] = "kyk", -- Kamayo
["কামায়ুরা"] = "kay", -- Kamayurá
["কাম্বা"] = "kam", -- Kamba
["কাম্বাত্তা"] = "ktb", -- Kambaata
["কাম্বাইরা"] = "kyy", -- Kambaira
["কাম্বেরা"] = "xbr", -- Kambera
["কাম্বেরাতারো"] = "kbv", -- Kamberataro
["কাম্বেরাউ"] = "irx", -- Kamberau
["কাম্বিওয়া"] = "xbw", -- Kambiwá
["কামি"] = "kmi", -- Kami
["কামকাতা-ভিরি"] = "bsh", -- Kamkata-viri
["কামো"] = "kcq", -- Kamo
["কামোরো"] = "kgq", -- Kamoro
["কামতা"] = "rkt", -- Kamta
["কামু"] = "xmu", -- Kamu
["কামুলা"] = "xla", -- Kamula
["কামওয়ে"] = "hig", -- Kamwe
["কানাকানাবূ"] = "xnb", -- Kanakanabu
["কানাকুরু"] = "kna", -- Kanakuru
["কামানরি"] = "knm", -- Kanamari
["কানশি"] = "xns", -- Kanashi
["কানাসি"] = "soq", -- Kanasi
["কানদাস"] = "kqw", -- Kandas
["কান্দাও"] = "gam", -- Kandawo
["কান্দে"] = "kbs", -- Kande
["কাং"] = "kyp", -- Kang
["কান্গা"] = "kcp", -- Kanga
["কানগিন"] = "kkv", -- Kangean
["কানগাপে"] = "igm", -- Kanggape
["কাংজিয়া"] = "kxs", -- Kangjia
["কাঙ্গো"] = "kty", -- Kango
["কাঙ্গো-সুয়া"] = "kzy", -- Kango-Sua
["কাংরি"] = "xnr", -- Kangri
["কানিয়েট"] = "ktk", -- Kaniet
["কানিক্কারান"] = "kev", -- Kanikkaran
["কানিনগডন-নিনডেম"] = "kdp", -- Kaningdon-Nindem
["কানিনগি"] = "kzo", -- Kaningi
["কানিনগরা"] = "knr", -- Kaningra
["কানিনুয়া"] = "wat", -- Kaninuwa
["কানিটে"] = "kmu", -- Kanite
["কানজারী"] = "kft", -- Kanjari
["কানজু"] = "kbe", -- Kanju
["কানকানাই"] = "kne", -- Kankanaey
["কন্নড়"] = "kn", -- Kannada
["কন্নড় কুরুম্বা"] = "kfi", -- Kannada Kurumba
["কানৌজী"] = "bjj", -- Kannauji
["কানোয়িট"] = "kxn", -- Kanowit
["কানোয়ে"] = "kxo", -- Kanoé
["কানসা"] = "ksk", -- Kansa
["ক্যান্টোসি"] = "xkt", -- Kantosi
["কানূ"] = "khx", -- Kanu
["কানূফি"] = "kni", -- Kanufi
["কানুরি"] = "kr", -- Kanuri
["কানয়োক"] = "kny", -- Kanyok
["কাও"] = "kax", -- Kao
["কাওন্ডে"] = "kqn", -- Kaonde
["কাপ"] = "ykm", -- Kap
["কাপাম্পানগান"] = "pam", -- Kapampangan
["কাপাওরি"] = "khp", -- Kapauri
["কাপিন"] = "tbx", -- Kapin
["কাপিনাওয়া"] = "xpn", -- Kapinawá
["কাপিনগামারানগি"] = "kpg", -- Kapingamarangi
["কাপ্রিমান"] = "dju", -- Kapriman
["কাপতিয়াউ"] = "kbi", -- Kaptiau
["কাপিয়া"] = "klo", -- Kapya
["কাচকেল"] = "cak", -- Kaqchikel
["কাচকেল-ক'ইচে' মিক্সড ল্যাঙ্গুয়েজ"] = "ckz", -- Kaqchikel-K'iche' Mixed Language
["কারা (নিউ গিনি)"] = "leu", -- Kara (New Guinea)
["কারা (তানজানিয়া)"] = "reg", -- Kara (Tanzania)
["কারাচে-বালকার"] = "krc", -- Karachay-Balkar
["কারাদজেরি"] = "gbd", -- Karadjeri
["কারাগা ম্যান্ডায়া"] = "mry", -- Karaga Mandaya
["কারাইম"] = "kdr", -- Karaim
["কারাজ্জা"] = "kpj", -- Karajá
["কারাকালপাক"] = "kaa", -- Karakalpak
["কারাখানিদ"] = "xqa", -- Karakhanid
["কারামি"] = "xar", -- Karami
["কারামোজাং"] = "kdj", -- Karamojong
["কারাং"] = "kzr", -- Karang
["কারানগা"] = "kth", -- Karanga
["কারানকাওয়া"] = "zkk", -- Karankawa
["কারাও"] = "kyj", -- Karao
["কারাস"] = "kgv", -- Karas
["কারাটা"] = "kpt", -- Karata
["কারাওয়া"] = "xrw", -- Karawa
["কার্বি"] = "mjw", -- Karbi
["কারে (আফ্রিকা)"] = "kbn", -- Kare (Africa)
["কারে (নিউ গিনি)"] = "kmf", -- Kare (New Guinea)
["কারেকারে"] = "kai", -- Karekare
["কারেয়ার্ন"] = "krl", -- Karelian
["কারেয়"] = "kyd", -- Karey
["কারী"] = "kbj", -- Kari
["কারিনা"] = "car", -- Kari'na
["কারিনগানি"] = "kgn", -- Karingani
["কারিপুনা"] = "kuq", -- Karipuna
["কারিপুনা"] = "kgm", -- Karipúna
["কোইতাবু"] = "kqi", -- Koitabu
["কোইওয়াত"] = "kxt", -- Koiwat
["কক-নার"] = "gko", -- Kok-Nar
["কক-পাপোঁক"] = "okg", -- Kok-Paponk
["কোকাটা"] = "ktd", -- Kokata
["ককবরোক"] = "trp", -- Kokborok
["কোকে"] = "kou", -- Koke
["কোকো-বেরা"] = "kkp", -- Koko-Bera
["কোকোদা"] = "xod", -- Kokoda
["কোকোলা"] = "kzn", -- Kokola
["কোকোটা"] = "kkk", -- Kokota
["কোল (ক্যামেরুন)"] = "biw", -- Kol (Cameroon)
["কোল (নিউ গিনি)"] = "kol", -- Kol (New Guinea)
["কোলা"] = "kvv", -- Kola
["কোলামি"] = "kfb", -- Kolami
["কোলবিলা"] = "klc", -- Kolbila
["কোলহে"] = "ekl", -- Kolhe
["কোলিবুগান সুবানন"] = "skn", -- Kolibugan Subanon
["কোলম"] = "klm", -- Kolom
["কোলুয়াওয়া"] = "klx", -- Koluwawa
["কম (ক্যামেরুন)"] = "bkm", -- Kom (Cameroon)
["কম (ভারত)"] = "kmm", -- Kom (India)
["কোমা"] = "kmy", -- Koma
["কোম্বা"] = "kpf", -- Komba
["কোম্বাই"] = "tyn", -- Kombai
["কোম্বিও"] = "xbi", -- Kombio
["কোমেরিং"] = "kge", -- Komering
["কোমি-পার্মিয়াক"] = "koi", -- Komi-Permyak
["কোমি-ইয়াজভা"] = "urj-kya", -- Komi-Yazva
["কোমি-জিইরিয়ান"] = "kpv", -- Komi-Zyrian
["কোমিনিয়ুমুং"] = "xoi", -- Kominimung
["কোমো"] = "xom", -- Komo
["কোমোডো"] = "kvh", -- Komodo
["কোম্পানে"] = "kvp", -- Kompane
["কোমইয়ান্দারেট"] = "kzv", -- Komyandaret
["কোন কেউ"] = "kkn", -- Kon Keu
["কোনাবেরে"] = "bbo", -- Konabéré
["কোনাই"] = "kxw", -- Konai
["কোন্ডা"] = "knd", -- Konda
["কোন্ডা-ডোরা"] = "kfc", -- Konda-Dora
["কোনডেকোর"] = "gau", -- Kondekor
["কোনেরাও"] = "kdw", -- Koneraw
["কঙ্গো"] = "kg", -- Kongo
["কোঙ্কানি"] = "kok", -- Konkani
["কোনকোম্বা"] = "xon", -- Konkomba
["কোন্নি"] = "kma", -- Konni
["কোনো (গিনি)"] = "knu", -- Kono (Guinea)
["কোনো (নাইজেরিয়া)"] = "klk", -- Kono (Nigeria)
["কোনো (সিয়েরা লিওন)"] = "kno", -- Kono (Sierra Leone)
["কোনোমালা"] = "koa", -- Konomala
["কোনোমিহু"] = "nai-knm", -- Konomihu
["কোনোঙ্গো"] = "kcz", -- Konongo
["কোন্যাক নাগা"] = "nbe", -- Konyak Naga
["কোনিয়াঙ্কা মানিঙ্কা"] = "mku", -- Konyanka Maninka
["কঞ্জো"] = "koo", -- Konzo
["কুনজিমে"] = "ozm", -- Koonzime
["কুরেটে"] = "kqy", -- Koorete
["কোপার"] = "xop", -- Kopar
["কপকাকা"] = "opk", -- Kopkaka
["কোরাফে-ইয়েঘা"] = "kpr", -- Korafe-Yegha
["কোরাক"] = "koz", -- Korak
["কোরাণা"] = "kqz", -- Korana
["কোরান্ডজে"] = "kcy", -- Korandje
["কোরিয়ান"] = "ko", -- Korean
["কোরিয়ান সাইন ল্যাঙ্গুয়েজ"] = "kvk", -- Korean Sign Language
["কোরেগুয়াজে"] = "coe", -- Koreguaje
["কোরেস-এ রোস্তাম"] = "okh", -- Koresh-e Rostam
["কোরকু"] = "kfq", -- Korku
["কোরলাই ক্রেওল পর্তুগিজ"] = "vkp", -- Korlai Creole Portuguese
["কোরো (ভারত)"] = "jkr", -- Koro (India)
["কোরো (ভানুয়াতু)"] = "krf", -- Koro (Vanuatu)
["কোরো (পশ্চিম আফ্রিকা)"] = "kfo", -- Koro (West Africa)
["কোরোমফে"] = "kfz", -- Koromfé
["কোরোমিরা"] = "kqj", -- Koromira
["করোনাডাল ব্লান"] = "bpr", -- Koronadal Blaan
["কোরোনি"] = "xkq", -- Koroni
["কোরপ"] = "krp", -- Korop
["কোরোপো"] = "xxr", -- Koropó
["কোরোশি"] = "ktl", -- Koroshi
["কোরোয়াই"] = "khe", -- Korowai
["কোর্রা কোরাগা"] = "kfd", -- Korra Koraga
["কোরুবো"] = "xor", -- Korubo
["কোরুপুন-সেলা"] = "kpq", -- Korupun-Sela
["কোরওয়া"] = "kfp", -- Korwa
["কোরিয়াক"] = "kpy", -- Koryak
["কোসাদলে"] = "kiq", -- Kosadle
["কোসারেক ইয়াল"] = "kkl", -- Kosarek Yale
["কোসেনা"] = "kze", -- Kosena
["কোশিন"] = "kid", -- Koshin
["কোসরিয়ান"] = "kos", -- Kosraean
["কোটা (গাবন)"] = "koq", -- Kota (Gabon)
["কোটা (ভারত)"] = "kfe", -- Kota (India)
["কোটা ভাঙ্গুন কুতাই মালয়"] = "mqg", -- Kota Bangun Kutai Malay
["কোটা মারুদু তালান্তাং"] = "grm", -- Kota Marudu Talantang
["কোটা মারুদু টিনাগাস"] = "ktr", -- Kota Marudu Tinagas
["কোটাফোন গ্বে"] = "kqk", -- Kotafon Gbe
["কোটাভা"] = "avk", -- Kotava
["কোটি"] = "eko", -- Koti
["কোট্ট"] = "zko", -- Kott
["কাউ"] = "snz", -- Kou
["কৌইয়া"] = "kyf", -- Kouya
["কোয়াই"] = "kqb", -- Kovai
["কোভে"] = "kvc", -- Kove
["কোয়াকি"] = "xow", -- Kowaki
["কোয়াই"] = "kwh", -- Kowiai
["কয় সানজাক সুরাত"] = "kqd", -- Koy Sanjaq Surat
["কোয়া"] = "kff", -- Koya
["কোয়াগা"] = "kga", -- Koyaga
["কোয়ো"] = "koh", -- Koyo
["কোইরা চিন্নি"] = "khq", -- Koyra Chiini
["কোইরাবোরো সেন্নি"] = "ses", -- Koyraboro Senni
["কয়ুকোন"] = "koy", -- Koyukon
["কেপাগুয়া"] = "kuw", -- Kpagua
["কপালা"] = "kpl", -- Kpala
["কপান"] = "kpk", -- Kpan
["কপাসাম"] = "pbn", -- Kpasam
["কপাতি"] = "koc", -- Kpati
["কপাতিলি"] = "kym", -- Kpatili
["কপি"] = "cpo", -- Kpee
["কপেল্লে"] = "kpe", -- Kpelle
["কপেসি"] = "kef", -- Kpessi
["কপ্লাং"] = "kph", -- Kplang
["ক্রাচে"] = "kye", -- Krache
["ক্রাহো"] = "xra", -- Krahô
["ক্রাওল"] = "rka", -- Kraol
["ক্রেনাক"] = "kqq", -- Krenak
["ক্রেশ"] = "krs", -- Kresh
["ক্রেভিনিয়ান"] = "zkv", -- Krevinian
["ক্রেয়ে"] = "xre", -- Kreye
["ক্রিকাটি-টিম্বিরা"] = "xri", -- Krikati-Timbira
["ক্রিম"] = "krm", -- Krim
["ক্রিও"] = "kri", -- Krio
["ক্রিসা"] = "ksi", -- Krisa
["ক্রিস্টাং"] = "mcm", -- Kristang
["ক্রোবু"] = "kxb", -- Krobu
["ক্রঙ্গো"] = "kgo", -- Krongo
["ক্রুং"] = "krr", -- Kru'ng
["ক্রিমচাক"] = "jct", -- Krymchak
["ক্রিটস"] = "kry", -- Kryts
["কুয়া"] = "tyu", -- Kua
["কুয়া-নসি"] = "ykn", -- Kua-nsi
["কুয়ামাসি"] = "yku", -- Kuamasi
["কুয়ান"] = "uan", -- Kuan
["কুয়ানহুয়া"] = "xnh", -- Kuanhua
["কুব"] = "kgf", -- Kube
["কুবী"] = "kof", -- Kubi
["কুবো"] = "jko", -- Kubo
["কুবু"] = "kvb", -- Kubu
["কুকং"] = "lkc", -- Kucong
["কুদিয়া"] = "kfg", -- Kudiya
["কুডমালি"] = "kyw", -- Kudmali
["কুডু-কামো"] = "kov", -- Kudu-Camo
["কুগামা"] = "kow", -- Kugama
["কুগবো"] = "kes", -- Kugbo
["কুগু-মুমিন"] = "xmh", -- Kugu-Muminh
["কুই (ভারত)"] = "kxu", -- Kui (India)
["কুই (ইন্দোনেশিয়া)"] = "kvd", -- Kui (Indonesia)
["কুইজাও"] = "dkr", -- Kuijau
["কুইকুরো"] = "kui", -- Kuikúro
["কুজার্গ"] = "vkj", -- Kujarge
["কুক"] = "kfn", -- Kuk
["কুকাতজা"] = "kux", -- Kukatja
["কুকেলে"] = "kez", -- Kukele
["কুক্কুজি"] = "urj-kuk", -- Kukkuzi
["কুকনা"] = "kex", -- Kukna
["কুকু-মাংক"] = "xmq", -- Kuku-Mangk
["কুকু-মুইন"] = "xmp", -- Kuku-Mu'inh
["কুকু-থাইপান"] = "typ", -- Kuku-Thaypan
["কুকু-উগবান"] = "ugb", -- Kuku-Ugbanh
["কুকু-উয়ান"] = "uwa", -- Kuku-Uwanh
["কুকু-য়ালানজি"] = "gvn", -- Kuku-Yalanji
["কুলা"] = "tpg", -- Kula
["কুলাল"] = "glj", -- Kulaal
["কুলেড়ে"] = "kul", -- Kulere
["কুলফা"] = "kxj", -- Kulfa
["কুলিনা"] = "xpk", -- Kulina
["কুলিসুসু"] = "vkl", -- Kulisusu
["কুল্লু পাহাড়ি"] = "kfx", -- Kullu Pahari
["কুলন"] = "uon", -- Kulon
["কুলন-পাজেহ"] = "uun", -- Kulon-Pazeh
["কুলুং"] = "kle", -- Kulung
["কুমাক"] = "nee", -- Kumak
["কুমালু"] = "ksl", -- Kumalu
["কুমাম"] = "kdi", -- Kumam
["কুম্যান"] = "kue", -- Kuman
["কুমায়নি"] = "kfy", -- Kumaoni
["কুমারভাগ পাহাড়িয়া"] = "kmj", -- Kumarbhag Paharia
["কুম্বা"] = "ksm", -- Kumba
["কুম্বাইংগার"] = "kgs", -- Kumbainggar
["কুম্বারণ"] = "wkb", -- Kumbaran
["কুম্বেওয়াহা"] = "xks", -- Kumbewaha
["কুমেইয়া"] = "nai-kum", -- Kumeyaay
["কুমহালি"] = "kra", -- Kumhali
["কুমু"] = "kmw", -- Kumu
["কুমুকিও"] = "kuo", -- Kumukio
["কুমিক"] = "kum", -- Kumyk
["কুমজারি"] = "zum", -- Kumzari
["কুনা"] = "cuk", -- Kuna
["কুনামা"] = "kun", -- Kunama
["কুনবারলাং"] = "wlg", -- Kunbarlang
["কুন্দা"] = "kdn", -- Kunda
["কুনদাল শাহী"] = "shd", -- Kundal Shahi
["কুনডুভাদি"] = "wku", -- Kunduvadi
["কং"] = "kfl", -- Kung
["কুনগারাখানি"] = "ggk", -- Kungarakany
["কুনগার্দুটি"] = "gdt", -- Kungardutyi
["কুনগারি"] = "kgl", -- Kunggari
["কুনগারি"] = "lku", -- Kungkari
["কুনি"] = "kse", -- Kuni
["কুনি-বোয়াজি"] = "kvg", -- Kuni-Boazi
["কুনগামি"] = "xug", -- Kunigami
["কুনিমাইপা"] = "kup", -- Kunimaipa
["কুনজা"] = "pep", -- Kunja
["কুঞ্জন"] = "kjn", -- Kunjen
["কুনয়ি"] = "njx", -- Kunyi
["কুনজা"] = "kuz", -- Kunza
["কুও"] = "xuo", -- Kuo
["কুওত"] = "kto", -- Kuot
["কুপা"] = "kug", -- Kupa
["কুপাং মালয়"] = "mkn", -- Kupang Malay
["কুপিয়া"] = "key", -- Kupia
["কুপসাবিণ্য"] = "kpz", -- Kupsabiny
["কুর"] = "kuv", -- Kur
["কুর এদে নাগও"] = "nqk", -- Kura Ede Nago
["কুরমা"] = "krh", -- Kurama
["কুরানকো"] = "knk", -- Kuranko
["কুরি"] = "nbn", -- Kuri
["কুরিয়া"] = "kuj", -- Kuria
["কুরিচিয়া"] = "kfh", -- Kurichiya
["কুরমুকর"] = "kfv", -- Kurmukar
["কুরনাই"] = "unn", -- Kurnai
["কুররাম"] = "vku", -- Kurrama
["কুর্তি"] = "ktm", -- Kurti
["কুরতজার"] = "gdj", -- Kurtjar
["কুর্তোপ"] = "xkz", -- Kurtöp
["কুরুডু"] = "kjr", -- Kurudu
["কুরুখ"] = "kru", -- Kurukh
["কুরুয়া"] = "kyr", -- Kuruáya
["কুসাল"] = "kus", -- Kusaal
["কুসাগহে"] = "ksg", -- Kusaghe
["কুশি"] = "kuh", -- Kushi
["কুস্তেনা"] = "awd-kus", -- Kustenau
["কুসু"] = "ksv", -- Kusu
["কুসুন্দা"] = "kgg", -- Kusunda
["কুট্যাং ঘালে"] = "ght", -- Kutang Ghale
["কুতেনাই"] = "kut", -- Kutenai
["কুতাপ"] = "kub", -- Kutep
["কুথানত"] = "xut", -- Kuthant
["কুট্টো"] = "kpa", -- Kutto
["কুতু"] = "kdc", -- Kutu
["কুটুরমি"] = "khj", -- Kuturmi
["কুক থায়র"] = "thd", -- Kuuk Thaayorre
["কুক ইয়াক"] = "uky", -- Kuuk Yak
["কুকু-য়া'উ"] = "kuy", -- Kuuku-Ya'u
["কুভালে"] = "olu", -- Kuvale
["কুভি"] = "kxv", -- Kuvi
["কুওয়া"] = "blh", -- Kuwaa
["কুওয়াটা"] = "cwt", -- Kuwaataay
["কুওয়ানি"] = "paa-kwn", -- Kuwani
["কুই"] = "kdt", -- Kuy
["কভেন"] = "fkv", -- Kven
["কোয়াদজা"] = "wka", -- Kw'adza
["কোয়া"] = "bko", -- Kwa'
["কোয়ামি"] = "ksq", -- Kwaami
["কোয়াডি"] = "kwz", -- Kwadi
["কোয়াইও"] = "kwd", -- Kwaio
["কোয়াজা"] = "kdz", -- Kwaja
["কোয়াক"] = "kwq", -- Kwak
["কোয়াক'ওয়ালা"] = "kwk", -- Kwak'wala
["কোয়াকুম"] = "kwu", -- Kwakum
["কোয়ালহিওকোয়া-ত্লাতস্কানাই"] = "qwt", -- Kwalhioqua-Tlatskanai
["কোয়ামা"] = "kmq", -- Kwama
["কোয়াম্বি"] = "kwm", -- Kwambi
["কোয়ামেরা"] = "tnk", -- Kwamera
["কোয়ামি"] = "ktf", -- Kwami
["কোয়ামতিম ওয়ান"] = "okk", -- Kwamtim One
["কোয়াং"] = "kvi", -- Kwang
["কোয়াঙ্গা"] = "kwj", -- Kwanga
["কোয়াঙ্গালি"] = "kwn", -- Kwangali
["কোয়াঞ্জা"] = "knp", -- Kwanja
["কোয়াঙ্কা"] = "bij", -- Kwanka
["কোয়ানিয়ামা"] = "kj", -- Kwanyama
["কোয়ারা'আই"] = "kwf", -- Kwara'ae
["কোয়াসিও"] = "nmg", -- Kwasio
["কোয়ায়া"] = "kya", -- Kwaya
["কোয়াজা"] = "xwa", -- Kwaza
["কুইগু"] = "xwg", -- Kwegu
["কওয়ার"] = "kwr", -- Kwer
["কওয়ার্বা"] = "kwe", -- Kwerba
["কওয়ার্বা মাম্বেরা"] = "xwr", -- Kwerba Mamberamo
["কওয়ার"] = "cwe", -- Kwere
["কওয়ারিসা"] = "kkb", -- Kwerisa
["কওয়েসে"] = "kws", -- Kwese
["কপশ্চিমেন"] = "kwt", -- Kwesten
["কুইনি"] = "gww", -- Kwini
["কুইনসু"] = "kuc", -- Kwinsu
["কুইনটি"] = "kww", -- Kwinti
["কোওমা"] = "kmo", -- Kwoma
["কোওমতরি"] = "kwo", -- Kwomtari
["কিয়াক"] = "bka", -- Kyak
["কিয়াকা"] = "kyc", -- Kyaka
["কিয়াকালা"] = "tuw-kkl", -- Kyakala
["কিয়ান-কারিয়াও নাগা"] = "nqq", -- Kyan-Karyaw Naga
["কিয়েনেল"] = "kql", -- Kyenele
["কিয়েঙ্গা"] = "tye", -- Kyenga
["কিয়েরুং"] = "kgy", -- Kyerung
["কিরগিজ"] = "ky", -- Kyrgyz
["কাটে"] = "kmg", -- Kâte
["কেলে"] = "keb", -- Kélé
["কোমনজো"] = "paa-kom", -- Kómnzo
["লা'বি"] = "lbi", -- La'bi
["লাল"] = "gdm", -- Laal
["লালা"] = "cae", -- Laalaa
["লাবা"] = "lau", -- Laba
["ল্যাবেল"] = "lbb", -- Label
["লাবীর"] = "jku", -- Labir
["লাবো"] = "mwi", -- Labo
["লাবো ফোয়া"] = "ypb", -- Labo Phowa
["লাবোয়া"] = "lmy", -- Laboya
["লাবু"] = "lbu", -- Labu
["লাবুক-কিনাভাতানগান কাদাজান"] = "dtb", -- Labuk-Kinabatangan Kadazan
["লাকানডন"] = "lac", -- Lacandon
["লাচি"] = "lbt", -- Lachi
["লাচিগুইরি জাপোটেক"] = "zpa", -- Lachiguiri Zapotec
["লাচিক্সিও জাপোটেক"] = "zpl", -- Lachixío Zapotec
["লাদাখি"] = "lbj", -- Ladakhi
["লাদিন"] = "lld", -- Ladin
["লাদিনো"] = "lad", -- Ladino
["লাদজি-লাদজি"] = "llj", -- Ladji-Ladji
["লাইকো-লিবুয়াত"] = "lkl", -- Laeko-Libuat
["লাফোফা"] = "laf", -- Lafofa
["লাঘু"] = "lgb", -- Laghu
["লাঘুউ"] = "lgh", -- Laghuu
["লাগওয়ান"] = "kot", -- Lagwan
["লাহা (ইন্দোনেশিয়া)"] = "lhh", -- Laha (Indonesia)
["লাহা (ভিয়েতনাম)"] = "lha", -- Laha (Vietnam)
["লাহানান"] = "lhn", -- Lahanan
["লাহান্ডা"] = "lah", -- Lahnda
["লাহতা কারেন"] = "kvt", -- Lahta Karen
["লাহু"] = "lhu", -- Lahu
["লাহু শি"] = "lhi", -- Lahu Shi
["লাহুল লোহার"] = "lhl", -- Lahul Lohar
["লাই"] = "cnh", -- Lai
["লাইমবুয়ে"] = "lmx", -- Laimbue
["লাইতু চিন"] = "clj", -- Laitu Chin
["লাইয়োলো"] = "lji", -- Laiyolo
["লাক"] = "lbe", -- Lak
["লাকা"] = "lak", -- Laka
["লাকালি"] = "lka", -- Lakalei
["লেক মিউক"] = "lmw", -- Lake Miwok
["লাখা"] = "lkh", -- Lakha
["লাকি"] = "lki", -- Laki
["লাক্কিয়া"] = "lbc", -- Lakkia
["লাকোন"] = "lkn", -- Lakon
["লাকোন্ডে"] = "lkd", -- Lakondê
["লাকোটা"] = "lkt", -- Lakota
["লাকোটা ডিডা"] = "dic", -- Lakota Dida
["লালা (নিউ গিনি)"] = "nrz", -- Lala (New Guinea)
["লালা (দক্ষিণ আফ্রিকা)"] = "bnt-lal", -- Lala (South Africa)
["লালা-বিসা"] = "leb", -- Lala-Bisa
["লালা-রোবা"] = "lla", -- Lala-Roba
["লামানা চিনান্তে"] = "cnl", -- Lalana Chinantec
["লামা বাই"] = "lay", -- Lama Bai
["লামাহোলোট"] = "slp", -- Lamaholot
["লামালেরা"] = "lmr", -- Lamalera
["লামাং"] = "hia", -- Lamang
["লামাতুকা"] = "lmq", -- Lamatuka
["লাম্বা"] = "lam", -- Lamba
["লাম্বাদি"] = "lmn", -- Lambadi
["লাম্বিচং"] = "lmh", -- Lambichhong
["লাম্বিয়া"] = "lai", -- Lambya
["লামে"] = "bma", -- Lame
["লামেনু"] = "lmu", -- Lamenu
["লামেট"] = "lbn", -- Lamet
["লামজা-ডেংসা-তোলা"] = "ldh", -- Lamja-Dengsa-Tola
["লামকাং"] = "lmk", -- Lamkang
["লাম্মা"] = "lev", -- Lamma
["লামনসো'"] = "lns", -- Lamnso'
["লামোগাই"] = "lmg", -- Lamogai
["লামপুং আপি"] = "ljp", -- Lampung Api
["লামু"] = "llh", -- Lamu
["লামু-লামু"] = "lby", -- Lamu-Lamu
["লানাস লোবু"] = "ruu", -- Lanas Lobu
["লানডোমা"] = "ldm", -- Landoma
["লাং'এ"] = "yne", -- Lang'e
["লাঙ্গাম"] = "lnm", -- Langam
["লাঙ্গবাশে"] = "lna", -- Langbashe
["লাঙ্গী"] = "lag", -- Langi
["লাংনিয়ান বুইয়াং"] = "yln", -- Langnian Buyang
["লাঙ্গো (সুদান)"] = "lno", -- Lango (Sudan)
["লাঙ্গো (উগান্ডা)"] = "laj", -- Lango (Uganda)
["লানিমা"] = "lnw", -- Lanima
["লানোহ"] = "lnh", -- Lanoh
["লাও"] = "lo", -- Lao
["লাও নাগা"] = "nlq", -- Lao Naga
["লাওমিয়ান"] = "lwm", -- Laomian
["লাওপাং"] = "lbg", -- Laopang
["লাওস সাইন ল্যাঙ্গুয়েজ"] = "lso", -- Laos Sign Language
["লাপাগুইয়া-গুইভিনি জাপোটেক"] = "ztl", -- Lapaguía-Guivini Zapotec
["ল্যাপাইন"] = "art-lap", -- Lapine
["লাপুইয়ান সুবানুন"] = "laa", -- Lapuyan Subanun
["লারাগিয়া"] = "lrg", -- Laragia
["লারান্টুকা মালয়"] = "lrt", -- Larantuka Malay
["লারডিল"] = "lbz", -- Lardil
["লারিস্তানি"] = "lrl", -- Larestani
["লারিকে-ওয়াকাসিহু"] = "alo", -- Larike-Wakasihu
["লারো"] = "lro", -- Laro
["লারতেহ"] = "lar", -- Larteh
["লারু"] = "lan", -- Laru
["লারেভাত"] = "lrv", -- Larëvat
["লাসালিমু"] = "llm", -- Lasalimu
["লাসগেরদি"] = "lsa", -- Lasgerdi
["লাশি"] = "lsi", -- Lashi
["লাসি"] = "lss", -- Lasi
["লাতগালিয়ান"] = "ltg", -- Latgalian
["লাতিন"] = "la", -- Latin
["লাতু"] = "ltu", -- Latu
["লাতুনদে"] = "ltn", -- Latundê
["লাতভিয়ান"] = "lv", -- Latvian
["লাতভিয়ান সাইন ল্যাঙ্গুয়েজ"] = "lsl", -- Latvian Sign Language
["লাউ"] = "llu", -- Lau
["লাউয়া"] = "luf", -- Laua
["লাউয়ান"] = "llx", -- Lauan
["লাউজ"] = "law", -- Lauje
["লওরা"] = "lur", -- Laura
["লরেনশিয়ান"] = "lre", -- Laurentian
["লাভাতবুরা-লামুসং"] = "lbv", -- Lavatbura-Lamusong
["লাভ"] = "brb", -- Lave
["লাভেন"] = "lbo", -- Laven
["লাভুকালেভে"] = "lvk", -- Lavukaleve
["লাওয়াঙ্গান"] = "lbx", -- Lawangan
["লাভি"] = "lvi", -- Lawi
["লাউ"] = "lwu", -- Lawu
["লাউউনুয়া"] = "tgi", -- Lawunuia
["লায়াখা"] = "lya", -- Layakha
["লাজ"] = "lzz", -- Laz
["লাজে"] = "tbq-laz", -- Laze
["লিয়ালাও চিনান্তে"] = "cle", -- Lealao Chinantec
["লেকো"] = "lec", -- Leco
["লেডো কাইলি"] = "lew", -- Ledo Kaili
["লীলু"] = "ldk", -- Leelau
["লেফা"] = "lfa", -- Lefa
["লেগা-মওয়েঙ্গা"] = "lgm", -- Lega-Mwenga
["লেগা-শাবুনডা"] = "lea", -- Lega-Shabunda
["লেগবো"] = "agb", -- Legbo
["লেগেনিয়েম"] = "lcc", -- Legenyem
["লেহালি"] = "tql", -- Lehali
["লেইনংসং নাগা"] = "lzn", -- Leinong Naga
["লেইপন"] = "lek", -- Leipon
["লেইঝউ মিন"] = "luh", -- Leizhou Min
["লেলা"] = "dri", -- Lela
["লেলাক"] = "llk", -- Lelak
["লেলে (চাদ)"] = "lln", -- Lele (Chad)
["লেলে (কঙ্গো)"] = "lel", -- Lele (Congo)
["লেলে (গিনি)"] = "llc", -- Lele (Guinea)
["লেলে (পাপুয়া নিউ গিনি)"] = "lle", -- Lele (Papua New Guinea)
["লেলেমি"] = "lef", -- Lelemi
["লেলেপা"] = "lpa", -- Lelepa
["লেমবেনা"] = "leq", -- Lembena
["লেমেরিগ"] = "lrz", -- Lemerig
["লেমিও"] = "lei", -- Lemio
["লেমিয়ান"] = "xle", -- Lemnian
["লেমোলাং"] = "ley", -- Lemolang
["লেমোরো"] = "ldj", -- Lemoro
["লেনাকেল"] = "tnl", -- Lenakel
["লেন্দু"] = "led", -- Lendu
["লেঙ্গিলু"] = "lgi", -- Lengilu
["লেঙ্গো"] = "lgr", -- Lengo
["লেঙ্গোলা"] = "lej", -- Lengola
["লেনজে"] = "leh", -- Lenje
["লেনকাউ"] = "ler", -- Lenkau
["লেনিয়িমা"] = "ldg", -- Lenyima
["লেওনিজ"] = "roa-leo", -- Leonese
["লেপচা"] = "lep", -- Lepcha
["লেপকি"] = "lpe", -- Lepki
["লেপন্টিক"] = "xlp", -- Lepontic
["লেড়ে"] = "gnh", -- Lere
["লেসে"] = "les", -- Lese
["লেসিং-গেলিমী"] = "let", -- Lesing-Gelimi
["লেতেম্বোই"] = "nms", -- Letemboi
["লেটি"] = "lti", -- Leti
["লেভুকা"] = "lvu", -- Levuka
["লেবো"] = "lww", -- Lewo
["লেবো এলেনগ"] = "lwe", -- Lewo Eleng
["লেবোতোবি"] = "lwt", -- Lewotobi
["লেইইঘা"] = "ayi", -- Leyigha
["লেজগি"] = "lez", -- Lezgi
["লাহো ভো"] = "mhx", -- Lhao Vo
["লহকপু"] = "lhp", -- Lhokpu
["লি'ও"] = "ljl", -- Li'o
["লিয়াবুকু"] = "lix", -- Liabuku
["লিয়ানা-সেটি"] = "ste", -- Liana-Seti
["লিয়াংমাই নাগা"] = "njn", -- Liangmai Naga
["লাইবেরিয়া কপেল্লে"] = "xpe", -- Liberia Kpelle
["লাইবেরিয়ান ক্রেয়ল"] = "lir", -- Liberian Kreyol
["লিবিনজা"] = "liz", -- Libinza
["লিবন বিকোল"] = "lbl", -- Libon Bikol
["লিবুরনিয়ান"] = "xli", -- Liburnian
["লিবিয়ান আরবি"] = "ayl", -- Libyan Arabic
["লিবিয়ান সাইন ল্যাঙ্গুয়েজ"] = "lbs", -- Libyan Sign Language
["লিগবি"] = "lig", -- Ligbi
["লিগেঞ্জা"] = "lgz", -- Ligenza
["লিগুরিয়ান"] = "lij", -- Ligurian
["লিহির"] = "lih", -- Lihir
["লিকা"] = "lik", -- Lika
["লিকি"] = "lio", -- Liki
["লিকিলা"] = "lie", -- Likila
["লিকুবা"] = "kxx", -- Likuba
["লিকুম"] = "lib", -- Likum
["লিকওয়ালা"] = "kwc", -- Likwala
["লিলউ"] = "lll", -- Lilau
["লিলুয়েত"] = "lil", -- Lillooet
["লিমাস্সা"] = "bme", -- Limassa
["লিম্বু"] = "lif", -- Limbu
["লিম্বুম"] = "lmp", -- Limbum
["লিম্বুরগিশ"] = "li", -- Limburgish
["লিমী"] = "ylm", -- Limi
["লিমিলঙ্গান"] = "lmc", -- Limilngan
["লিমোস কালিঙ্গা"] = "kmk", -- Limos Kalinga
["লিন্ডু"] = "klw", -- Lindu
["লিনিয়ার এ"] = "lab", -- Linear A
["লিঙ্গালা"] = "ln", -- Lingala
["লিঙ্গাও"] = "onb", -- Lingao
["লিংখিম"] = "lii", -- Lingkhim
["লিঙ্গুয়া ফ্রাঙ্কা নোভা"] = "lfn", -- Lingua Franca Nova
["লিনগিথিগ"] = "lnj", -- Linngithigh
["লিপান"] = "apl", -- Lipan
["লিপো"] = "lpo", -- Lipo
["লিসাবাতা-নুনিয়ালী"] = "lcs", -- Lisabata-Nuniali
["লিসেল্লা"] = "lcl", -- Lisela
["লিশ"] = "lsh", -- Lish
["লিশানা দেনি"] = "lsd", -- Lishana Deni
["লিশানিদ নোশান"] = "aij", -- Lishanid Noshan
["লিশান দিদান"] = "trg", -- Lishán Didán
["লিসু"] = "lis", -- Lisu
["লিটারারি চাইনিজ"] = "lzh", -- Literary Chinese
["লিথুয়ানিয়ান"] = "lt", -- Lithuanian
["লিথুয়ানিয়ান সাইন ল্যাঙ্গুয়েজ"] = "lls", -- Lithuanian Sign Language
["লিটল সোয়ানপোর্ট"] = "aus-lsw", -- Little Swanport
["লিটজলিটজ"] = "lzl", -- Litzlitz
["লিভোনিয়ান"] = "liv", -- Livonian
["লিভি"] = "olo", -- Livvi
["লিজু"] = "sit-liz", -- Lizu
["লো-তোগা"] = "lht", -- Lo-Toga
["লোয়ার্কি"] = "lrk", -- Loarki
["লোবালা"] = "loq", -- Lobala
["লোবি"] = "lob", -- Lobi
["লোধি"] = "lbm", -- Lodhi
["লোগবা"] = "lgq", -- Logba
["লোগো"] = "log", -- Logo
["লোগল"] = "lof", -- Logol
["লোগুলি"] = "rag", -- Logooli
["লোগোরিক"] = "liu", -- Logorik
["লোজবান"] = "jbo", -- Lojban
["লোকা"] = "yaz", -- Lokaa
["লোকো"] = "lok", -- Loko
["লোকোনো"] = "arw", -- Lokono
["লোকোয়া"] = "lky", -- Lokoya
["লোলা"] = "lcd", -- Lola
["লোলাক"] = "llq", -- Lolak
["লোলে"] = "llg", -- Lole
["লোলো"] = "llb", -- Lolo
["লোলোডা"] = "loa", -- Loloda
["লোলোপো"] = "ycl", -- Lolopo
["লোমা"] = "lom", -- Loma
["লোমাইভিটি"] = "lmv", -- Lomaiviti
["লোমাক্কা"] = "loi", -- Lomakka
["লোমাভরেন"] = "rmi", -- Lomavren
["লম্বার্ড"] = "lmo", -- Lombard
["লম্বি"] = "lmi", -- Lombi
["লম্বো"] = "loo", -- Lombo
["লোমওয়ে"] = "ngl", -- Lomwe
["লোনকং"] = "lce", -- Loncong
["লং ফুরি নাগা"] = "lpn", -- Long Phuri Naga
["লং ওয়াত"] = "ttw", -- Long Wat
["লংগু"] = "lgu", -- Longgu
["লংজিয়া"] = "sit-lnj", -- Longjia
["লংটো"] = "wok", -- Longto
["লংগুডা"] = "lnu", -- Longuda
["লংয়ান মিন"] = "nan-lnx", -- Longyan Min
["লোনিউ"] = "los", -- Loniu
["লোনওলওল"] = "crc", -- Lonwolwol
["লু"] = "ldo", -- Loo
["লোপা"] = "lop", -- Lopa
["লোপে"] = "yiu", -- Lope
["লোপি"] = "lov", -- Lopi
["লোপিট"] = "lpx", -- Lopit
["লোরাঙ্গ"] = "lrn", -- Lorang
["লোরিয়াদিয়াকার্কার"] = "lnn", -- Lorediakarkar
["লোরেইন"] = "roa-lor", -- Lorrain
["লোটে"] = "uvl", -- Lote
["লোথা নাগা"] = "njh", -- Lotha Naga
["লোটুড"] = "dtr", -- Lotud
["লোটুকো"] = "lot", -- Lotuko
["লৌ"] = "loj", -- Lou
["লুইজিয়ানা ক্রেওল"] = "lou", -- Louisiana Creole
["লুন"] = "lox", -- Loun
["লুপ এ"] = "xlo", -- Loup A
["লুপ বি"] = "xlb", -- Loup B
["লোভোনো"] = "vnk", -- Lovono
["লো জার্মান"] = "nds", -- Low German
["লোয়ার বুরডেকিন"] = "xbb", -- Lower Burdekin
["লোয়ার শেহালিস"] = "cea", -- Lower Chehalis
["লোয়ার গ্র্যান্ড ভ্যালি ডানি"] = "dni", -- Lower Grand Valley Dani
["লোয়ার নসsob"] = "nsb", -- Lower Nossob
["লোয়ার সোরবিয়ান"] = "dsb", -- Lower Sorbian
["লোয়ার দক্ষিণি অ্যারান্ডা"] = "axl", -- Lower Southern Aranda
["লোয়ার তা'ওই"] = "tto", -- Lower Ta'oih
["লোয়ার তানানা"] = "taa", -- Lower Tanana
["লোল্যান্ড ওক্সাকা চন্টাল"] = "clo", -- Lowland Oaxaca Chontal
["লোল্যান্ড তারাহুমারা"] = "tac", -- Lowland Tarahumara
["লক্সিকা জাপোটেক"] = "ztp", -- Loxicha Zapotec
["লোজি"] = "loz", -- Lozi
["লুয়াং"] = "lex", -- Luang
["লুবা-কাসাই"] = "lua", -- Luba-Kasai
["লুবা-কাতাঙ্গা"] = "lu", -- Luba-Katanga
["লুবিল]"] = "kcc", -- Lubila
["লুবু"] = "lcf", -- Lubu
["লুবুয়াগান কালিঙ্গা"] = "knb", -- Lubuagan Kalinga
["লুচাজি"] = "lch", -- Luchazi
["লুকুমী"] = "luq", -- Lucumí
["লুডিয়ান"] = "lud", -- Ludian
["লুফু"] = "ldq", -- Lufu
["লুগান্ডা"] = "lg", -- Luganda
["লুগবারা"] = "lgg", -- Lugbara
["লুগুরু"] = "ruf", -- Luguru
["লুহু"] = "lcq", -- Luhu
["লুহইয়া"] = "luy", -- Luhya
["লুইম্বি"] = "lum", -- Luimbi
["লুইসেনিয়ো"] = "lui", -- Luiseño
["লুকপা"] = "dop", -- Lukpa
["লুলে"] = "ule", -- Lule
["লুলে সামি"] = "smj", -- Lule Sami
["লুম্বা-ইয়াক্খা"] = "luu", -- Lumba-Yakkha
["লুম্বি"] = "lmz", -- Lumbee
["লুম্বু"] = "lup", -- Lumbu
["লুমুন"] = "lmd", -- Lumun
["লুন বাওয়াং"] = "lnd", -- Lun Bawang
["লুনা"] = "luj", -- Luna
["লুনানakha"] = "luk", -- Lunanakha
["লুনদা"] = "lun", -- Lunda
["লুঙ্গা"] = "lga", -- Lungga
["লুও"] = "luo", -- Luo
["লুওপোহে হ্মং"] = "hml", -- Luopohe Hmong
["লুরেন"] = "sit-lrn", -- Luren
["লুরি (নাইজেরিয়া)"] = "ldd", -- Luri (Nigeria)
["লুসেঙ্গো"] = "lse", -- Lusengo
["লুশুটসিড"] = "lut", -- Lushootseed
["লুসি"] = "khl", -- Lusi
["লুসিটানিয়ান"] = "xls", -- Lusitanian
["লুটাচোনি"] = "lts", -- Lutachoni
["লুটোস"] = "ndy", -- Lutos
["লুটুভ"] = "clt", -- Lutuv
["লুভালে"] = "lue", -- Luvale
["লুভাতি"] = "luv", -- Luwati
["লুভিয়ান"] = "xlu", -- Luwian
["লুবো"] = "lwo", -- Luwo
["লাক্সেমবার্গিশ"] = "lb", -- Luxembourgish
["লুইয়ানা"] = "lyn", -- Luyana
["লওয়ালো"] = "lwa", -- Lwalu
["লওয়েল"] = "lvl", -- Lwel
["লাইসিয়ান"] = "xlc", -- Lycian
["লাইডিয়ান"] = "xld", -- Lydian
["লিংঙ্গাম"] = "lyg", -- Lyngngam
["লিয়েল"] = "lee", -- Lyélé
["লা'আদান"] = "ldn", -- Láadan
["লা'আ লা'আ ব্বামু"] = "bwj", -- Láá Láá Bwamu
["লয়োপ"] = "urr", -- Löyöp
["লু"] = "khb", -- Lü
["মা"] = "msj", -- Ma
["মা মান্ডা"] = "skc", -- Ma Manda
["মা'আনয়ান"] = "mhy", -- Ma'anyan
["মা'দি"] = "mhi", -- Ma'di
["মা'য়া"] = "slz", -- Ma'ya
["মাকা"] = "mew", -- Maaka
["মালে"] = "mdy", -- Maale
["মাসাই"] = "mas", -- Maasai
["মায়"] = "ymm", -- Maay
["মাবা"] = "mqa", -- Maba
["মাবালে"] = "mmz", -- Mabaale
["মাবান"] = "mfz", -- Mabaan
["মাবাকা ভ্যালি কালিঙ্গা"] = "kkg", -- Mabaka Valley Kalinga
["মাবিরে"] = "muj", -- Mabire
["মাকা"] = "mca", -- Maca
["মাকাগুয়াজে"] = "mcl", -- Macaguaje
["মাকাগুয়ান"] = "mbn", -- Macaguán
["মাকানিস"] = "mzs", -- Macanese
["মাকাউ পিডজিন পর্তুগিজ"] = "crp-mpp", -- Macau Pidgin Portuguese
["ম্যাসেডোনিয়ান"] = "mk", -- Macedonian
["মাচামে"] = "jmc", -- Machame
["মাচিগুয়েঙ্গা"] = "mcb", -- Machiguenga
["মাচিনেরে"] = "mpd", -- Machinere
["মাচিঙ্গা"] = "mvw", -- Machinga
["ম্যাকোরিস"] = "nai-mac", -- Macoris
["মাকুনা"] = "myy", -- Macuna
["মাকুশি"] = "mbc", -- Macushi
["মাদা (ক্যামেরুন)"] = "mxu", -- Mada (Cameroon)
["মাদা (নাইজেরিয়া)"] = "mda", -- Mada (Nigeria)
["মাদাগাস্কার সাইন ল্যাঙ্গুয়েজ"] = "mzc", -- Madagascar Sign Language
["মাদাক"] = "mmx", -- Madak
["মাদেন"] = "xmx", -- Maden
["মাধি মাধি"] = "dmd", -- Madhi Madhi
["মাদি"] = "grg", -- Madi
["মাডঙ্গেলে"] = "zml", -- Madngele
["মাডুকায়াং কালিঙ্গা"] = "kmd", -- Madukayang Kalinga
["মাদুরিস"] = "mad", -- Madurese
["মায়েং ইতনেগ"] = "itt", -- Maeng Itneg
["মাফা"] = "maf", -- Mafa
["মাগ-আঞ্চী আইতা"] = "sgb", -- Mag-Anchi Ayta
["মাগ-ইন্ডি আইতা"] = "blx", -- Mag-Indi Ayta
["মাগাহাত"] = "mtw", -- Magahat
["মাগাহী"] = "mag", -- Magahi
["মাগদালেনা পেনাসকো মিক্সটেক"] = "xtm", -- Magdalena Peñasco Mixtec
["মাগিয়ি"] = "gmg", -- Magiyi
["মাগোমা"] = "gmx", -- Magoma
["মাগোরি"] = "zgr", -- Magori
["মাগুইন্দানাও"] = "mdh", -- Maguindanao
["মাগি"] = "gkd", -- Magɨ
["মাহালি"] = "mjx", -- Mahali
["মাহাসু পাহাড়ি"] = "bfz", -- Mahasu Pahari
["মাহিকান"] = "mjy", -- Mahican
["মাহংওয়ে"] = "mhb", -- Mahongwe
["মাহু"] = "mxx", -- Mahou
["মাইয়া"] = "sks", -- Maia
["মাইয়াডোম্মু"] = "mzz", -- Maiadomu
["মাইয়ানি"] = "tnh", -- Maiani
["মাই"] = "mmm", -- Maii
["মাইলু"] = "mgu", -- Mailu
["মাইনডো"] = "cwb", -- Maindo
["মাইপুরে"] = "awd-mpr", -- Maipure
["মাইরাসি"] = "zrs", -- Mairasi
["মাইসিন"] = "mbq", -- Maisin
["মৈথিলী"] = "mai", -- Maithili
["মাইওয়া (ইন্দোনেশিয়া)"] = "wmm", -- Maiwa (Indonesia)
["মাইওয়া (নিউ গিনি)"] = "mti", -- Maiwa (New Guinea)
["মাইওয়ালা"] = "mum", -- Maiwala
["মাজাং"] = "mpe", -- Majang
["মাজেরা"] = "xmj", -- Majera
["মাঝি"] = "mjz", -- Majhi
["মাজওয়ার"] = "mmj", -- Majhwar
["মাক (চীন)"] = "mkg", -- Mak (China)
["মাক (নাইজেরিয়া)"] = "pbl", -- Mak (Nigeria)
["মাকা"] = "mcp", -- Makaa
["মাকাহ"] = "myh", -- Makah
["মাকালেড়ো"] = "mjb", -- Makalero
["মাকাসাই"] = "mkz", -- Makasae
["মাকাসার"] = "mak", -- Makasar
["মাকাসার মালয়"] = "mfp", -- Makassar Malay
["মাকায়াম"] = "aup", -- Makayam
["মাখুয়া"] = "vmw", -- Makhuwa
["মাখুয়া-মাররেভোন"] = "xmc", -- Makhuwa-Marrevone
["মাখুয়া-মিট্টো"] = "mgh", -- Makhuwa-Meetto
["মাখুয়া-মোনিগা"] = "mhm", -- Makhuwa-Moniga
["মাখুয়া-সাকা"] = "xsq", -- Makhuwa-Saka
["মাখুয়া-শিরিমা"] = "vmk", -- Makhuwa-Shirima
["মাকলেভ"] = "mgf", -- Maklew
["মাকোলকল"] = "zmh", -- Makolkol
["মাকোন্ডে"] = "kde", -- Makonde
["মাকু"] = "xak", -- Maku
["মাকু'আ"] = "lva", -- Maku'a
["মাকুরি নাগা"] = "jmn", -- Makuri Naga
["মাকুরাপ"] = "mpu", -- Makuráp
["মাকওয়ে"] = "ymk", -- Makwe
["মাকিয়ান নাগা"] = "umn", -- Makyan Naga
["মাল"] = "mlf", -- Mal
["মাল পাহাড়ি"] = "mkb", -- Mal Paharia
["মালা (নিউ গিনি)"] = "ped", -- Mala (New Guinea)
["মালা (নাইজেরিয়া)"] = "ruy", -- Mala (Nigeria)
["মালা মালাসার"] = "ima", -- Mala Malasar
["মাল্যাকান ক্রেওল মালয়"] = "ccm", -- Malaccan Creole Malay
["মালাগাছি"] = "mg", -- Malagasy
["মালালামাই"] = "mmt", -- Malalamai
["মালাল]"] = "sai-mal", -- Malalí
["মালঙ্গো"] = "mln", -- Malango
["মালানকুরাভান"] = "mjo", -- Malankuravan
["মালপান্ডরাম"] = "mjp", -- Malapandaram
["মালরািয়ান"] = "mjq", -- Malaryan
["মালা"] = "mkr", -- Malas
["মালাসাঙ্গা"] = "mqz", -- Malasanga
["মালাসার"] = "ymr", -- Malasar
["মালাভেদান"] = "mjr", -- Malavedan
["মালাউই লোমওয়ে"] = "lon", -- Malawi Lomwe
["মালাউইয়ান সাইন ল্যাঙ্গুয়েজ"] = "lws", -- Malawian Sign Language
["মালয়"] = "ms", -- Malay
["মালয়ালম"] = "ml", -- Malayalam
["মালয়িক ডায়াক"] = "xdy", -- Malayic Dayak
["মালয়নন"] = "mlz", -- Malaynon
["মালয়েশিয়ান সাইন ল্যাঙ্গুয়েজ"] = "xml", -- Malaysian Sign Language
["মালবা বিরিফর"] = "bfo", -- Malba Birifor
["ম্যালে"] = "mdc", -- Male
["ম্যালেসাইট-পাসসামাকুডি"] = "pqm", -- Malecite-Passamaquoddy
["মালেং"] = "pkt", -- Maleng
["মালু-কিলেন্জে"] = "mgl", -- Maleu-Kilenge
["মালফ্যাক্সাল"] = "mlx", -- Malfaxal
["মালগানা"] = "vml", -- Malgana
["মালগ্বে"] = "mxf", -- Malgbe
["মালি"] = "gcc", -- Mali
["মালিবু"] = "sai-mlb", -- Malibu
["মালিলা"] = "mgq", -- Malila
["মালিম্বা"] = "mzd", -- Malimba
["মালিম্পুং"] = "mli", -- Malimpung
["মালিনালটেপেক ত্লাপানেক"] = "tcf", -- Malinaltepec Tlapanec
["মালোল"] = "mbk", -- Malol
["মাল্টীস"] = "mt", -- Maltese
["মাল্টীস সাইন ল্যাঙ্গুয়েজ"] = "mdl", -- Maltese Sign Language
["মালুয়া বে"] = "mll", -- Malua Bay
["মালভি"] = "mup", -- Malvi
["ম্যালিকু জাইকা"] = "gut", -- Maléku Jaíka
["মাম"] = "mam", -- Mam
["মামা"] = "mma", -- Mama
["মামা"] = "mhf", -- Mamaa
["মামাইন্দে"] = "wmd", -- Mamaindé
["মামানওয়া"] = "mmn", -- Mamanwa
["মামারা সেনুফো"] = "myk", -- Mamara Senoufo
["মামাসা"] = "mqj", -- Mamasa
["মাম্বায়ে"] = "mgm", -- Mambae
["মাম্বাই"] = "mcs", -- Mambai
["মাম্বোরু"] = "mvd", -- Mamboru
["মাম্বে-লুংগু"] = "mgr", -- Mambwe-Lungu
["মামপ্রুলি"] = "maw", -- Mampruli
["মামুজু"] = "mqx", -- Mamuju
["মামুলিক"] = "emm", -- Mamulique
["মামুসি"] = "kdf", -- Mamusi
["মামভু"] = "mdi", -- Mamvu
["ম্যান মেট"] = "mml", -- Man Met
["মানাদো মালয়"] = "xmm", -- Manado Malay
["মানাম"] = "mva", -- Manam
["মানাম্বু"] = "mle", -- Manambu
["মানাঙ্গবা"] = "nmm", -- Manangba
["মানাঙ্গকারি"] = "znk", -- Manangkari
["মানাও"] = "awd-man", -- Manao
["মাঞ্চু"] = "mnc", -- Manchu
["মান্ডা (অস্ট্রেলিয়া)"] = "zma", -- Manda (Australia)
["মান্ডা (ভারত)"] = "mha", -- Manda (India)
["মান্ডা (তানজানিয়া)"] = "mgs", -- Manda (Tanzania)
["মান্ডাহুয়াকা"] = "mht", -- Mandahuaca
["মান্ডাইক"] = "mid", -- Mandaic
["মান্ডাইলিং বাতাক"] = "btm", -- Mandailing Batak
["মান্ডালোড়িয়ান"] = "art-man", -- Mandalorian
["মান্ডান"] = "mhq", -- Mandan
["মান্ডানডানি"] = "zmk", -- Mandandanyi
["মান্দার"] = "mdr", -- Mandar
["মান্দারা"] = "tbf", -- Mandara
["মান্দারি"] = "mqu", -- Mandari
["ম্যান্ডারিন"] = "cmn", -- Mandarin
["মান্দিয়ালী"] = "mjl", -- Mandeali
["মান্দার"] = "mqr", -- Mander
["মান্দিংগো"] = "man", -- Mandingo
["মান্দিঙ্কা"] = "mnk", -- Mandinka
["মানজাক"] = "mfv", -- Mandjak
["মানডোবো আতাস"] = "aax", -- Mandobo Atas
["মানডোবো বাওয়াহ"] = "bwp", -- Mandobo Bawah
["মানেম"] = "jet", -- Manem
["মাং"] = "zng", -- Mang
["মঙ্গলা"] = "mem", -- Mangala
["মাঙ্গারায়ী"] = "mpc", -- Mangarayi
["মানগারেভান"] = "mrv", -- Mangarevan
["মাঙ্গাস"] = "zns", -- Mangas
["মাঙ্গায়াত"] = "myj", -- Mangayat
["মাঙ্গবেতু"] = "mdj", -- Mangbetu
["মাঙ্গবুটু"] = "mdk", -- Mangbutu
["মাঙ্গের"] = "zme", -- Mangerr
["মাংগা বুয়াং"] = "mmo", -- Mangga Buang
["মাংগারাই"] = "mqy", -- Manggarai
["মাংঘুয়ের"] = "mjg-mgr", -- Mangghuer
["মাঙ্গো"] = "mge", -- Mango
["মাঙ্গোলে"] = "mqc", -- Mangole
["মাঙ্গসেং"] = "mbh", -- Mangseng
["মানিগরি-কাম্বোলে এদে নাগও"] = "xkb", -- Manigri-Kambolé Ede Nago
["মানিকিয়ন"] = "mnx", -- Manikion
["মানিপা"] = "mqp", -- Manipa
["মৈতৈ মণিপুরী"] = "mni", -- মৈতৈ মণিপুরী
["মান্কানিয়া"] = "knf", -- Mankanya
["মান্কিয়ালী"] = "nlm", -- Mankiyali
["মান্না-ডোরা"] = "mju", -- Manna-Dora
["মান্নান"] = "mjv", -- Mannan
["মানো"] = "mev", -- Mano
["মানোম্বাই"] = "woo", -- Manombai
["মানসাকা"] = "msk", -- Mansaka
["মানসোয়াঙ্কা"] = "msw", -- Mansoanka
["মান্তা"] = "myg", -- Manta
["মানৎসি"] = "nty", -- Mantsi
["মানুমানাও কারেন"] = "kxf", -- Manumanaw Karen
["মানুস কোরো"] = "kxr", -- Manus Koro
["মানুসেলা"] = "wha", -- Manusela
["ম্যানক্স"] = "gv", -- Manx
["মানিয়া"] = "mzj", -- Manya
["মান্যাওয়া"] = "mny", -- Manyawa
["মানজা"] = "mzv", -- Manza
["মাও নাগা"] = "nbi", -- Mao Naga
["মাওনান"] = "mmd", -- Maonan
["মাওরে কোমোরিয়ান"] = "swb", -- Maore Comorian
["মাওরি"] = "mi", -- Maori
["মাপ"] = "mlh", -- Mape
["মাপেনা"] = "mnm", -- Mapena
["মাপিয়া"] = "mpy", -- Mapia
["মাপিদিয়ান"] = "mpw", -- Mapidian
["মাপোস বুয়াং"] = "bzh", -- Mapos Buang
["মাপোয়ো"] = "mcg", -- Mapoyo
["মাপুডুঙ্গুন"] = "arn", -- Mapudungun
["মাপুন"] = "sjm", -- Mapun
["মারা"] = "mec", -- Mara
["মারা চিন"] = "mrh", -- Mara Chin
["মারাচি"] = "lri", -- Marachi
["মারাঘেই"] = "vmh", -- Maraghei
["মারগাস"] = "mrs", -- Maragus
["মারাম নাগা"] = "nma", -- Maram Naga
["মারামা"] = "lrm", -- Marama
["মারানাও"] = "mrw", -- Maranao
["মারানুনগু"] = "zmr", -- Maranungku
["মারারিত"] = "mgb", -- Mararit
["মারাঠি"] = "mr", -- Marathi
["মারাতিনো"] = "sai-mar", -- Maratino
["মারৌ"] = "mvr", -- Marau
["মারওয়ান"] = "awd-mar", -- Marawan
["মার্বা"] = "mpg", -- Marba
["মারেনজে"] = "vmr", -- Marenje
["মারফা"] = "mvu", -- Marfa
["মার্گانی"] = "zmc", -- Margany
["মার্ঘী দক্ষিণ"] = "mfm", -- Marghi South
["মার্জি"] = "mrt", -- Margi
["মারিয়া"] = "mds", -- Maria
["মারিয়াতে"] = "awd-mrt", -- Mariaté
["মারিকোপা"] = "mrc", -- Maricopa
["মারিদান"] = "zmd", -- Maridan
["মারিজাবিন"] = "zmj", -- Maridjabin
["মারিক"] = "dad", -- Marik
["মারিমানিন্দজি"] = "zmm", -- Marimanindji
["মারিন্ড"] = "mrz", -- Marind
["মারিং"] = "mbw", -- Maring
["মারিং নাগা"] = "nng", -- Maring Naga
["মারিঙ্গাr"] = "zmt", -- Maringarr
["মারি"] = "mqi", -- Mariri
["মেরিটাইম সাইন ল্যাঙ্গুয়েজ"] = "nsr", -- Maritime Sign Language
["মারিতসাউআ"] = "msp", -- Maritsauá
["মারিয়াপোল গ্রিক"] = "grk-mar", -- Mariupol Greek
["মারিয়াদি"] = "zmy", -- Mariyedi
["মার্ক"] = "rkm", -- Marka
["মার্কুইটা"] = "enb", -- Markweeta
["মারমা"] = "rmz", -- Marma
["মারুন স্পিরিট ল্যাঙ্গুয়েজ"] = "crp-mar", -- Maroon Spirit Language
["মারোভো"] = "mvo", -- Marovo
["মার্গু"] = "mhg", -- Marrgu
["মার্রিয়াম্মু"] = "xru", -- Marriammu
["মার্রিথিয়েল"] = "mfr", -- Marrithiyel
["মার্রুসিনিয়ান"] = "umc", -- Marrucinian
["মার্শালিস"] = "mh", -- Marshallese
["মার্সিয়ান"] = "ims", -- Marsian
["মার্থা'স ভিনইয়ার্ড সাইন ল্যাঙ্গুয়েজ"] = "mre", -- Martha's Vineyard Sign Language
["মার্টি কে"] = "zmg", -- Marti Ke
["মার্তু ওয়াঙ্কা"] = "mpj", -- Martu Wangka
["মার্তুথুনিরা"] = "vma", -- Martuthunira
["মারোয়ারি"] = "mwr", -- Marwari
["মারুবো"] = "mzr", -- Marúbo
["মাসাবা"] = "myx", -- Masaba
["মাসাদিত ইতনেগ"] = "tis", -- Masadiit Itneg
["মাসাকারা"] = "sai-msk", -- Masakará
["মাসালিট"] = "mls", -- Masalit
["মাসানা"] = "mcn", -- Masana
["মাসবাতে সোরসোগন"] = "bks", -- Masbate Sorsogon
["মাসবাতেঞো"] = "msb", -- Masbatenyo
["মাশকো পিরো"] = "cuj", -- Mashco Piro
["মাশি"] = "mho", -- Mashi
["মাসিমাসি"] = "ism", -- Masimasi
["মাসিওয়াং"] = "bnf", -- Masiwang
["মাস্কেলাইনস"] = "klv", -- Maskelynes
["মাসলাম"] = "msv", -- Maslam
["মাসমাজে"] = "mes", -- Masmaje
["ম্যাসাচুসেট"] = "wam", -- Massachusett
["মাসালট"] = "mdg", -- Massalat
["মাসেপ"] = "mvs", -- Massep
["মাতাগালপা"] = "mtn", -- Matagalpa
["মাতাল"] = "mfh", -- Matal
["মাতানাউই"] = "sai-mat", -- Matanawi
["মাতবাত"] = "xmt", -- Matbat
["মাতেনগো"] = "mgv", -- Matengo
["মাতেপি"] = "mqe", -- Matepi
["মাটিগসালুগ মানোবো"] = "mbt", -- Matigsalug Manobo
["মাটিপুহি"] = "mzo", -- Matipuhy
["মাতলাতজিঙ্কা"] = "mat", -- Matlatzinca
["মাতো"] = "met", -- Mato
["মাতো গ্রোসো আরারা"] = "axg", -- Mato Grosso Arára
["মাতোর"] = "mtm", -- Mator
["মাতসেস"] = "mcf", -- Matsés
["মাত্তোল"] = "mvb", -- Mattole
["মাতুকার"] = "mjk", -- Matukar
["মাতুম্বি"] = "mgw", -- Matumbi
["মাত্যা সামো"] = "stj", -- Matya Samo
["মাতীস"] = "mpq", -- Matís
["মাউং"] = "mph", -- Maung
["মরিশিয়ান ক্রেওল"] = "mfe", -- Mauritian Creole
["মরিশিয়ান সাইন ল্যাঙ্গুয়েজ"] = "lsy", -- Mauritian Sign Language
["মাউওয়াকে"] = "mhl", -- Mauwake
["মাভিয়া"] = "mkv", -- Mav̋ea
["মাওয়া"] = "mcw", -- Mawa
["মাওয়াক"] = "mjj", -- Mawak
["মাওয়ান"] = "mcz", -- Mawan
["মাওয়ায়ানা"] = "mzx", -- Mawayana
["মাউচি"] = "mke", -- Mawchi
["মাওয়েস"] = "mgk", -- Mawes
["মাক্সাকালি"] = "mbl", -- Maxakalí
["মাক্সি গ্বে"] = "mxl", -- Maxi Gbe
["মায়া সামো"] = "sym", -- Maya Samo
["মায়াগুদুনা"] = "xmy", -- Mayaguduna
["মায়াংনা"] = "yan", -- Mayangna
["মায়াওয়ালি"] = "yxa", -- Mayawali
["মায়ব্রাত"] = "ayz", -- Maybrat
["মায়েকা"] = "myc", -- Mayeka
["মাই-থাকুর্তি"] = "xyt", -- Mayi-Thakurti
["মাইকুলান"] = "mnt", -- Maykulan
["মাইনাস"] = "sai-mys", -- Maynas
["মায়ো"] = "mfy", -- Mayo
["মায়োগো"] = "mdm", -- Mayogo
["মায়োয়াও ইফুকাও"] = "ifu", -- Mayoyao Ifugao
["মাজাগওয়ে"] = "dkx", -- Mazagway
["মাজালটেপেক জাপোটেক"] = "zpy", -- Mazaltepec Zapotec
["মাজান্দারানি"] = "mzn", -- Mazanderani
["মাজাটলান মাজাতেক"] = "vmz", -- Mazatlán Mazatec
["মাজাটলান মিক্সে"] = "mzl", -- Mazatlán Mixe
["মবা"] = "mfc", -- Mba
["ম্বাবরাম"] = "vmb", -- Mbabaram
["ম্বালা"] = "mdp", -- Mbala
["ম্বালানহু"] = "lnb", -- Mbalanhu
["ম্বান্ডজা"] = "zmz", -- Mbandja
["ম্বাঙ্গালা"] = "mxg", -- Mbangala
["ম্বাঙ্গি"] = "mgn", -- Mbangi
["ম্বাঙ্গওয়ে"] = "zmn", -- Mbangwe
["ম্বারা (অস্ট্রেলিয়া)"] = "mvl", -- Mbara (Australia)
["ম্বারা (চাদ)"] = "mpk", -- Mbara (Chad)
["ম্বারিমান-গুধিনমা"] = "zmv", -- Mbariman-Gudhinma
["ম্বাটি"] = "mdn", -- Mbati
["ম্বাতো"] = "gwa", -- Mbato
["ম্বাই"] = "myb", -- Mbay
["ম্বে"] = "mfo", -- Mbe
["ম্বে'"] = "mtk", -- Mbe'
["ম্বেলিম"] = "mql", -- Mbelime
["ম্বেরে"] = "mdt", -- Mbere
["ম্বেস"] = "zms", -- Mbesa
["ম্বিউওম"] = "aus-mbi", -- Mbiywom
["ম্বো (ক্যামেরুন)"] = "mbo", -- Mbo (Cameroon)
["ম্বো (কঙ্গো)"] = "zmw", -- Mbo (Congo)
["ম্বোই"] = "moi", -- Mboi
["ম্বোকো"] = "mdu", -- Mboko
["ম্বোলে"] = "mdq", -- Mbole
["ম্বোঙ্গা"] = "xmb", -- Mbonga
["ম্বোঙ্গনো"] = "bgu", -- Mbongno
["ম্বোসি"] = "mdw", -- Mbosi
["ম্বোওয়ে"] = "mxo", -- Mbowe
["ম্ব্রে"] = "mka", -- Mbre
["ম্বু'"] = "muc", -- Mbu'
["ম্বুদুম"] = "xmd", -- Mbudum
["ম্বুগু"] = "mhd", -- Mbugu
["ম্বুগওয়ে"] = "mgz", -- Mbugwe
["ম্বুকো"] = "mqb", -- Mbuko
["ম্বুকুশু"] = "mhw", -- Mbukushu
["ম্বুলা"] = "mna", -- Mbula
["ম্বুলা-বওয়াজ্জা"] = "mbu", -- Mbula-Bwazza
["ম্বুলে"] = "mlb", -- Mbule
["ম্বুলুঙ্গিশ"] = "mbv", -- Mbulungish
["ম্বুম"] = "mdd", -- Mbum
["ম্বুন্দা"] = "mck", -- Mbunda
["ম্বুঙ্গা"] = "mgy", -- Mbunga
["ম্বুরকু"] = "bbt", -- Mburku
["ম্বুউন"] = "zmp", -- Mbuun
["ম্বুওয়েলা"] = "mfu", -- Mbwela
["ম্বিয়া গুয়ারানি"] = "gun", -- Mbyá Guaraní
["মে'এন"] = "mym", -- Me'en
["মেয়া"] = "meg", -- Mea
["মেবু"] = "mjn", -- Mebu
["মেকায়াপন নাহুয়াতল"] = "nhx", -- Mecayapan Nahuatl
["মেদেবুড়"] = "mjm", -- Medebur
["মেদেফাইড্রিন"] = "dmf", -- Medefaidrin
["মিডিয়া লেংগুয়া"] = "mue", -- Media Lengua
["মেডনিজ আলেউট"] = "mud", -- Mednyj Aleut
["মেডুম্বা"] = "byv", -- Medumba
["মেফেলে"] = "mfj", -- Mefele
["মেগাম"] = "mef", -- Megam
["মেগলেনো-রোমানিয়ান"] = "ruq", -- Megleno-Romanian
["মেহেক"] = "nux", -- Mehek
["মেহিনাকু"] = "mmh", -- Mehináku
["মেহরি"] = "gdq", -- Mehri
["মেকেও"] = "mek", -- Mekeo
["মেকমেক"] = "mvk", -- Mekmek
["মেকওয়েই"] = "msf", -- Mekwei
["মেকেন্স"] = "skf", -- Mekéns
["মেল-খাওন"] = "hkn", -- Mel-Khaonh
["মেলে-ফিলা"] = "mxe", -- Mele-Fila
["মেলো"] = "mfx", -- Melo
["মেলপা"] = "med", -- Melpa
["মেমোনি"] = "mby", -- Memoni
["মেনডালম কায়ান"] = "xkd", -- Mendalam Kayan
["মেনডাঙ্কওয়ে-নকওয়েন"] = "mfd", -- Mendankwe-Nkwen
["মেন্ডে"] = "men", -- Mende
["মেঙ্গাকা"] = "xmg", -- Mengaka
["মেঙ্গেন"] = "mee", -- Mengen
["মেঙ্গিছা"] = "leo", -- Mengisa
["মেনিয়ান"] = "sai-men", -- Menien
["মেনকা"] = "mea", -- Menka
["মেনোমিনি"] = "mez", -- Menominee
["মেন্টাওয়াই"] = "mwv", -- Mentawai
["মেনিয়া"] = "mcr", -- Menya
["মেওসওয়ার"] = "mvx", -- Meoswar
["মের"] = "mnu", -- Mer
["মেরামেরা"] = "mxm", -- Meramera
["মেরে"] = "lmb", -- Merei
["মেরেয়"] = "meq", -- Merey
["মেরিয়াম"] = "ulk", -- Meriam
["মেরোইটিক"] = "xmr", -- Meroitic
["মেরু"] = "mer", -- Meru
["মেসাকা"] = "iyo", -- Mesaka
["মেসে"] = "mci", -- Mese
["মেসমে"] = "zim", -- Mesme
["মেসমেস"] = "mys", -- Mesmes
["মেসক্যান"] = "mvz", -- Mesqan
["মেসাপিক"] = "cms", -- Messapic
["মেটা'"] = "mgo", -- Meta'
["মেটলাটোনক মিক্সটেক"] = "mxv", -- Metlatónoc Mixtec
["মেওয়ারি"] = "mtr", -- Mewari
["মেওয়াতি"] = "wtm", -- Mewati
["মেক্সিকান সাইন ল্যাঙ্গুয়েজ"] = "mfs", -- Mexican Sign Language
["মেয়া"] = "mej", -- Meyah
["মেজনটলা পোপোলোকা"] = "pbe", -- Mezontla Popoloca
["মেজকুইটাল ওটোমি"] = "ote", -- Mezquital Otomi
["মেয়াংকিয়েলি"] = "fit", -- Meänkieli
["মফিনু"] = "zmf", -- Mfinu
["মফুমতে"] = "nfu", -- Mfumte
["মগবো"] = "gmz", -- Mgbo
["মি'কমাক"] = "mic", -- Mi'kmaq
["মিয়ামি"] = "mia", -- Miami
["মিয়ান"] = "mpt", -- Mian
["মিয়ানি"] = "pla", -- Miani
["মিচা"] = "yiq", -- Micha
["মিচিফ"] = "crg", -- Michif
["মিচিগামেয়া"] = "cmm", -- Michigamea
["মিচোয়াকান মাজাহুয়া"] = "mmc", -- Michoacán Mazahua
["মিচোয়াকান নাহুয়াতল"] = "ncl", -- Michoacán Nahuatl
["মিড গ্র্যান্ড ভ্যালি ডানি"] = "dnt", -- Mid Grand Valley Dani
["মিড-দক্ষিণি বান্ডা"] = "bjo", -- Mid-Southern Banda
["মধ্যযুগীয় আর্মেনিয়ান"] = "axm", -- Middle Armenian
["মধ্যযুগীয় আসামিজ"] = "inc-mas", -- Middle Assamese
["মধ্যযুগীয় বাংলা"] = "inc-mbn", -- Middle Bengali
["মধ্যযুগীয় ব্রেটন"] = "xbm", -- Middle Breton
["মধ্যযুগীয় চীনা"] = "ltc", -- Middle Chinese
["মধ্যযুগীয় কর্নিশ"] = "cnx", -- Middle Cornish
["মধ্যযুগীয় ডাচ"] = "dum", -- Middle Dutch
["মধ্যযুগীয় ইংরেজি"] = "enm", -- Middle English
["মধ্যযুগীয় ফরাসি"] = "frm", -- Middle French
["মধ্যযুগীয় গুজরাটি"] = "inc-mgu", -- Middle Gujarati
["মধ্যযুগীয় হাই জার্মান"] = "gmh", -- Middle High German
["মধ্যযুগীয় আইরিশ"] = "mga", -- Middle Irish
["মধ্যযুগীয় কান্নাডা"] = "dra-mkn", -- Middle Kannada
["মধ্যযুগীয় খেমার"] = "xhm", -- Middle Khmer
["মধ্যযুগীয় কোরিয়ান"] = "okm", -- Middle Korean
["মধ্যযুগীয় লো জার্মান"] = "gml", -- Middle Low German
["মধ্যযুগীয় মিডিয়ান"] = "xme-mid", -- Middle Median
["মধ্যযুগীয় মন"] = "mkh-mmn", -- Middle Mon
["মধ্যযুগীয় মঙ্গোল"] = "xng", -- Middle Mongol
["মধ্যযুগীয় নেওয়ার"] = "nwx", -- Middle Newar
["মধ্যযুগীয় নরওয়েজিয়ান"] = "gmq-mno", -- Middle Norwegian
["মধ্যযুগীয় ওড়িয়া"] = "inc-mor", -- Middle Odia
["মধ্যযুগীয় পার্সিয়ান"] = "pal", -- Middle Persian
["মধ্যযুগীয় স্কটস"] = "gmw-msc", -- Middle Scots
["মধ্যযুগীয় ভিয়েতনামী"] = "mkh-mvi", -- Middle Vietnamese
["মধ্যযুগীয় ওয়াতুত"] = "mpl", -- Middle Watut
["মধ্যযুগীয় ওয়েলশ"] = "wlm", -- Middle Welsh
["মিডব"] = "mei", -- Midob
["মিগামা"] = "mmy", -- Migaama
["মিগাবাক"] = "mpp", -- Migabac
["মিজি"] = "sjl", -- Miji
["মিজু"] = "mxj", -- Miju
["মিকাসুকি"] = "mik", -- Mikasuki
["মিলাং"] = "tbq-mil", -- Milang
["মিলি"] = "ymh", -- Mili
["মিল্লকায়াক"] = "sai-mil", -- Millcayac
["মিলতু"] = "mlj", -- Miltu
["মিলুক"] = "iml", -- Miluk
["মিলিয়ান"] = "imy", -- Milyan
["মিমি অফ ডেকোর্স"] = "mis-mmd", -- Mimi of Decorse
["মিমি অফ নাখটিগাল"] = "mis-mmn", -- Mimi of Nachtigal
["মিন নান"] = "nan", -- Min Nan
["মিনা"] = "hna", -- Mina
["মিনাইয়ান"] = "inm", -- Minaean
["মিনং"] = "xrg", -- Minang
["মিনাঙ্গাাবাউ"] = "min", -- Minangkabau
["মিনানিবাই"] = "mcv", -- Minanibai
["মিনাবেহা"] = "mvn", -- Minaveha
["মিন্ডেরিকো"] = "drc", -- Minderico
["মিন্ডিরি"] = "mpn", -- Mindiri
["মিংগাং দোসো"] = "mko", -- Mingang Doso
["মিঙ্গো"] = "iro-min", -- Mingo
["মিংরেলিয়ান"] = "xmf", -- Mingrelian
["মিনিকা হুইটোটো"] = "hto", -- Minica Huitoto
["মিনিডিয়েন"] = "wii", -- Minidien
["মিনিগির"] = "vmg", -- Minigir
["মিনজুংবাল"] = "xjb", -- Minjungbal
["মিনকিন"] = "xxm", -- Minkin
["মিনোয়ান"] = "omn", -- Minoan
["মিনোকোক"] = "mqq", -- Minokok
["মিনরিক"] = "mnq", -- Minriq
["মিন্টিল"] = "mzt", -- Mintil
["মিরান্ডেস"] = "mwl", -- Mirandese
["মিরায় বিকোল"] = "rbl", -- Miraya Bikol
["মিরে"] = "mvh", -- Mire
["মিরগান"] = "zrg", -- Mirgan
["মিরিটি"] = "mmv", -- Miriti
["মিরিভুং সাইন ল্যাঙ্গুয়েজ"] = "rsm", -- Miriwoong Sign Language
["মিরিভুং"] = "mep", -- Miriwung
["মিরপুর পাঞ্জাবি"] = "pmu", -- Mirpur Panjabi
["মিসান্টলা টোটোনাক"] = "tlc", -- Misantla Totonac
["মিশিপ"] = "mjs", -- Miship
["মিসিমা-পানেয়াটি"] = "mpx", -- Misima-Paneati
["মিসিঙ্গ"] = "mrg", -- Mising
["মিস্কিতো"] = "miq", -- Miskito
["মিটলা জাপোটেক"] = "zaw", -- Mitla Zapotec
["মিটলাতঙ্গো মিক্সটেক"] = "vmm", -- Mitlatongo Mixtec
["মিট্টু"] = "mwu", -- Mittu
["মিটুকো"] = "zmq", -- Mituku
["মিউ"] = "mpo", -- Miu
["মিওয়া"] = "vmi", -- Miwa
["মিক্সড গ্রেট আন্দামানিজ"] = "gac", -- Mixed Great Andamanese
["মিক্সিফোর"] = "mfg", -- Mixifore
["মিক্সটেপেক মিক্সটেক"] = "mix", -- Mixtepec Mixtec
["মিক্সটেপেক জাপোটেক"] = "zpm", -- Mixtepec Zapotec
["মিয়া"] = "mkf", -- Miya
["মিয়াকো"] = "mvi", -- Miyako
["মিয়োবে"] = "soy", -- Miyobe
["মিজো"] = "lus", -- Mizo
["ম্লাবরি"] = "mra", -- Mlabri
["ম্লাহসো"] = "lhs", -- Mlahsö
["ম্লাপ"] = "kja", -- Mlap
["ম্লম্প"] = "mlo", -- Mlomp
["ম্মালা"] = "mmu", -- Mmaala
["ম্মানি"] = "buy", -- Mmani
["ম্মেন"] = "bfm", -- Mmen
["মো"] = "wkd", -- Mo
["মো'দা"] = "gbn", -- Mo'da
["মোয়াবাইট"] = "obm", -- Moabite
["মোবা"] = "mfq", -- Moba
["মোবিলিয়ান"] = "mod", -- Mobilian
["মোবুমরিন আইজি"] = "ahm", -- Mobumrin Aizi
["মোকানা"] = "sai-mcn", -- Mocana
["মোচি"] = "old", -- Mochi
["মোচিকা"] = "omc", -- Mochica
["মোচো"] = "mhc", -- Mocho
["মোকোভী"] = "moc", -- Mocoví
["মোড্যাং"] = "mxd", -- Modang
["মোডোলে"] = "mqo", -- Modole
["মোয়েরে"] = "mvq", -- Moere
["মোফু-গুদুর"] = "mif", -- Mofu-Gudur
["মোগোলি"] = "mhj", -- Mogholi
["মোগুম"] = "mou", -- Mogum
["মোহাক"] = "moh", -- Mohawk
["মোহেগান-পেকুওট"] = "xpq", -- Mohegan-Pequot
["মোই (কঙ্গো)"] = "mow", -- Moi (Congo)
["মোই (ইন্দোনেশিয়া)"] = "mxn", -- Moi (Indonesia)
["মোইকোদি"] = "mkp", -- Moikodi
["মোইঙ্গি"] = "mwz", -- Moingi
["মোজাভে"] = "mov", -- Mojave
["মোজি"] = "ymi", -- Moji
["মোক"] = "mqt", -- Mok
["মোকেন"] = "mwt", -- Moken
["মোকেরাং"] = "mft", -- Mokerang
["মোকিলিস"] = "mkj", -- Mokilese
["মোকলেন"] = "mkm", -- Moklen
["মোকোলে"] = "mkl", -- Mokole
["মোকপওয়ে"] = "bri", -- Mokpwe
["মোকশা"] = "mdf", -- Moksha
["মোলালে"] = "mbe", -- Molale
["মোলবগ"] = "pwm", -- Molbog
["মলডোভা সাইন ল্যাঙ্গুয়েজ"] = "vsi", -- Moldova Sign Language
["মোলেঙ্গুয়ে"] = "bxc", -- Molengue
["মোলিমা"] = "mox", -- Molima
["মোলমো ওয়ান"] = "aun", -- Molmo One
["মলো"] = "zmo", -- Molo
["মোলোফ"] = "msl", -- Molof
["মোলোকো"] = "mlw", -- Moloko
["মম জাংগো"] = "ver", -- Mom Jango
["মোমা"] = "myl", -- Moma
["মোমারে"] = "msz", -- Momare
["মোম্বো ডোগন"] = "dmb", -- Mombo Dogon
["মোম্বুম"] = "mso", -- Mombum
["মোমিনা"] = "mmb", -- Momina
["মোমুনা"] = "mqf", -- Momuna
["মন"] = "mnw", -- Mon
["মোনাস্টিক সাইন ল্যাঙ্গুয়েজ"] = "mzg", -- Monastic Sign Language
["মোন্ড্রোপোলন"] = "npn", -- Mondropolon
["মোন্দে"] = "mnd", -- Mondé
["মঙ্গুল"] = "mjg-mgl", -- Mongghul
["মঙ্গো"] = "lol", -- Mongo
["মঙ্গোল"] = "mgt", -- Mongol
["মঙ্গোলিয়ান"] = "mn", -- Mongolian
["মঙ্গোলিয়ান সাইন ল্যাঙ্গুয়েজ"] = "msr", -- Mongolian Sign Language
["মঙ্গন্ডাও"] = "mog", -- Mongondow
["মোনি"] = "mnz", -- Moni
["মোনিমবো"] = "mom", -- Monimbo
["মোনো (ক্যালিফোর্নিয়া)"] = "mnr", -- Mono (California)
["মোনো (ক্যামেরুন)"] = "mru", -- Mono (Cameroon)
["মোনো (কঙ্গো)"] = "mnh", -- Mono (Congo)
["মনোম"] = "moo", -- Monom
["মনসাঙ্গ নাগা"] = "nmh", -- Monsang Naga
["মন্টাগনাইস"] = "moe", -- Montagnais
["মন্টানা সালিশ"] = "fla", -- Montana Salish
["মন্টোল"] = "mtl", -- Montol
["মোনুম্বো"] = "mxk", -- Monumbo
["মঞ্জোম্বো"] = "moj", -- Monzombo
["মু"] = "gwg", -- Moo
["মোর"] = "mos", -- Moore
["মুস ক্রী"] = "crm", -- Moose Cree
["মোপান মায়া"] = "mop", -- Mopan Maya
["মোর (অস্ট্রোনেশিয়ান)"] = "mhz", -- Mor (Austronesian)
["মোর (পাপুয়ান)"] = "moq", -- Mor (Papuan)
["মোরাইড"] = "msg", -- Moraid
["মোরান"] = "tbq-mor", -- Moran
["মোরাওয়া"] = "mze", -- Morawa
["মোরেলোস নাহুয়াতল"] = "nhm", -- Morelos Nahuatl
["মোরেরবি"] = "xmo", -- Morerebi
["মোরেসাডা"] = "msx", -- Moresada
["মোরি আতাস"] = "mzq", -- Mori Atas
["মোরি বাওয়াহ"] = "xmz", -- Mori Bawah
["মোরিঙ্গি"] = "mdb", -- Morigi
["মোরো"] = "mor", -- Moro
["মোরক্কান আমাজিঘ"] = "zgh", -- Moroccan Amazigh
["মোরক্কান আরবি"] = "ary", -- Moroccan Arabic
["মোরক্কান সাইন ল্যাঙ্গুয়েজ"] = "xms", -- Moroccan Sign Language
["মোরোকোডো"] = "mgc", -- Morokodo
["মোরোম"] = "bdo", -- Morom
["মোরোনেন"] = "mqn", -- Moronene
["মোরোরি"] = "mok", -- Morori
["মোরুয়াস"] = "mrp", -- Morouas
["মর্টলকিস"] = "mrl", -- Mortlockese
["মোরু"] = "mgd", -- Moru
["মোসিমো"] = "mqv", -- Mosimo
["মোস্কোনা"] = "mtj", -- Moskona
["মোতা"] = "mtt", -- Mota
["মোতেম্বো"] = "tmv", -- Motembo
["মতু"] = "meu", -- Motu
["মউক-আরিয়া"] = "mwh", -- Mouk-Aria
["মাউন্ট ইরাইয়া আগতা"] = "atl", -- Mount Iraya Agta
["মাউন্ট ইরিগা আগতা"] = "agz", -- Mount Iriga Agta
["মাউন্টেন কোইয়ারি"] = "kpx", -- Mountain Koiari
["মউয়াসে"] = "jmw", -- Mouwase
["মোভিমা"] = "mzp", -- Movima
["মোয়াদান ইতনেগ"] = "ity", -- Moyadan Itneg
["মোয়োন নাগা"] = "nmo", -- Moyon Naga
["মোজাম্বিকান সাইন ল্যাঙ্গুয়েজ"] = "mzy", -- Mozambican Sign Language
["মোজারাবিক"] = "mxi", -- Mozarabic
["ম্পাদে"] = "mpi", -- Mpade
["ম্পালিতজান"] = "xpj", -- Mpalitjanh
["ম্পি"] = "mpz", -- Mpi
["ম্পিয়ামো"] = "mcx", -- Mpiemo
["ম্পিইন"] = "bnt-mpi", -- Mpiin
["ম্পিন্দ]"] = "pnd", -- Mpinda
["ম্পংম্পং"] = "mgg", -- Mpongmpong
["ম্পোটো"] = "mpa", -- Mpoto
["ম্পোটোভোরো"] = "mvt", -- Mpotovoro
["ম্পুওন"] = "bnt-mpu", -- Mpuono
["ম্পুর"] = "akc", -- Mpur
["ম্রো চিন"] = "cmr", -- Mro Chin
["ম্রু"] = "mro", -- Mru
["মসের"] = "kqx", -- Mser
["মুয়াক সা-আক"] = "ukk", -- Muak Sa-aak
["মুয়ালাং"] = "mtd", -- Mualang
["মুবামি"] = "tsx", -- Mubami
["মুবি"] = "mub", -- Mubi
["মুচুচি"] = "sai-muc", -- Mucuchí
["মুডা"] = "ymd", -- Muda
["মুদবুরা"] = "dmw", -- Mudburra
["মুডু কোরাগা"] = "vmd", -- Mudu Koraga
["মুডুয়াপা"] = "wiv", -- Muduapa
["মুডুগা"] = "udg", -- Muduga
["মুয়েল্লামা"] = "sai-mue", -- Muellama
["মুফিয়ান"] = "aoj", -- Mufian
["মুহের"] = "sem-mhr", -- Muher
["মুইনানে"] = "bmr", -- Muinane
["মুখা-ডোরা"] = "mmk", -- Mukha-Dora
["মুকুলু"] = "moz", -- Mukulu
["মুলাহা"] = "mfw", -- Mulaha
["মুলাম"] = "mlm", -- Mulam
["মুলাও"] = "giu", -- Mulao
["মুল্লু কুরুম্বা"] = "kpb", -- Mullu Kurumba
["মুল্লুকমুল্লুক"] = "mpb", -- Mullukmulluk
["মুলুরিদিয়ি"] = "vmu", -- Muluridyi
["মুম"] = "kqa", -- Mum
["মুমুয়ে"] = "mzm", -- Mumuye
["মুনা"] = "mnb", -- Muna
["মুন্ডা"] = "unx", -- Munda
["মুন্ডাব্লি"] = "boe", -- Mundabli
["মুন্ডাঙ"] = "mua", -- Mundang
["মুন্ডানি"] = "mnf", -- Mundani
["মুন্ডারী"] = "unr", -- Mundari
["মুন্ডাত"] = "mmf", -- Mundat
["মুন্ডোলিনকো"] = "art-mun", -- Mundolinco
["মুন্ডুরুকু"] = "myu", -- Mundurukú
["মুঙ্গাকা"] = "mhk", -- Mungaka
["মুঙ্গবাম"] = "mij", -- Mungbam
["মুঙ্গুই"] = "mth", -- Munggui
["মুঙ্গকিপ"] = "mpv", -- Mungkip
["মুনিচে"] = "myr", -- Muniche
["মুনিত"] = "mtc", -- Munit
["মুনজি"] = "mnj", -- Munji
["মুনসি"] = "umu", -- Munsee
["মুয়োং"] = "mtq", -- Muong
["মুর পানো"] = "tkv", -- Mur Pano
["মুরাতায়াক"] = "asx", -- Muratayak
["মুরিক (মালয়েশিয়া)"] = "mxr", -- Murik (Malaysia)
["মুরিক (নিউ গিনি)"] = "mtf", -- Murik (New Guinea)
["মুরকিম"] = "rmh", -- Murkim
["মুরলে"] = "mur", -- Murle
["মুর্রিনহ-পাথা"] = "mwf", -- Murrinh-Patha
["মুরসি"] = "muz", -- Mursi
["মুরুই হুইটোটো"] = "huu", -- Murui Huitoto
["মুরূপি"] = "mqw", -- Murupi
["মুরুওয়ারি"] = "zmu", -- Muruwari
["মুসান"] = "mmp", -- Musan
["মুসার"] = "mmi", -- Musar
["মুসাসা"] = "smm", -- Musasa
["মুসেয়"] = "mse", -- Musey
["মুসগু"] = "mug", -- Musgu
["মুসি"] = "mui", -- Musi
["মুস্কুম"] = "mje", -- Muskum
["মুসম"] = "msu", -- Musom
["মুসাও-এমিরা"] = "emi", -- Mussau-Emira
["মুথুভান"] = "muv", -- Muthuvan
["মুতু"] = "tuc", -- Mutu
["মুয়া"] = "mvm", -- Muya
["মুয়াং"] = "muy", -- Muyang
["মুয়ুউ"] = "myw", -- Muyuw
["মুজি"] = "ymz", -- Muzi
["মুজো"] = "sai-muz", -- Muzo
["মভানিপ"] = "mcj", -- Mvanip
["ম্বুভা"] = "mxh", -- Mvuba
["মওয়াঘাভুল"] = "sur", -- Mwaghavul
["ম্বালি কোমোরিয়ান"] = "wlc", -- Mwali Comorian
["ম্বান"] = "moa", -- Mwan
["ম্বানি"] = "wmw", -- Mwani
["ম্বাতেবু"] = "mwa", -- Mwatebu
["মেরা"] = "mwe", -- Mwera
["মওয়ারলাপ"] = "mrm", -- Mwerlap
["মউইম্বি-মুত্থাম্বি"] = "mws", -- Mwimbi-Muthambi
["মওটলাপ"] = "mlv", -- Mwotlap
["মাইসিনাআন গ্রিক"] = "gmy", -- Mycenaean Greek
["মাইনে"] = "mye", -- Myene
["মাইসিয়ান"] = "yms", -- Mysian
["মজিয়েমে নাগা"] = "nme", -- Mzieme Naga
["মাগ্দী"] = "gmd", -- Mághdì
["মোচেনো"] = "mhn", -- Mòcheno
["মুন চিন"] = "mwq", -- Mün Chin
["মুনডু"] = "muh", -- Mündü
["মা"] = "cma", -- Mạ
["ন'কো"] = "nqo", -- N'Ko
["না"] = "nbt", -- Na
["না'ভি"] = "art-nav", -- Na'vi
["নাবা"] = "nao", -- Naaba
["নাবা"] = "mne", -- Naba
["নাবাক"] = "naf", -- Nabak
["নাবি"] = "mty", -- Nabi
["নাচেরিং"] = "ncd", -- Nachering
["নাড্রুভিয়ান"] = "ndf", -- Nadruvian
["নাডেব"] = "mbj", -- Nadëb
["নাফনরা"] = "nfr", -- Nafaanra
["নাফি"] = "srf", -- Nafi
["নাফরি"] = "nxx", -- Nafri
["নাগা পিডজিন"] = "nag", -- Naga Pidgin
["নাগারচাল"] = "nbg", -- Nagarchal
["নাগে"] = "nxe", -- Nage
["নাগতিপুনান আগতা"] = "phi-nag", -- Nagtipunan Agta
["নাগু"] = "ngr", -- Nagu
["নাগুমি"] = "ngv", -- Nagumi
["নাহালি"] = "nlx", -- Nahali
["নাহারি"] = "nhh", -- Nahari
["নাহাবাক"] = "sns", -- Nahavaq
["নাহুয়াতল"] = "nah", -- Nahuatl
["নই"] = "bio", -- Nai
["নাজদি আরবি"] = "ars", -- Najdi Arabic
["নাকা'এলা"] = "nae", -- Naka'ela
["নাকাই"] = "nkj", -- Nakai
["নাকামে"] = "nib", -- Nakame
["নাকানাই"] = "nak", -- Nakanai
["নাকারা"] = "nck", -- Nakara
["নাকে"] = "nbk", -- Nake
["নাকি"] = "mff", -- Naki
["নাকুই"] = "nax", -- Nakwi
["নালকা"] = "nlc", -- Nalca
["নালি"] = "nss", -- Nali
["নালিক"] = "nal", -- Nalik
["নালু"] = "naj", -- Nalu
["নালোগো"] = "nlz", -- Nalögo
["নামাকুরা"] = "nmk", -- Namakura
["নামাত"] = "nkm", -- Namat
["নাম্বিকুয়ারা"] = "nab", -- Nambikwara
["নাম্বো"] = "ncm", -- Nambo
["নাম্বিয়া"] = "nmq", -- Nambya
["নামিয়া"] = "nnm", -- Namia
["নামিয়ায়"] = "nvm", -- Namiae
["নামিবিয়ান সাইন ল্যাঙ্গুয়েজ"] = "nbs", -- Namibian Sign Language
["নামলা"] = "naa", -- Namla
["নামো"] = "mxw", -- Namo
["নামোনুইতো"] = "nmt", -- Namonuito
["নামোসি-নাইতাসিরি-সেরুয়া"] = "bwb", -- Namosi-Naitasiri-Serua
["নামুই"] = "nmy", -- Namuyi
["নানাই"] = "gld", -- Nanai
["নানসের"] = "nnc", -- Nancere
["নানডে"] = "nnb", -- Nande
["নান্ডি"] = "niq", -- Nandi
["নানেরিগে সেনুফো"] = "sen", -- Nanerigé Sénoufo
["নাঙ্গা ডামা ডোগন"] = "nzz", -- Nanga Dama Dogon
["নানকিনা"] = "nnk", -- Nankina
["নান্তি"] = "cox", -- Nanti
["নান্টিকোক"] = "nnt", -- Nanticoke
["নানুবায়ে"] = "afk", -- Nanubae
["নাওলান"] = "nai-nao", -- Naolan
["নাপু"] = "npy", -- Napu
["নার ফু"] = "npa", -- Nar Phu
["নারা"] = "nrb", -- Nara
["নারাক"] = "nac", -- Narak
["নারাঙ্গো"] = "nrg", -- Narango
["নারাউ"] = "nxu", -- Narau
["নারিম"] = "loh", -- Narim
["নারো"] = "nhr", -- Naro
["নারোম"] = "nrm", -- Narom
["নারাগান্সেট"] = "xnt", -- Narragansett
["নারুয়া"] = "nru", -- Narua
["নারুংগা"] = "nnr", -- Narungga
["নারুও"] = "ylo", -- Naruo
["নাসাল"] = "nsy", -- Nasal
["নাসারিয়ান"] = "nvh", -- Nasarian
["নাসিওই"] = "nas", -- Nasioi
["নাসকাপি"] = "nsk", -- Naskapi
["নাসু"] = "ywq", -- Nasu
["নাতাগাইমাস"] = "nts", -- Natagaimas
["নাচেজ"] = "ncz", -- Natchez
["নাতেরনি"] = "ntm", -- Nateni
["নাথেম্বো"] = "nte", -- Nathembo
["নাতিওরো"] = "nti", -- Natioro
["নাতু"] = "sai-nat", -- Natú
["নাতুগু"] = "ntu", -- Natügu
["নাউয়েটে"] = "nxa", -- Nauete
["নউকান্সকি"] = "ynk", -- Naukanski
["নাউনা"] = "ncn", -- Nauna
["নাও"] = "nwo", -- Nauo
["নাউরিয়ান"] = "na", -- Nauruan
["নাভাজো"] = "nv", -- Navajo
["নাবুত"] = "nsw", -- Navut
["নওয়ারু"] = "nwr", -- Nawaru
["নাওয়াথিনেহেনা"] = "nwa", -- Nawathinehena
["নাওডম"] = "nmz", -- Nawdm
["নাওউরি"] = "naw", -- Nawuri
["নাক্সি"] = "nxq", -- Naxi
["নাইয়ি"] = "noz", -- Nayi
["নকানে"] = "ncr", -- Ncane
["নচুম্বুলু"] = "nlu", -- Nchumbulu
["ন্দা'ন্দা'"] = "nnz", -- Nda'nda'
["নদাই"] = "gke", -- Ndai
["নদাকা"] = "ndk", -- Ndaka
["নডালি"] = "ndh", -- Ndali
["নডাম"] = "ndm", -- Ndam
["নডাম্বা"] = "ndj", -- Ndamba
["নডাম্বোম]"] = "nxo", -- Ndambomo
["নডাসা"] = "nda", -- Ndasa
["নডাউ"] = "ndc", -- Ndau
["নদে-গবিতে"] = "ned", -- Nde-Gbite
["নদে-নসেলে-নতা"] = "ndd", -- Nde-Nsele-Nta
["নডেমলি"] = "nml", -- Ndemli
["নডেন্ডেওলে"] = "dne", -- Ndendeule
["নডেনগেরেকো"] = "ndg", -- Ndengereko
["নডিং"] = "eli", -- Nding
["নডজেব্বানা"] = "djj", -- Ndjébbana
["নডো"] = "ndp", -- Ndo
["নডোবো"] = "ndw", -- Ndobo
["নডোয়ে"] = "nbb", -- Ndoe
["নডোগো"] = "ndz", -- Ndogo
["নডোলো"] = "ndl", -- Ndolo
["নডোম"] = "nqm", -- Ndom
["নডোম্বে"] = "ndq", -- Ndombe
["নডাঙ্গা"] = "ng", -- Ndonga
["নডুলা"] = "ndr", -- Ndoola
["নড্রুলো"] = "dno", -- Ndrulo
["নডুগা"] = "ndx", -- Nduga
["নডুমু"] = "nmd", -- Ndumu
["নডুনডা"] = "nuh", -- Ndunda
["নডুঙ্গা"] = "ndt", -- Ndunga
["নডুট"] = "ndv", -- Ndut
["নড্যুক-ত্রিও পিডজিন"] = "njt", -- Ndyuka-Trio Pidgin
["নডজওয়ানি কোমোরিয়ান"] = "wni", -- Ndzwani Comorian
["নেয়াপোলিতান"] = "nap", -- Neapolitan
["নেডবাঙ্গ"] = "nec", -- Nedebang
["নেফামেস"] = "nef", -- Nefamese
["নেফুসা"] = "jbn", -- Nefusa
["নেগেরহোল্যান্ডস"] = "dcr", -- Negerhollands
["নেগেরি সেম্বিলান মালয়"] = "zmi", -- Negeri Sembilan Malay
["নেগিডাল"] = "neg", -- Negidal
["নেহান"] = "nsn", -- Nehan
["নেক"] = "nif", -- Nek
["নেকগিনি"] = "nkg", -- Nekgini
["নেকো"] = "nej", -- Neko
["নেকু"] = "nek", -- Neku
["নেম"] = "nex", -- Neme
["নেমি"] = "nem", -- Nemi
["নেন"] = "nqn", -- Nen
["নেন্ড"] = "anh", -- Nend
["নেঙ্গোন"] = "nen", -- Nengone
["নিও"] = "neu", -- Neo
["নেপালী সাইন ল্যাঙ্গুয়েজ"] = "nsp", -- Nepalese Sign Language
["নেপালী"] = "ne", -- Nepali
["নেপালী কুরুখ"] = "kxl", -- Nepali Kurux
["নেতে"] = "net", -- Nete
["নেভে'এই"] = "vnm", -- Neve'ei
["নেভারভার"] = "lgk", -- Neverver
["নিউ ক্যালেডোনিয়ান জাভানিজ"] = "jas", -- New Caledonian Javanese
["নিউ রিভার শাস্টা"] = "nai-nrs", -- New River Shasta
["নিউ জিল্যান্ড সাইন ল্যাঙ্গুয়েজ"] = "nzs", -- New Zealand Sign Language
["নেওয়ার"] = "new", -- Newar
["নেয়ো"] = "ney", -- Neyo
["নেজ পেরসে"] = "nez", -- Nez Perce
["ঙ্গা লা"] = "hlt", -- Nga La
["ঙ্গান্য্যাতজাররা"] = "ntj", -- Ngaanyatjarra
["ঙ্গাঢা"] = "nxg", -- Ngadha
["ঙ্গাদজুনমায়া"] = "nju", -- Ngadjunmaya
["ঙ্গাদজুরি"] = "jui", -- Ngadjuri
["ঙ্গাইং"] = "nnf", -- Ngaing
["ঙ্গাজু"] = "nij", -- Ngaju
["ঙ্গালা"] = "nud", -- Ngala
["ঙ্গালাকান"] = "nig", -- Ngalakan
["ঙ্গালকবান"] = "ngk", -- Ngalkbun
["ঙ্গালুম"] = "szb", -- Ngalum
["ঙ্গাম"] = "nmc", -- Ngam
["ঙ্গাম্বাম্বো"] = "nbv", -- Ngamambo
["ঙ্গাম্বাই"] = "sba", -- Ngambay
["ঙ্গামিনি"] = "nmv", -- Ngamini
["ঙ্গামো"] = "nbh", -- Ngamo
["ঙ্গান'গিতেমেরি"] = "nam", -- Ngan'gityemerri
["ঙ্গানাকার্তি"] = "xnk", -- Nganakarti
["ঙ্গানাসান"] = "nio", -- Nganasan
["ঙ্গান্ডি"] = "nid", -- Ngandi
["ঙ্গান্ডো (সেন্ট্রাল আফ্রিকান রিপাবলিক)"] = "ngd", -- Ngando (Central African Republic)
["ঙ্গান্ডো (কঙ্গো)"] = "nxd", -- Ngando (Congo)
["ঙ্গান্ডিয়েরা"] = "nne", -- Ngandyera
["ঙ্গাঙ্গাম"] = "gng", -- Ngangam
["ঙ্গানতাঙ্গাররা"] = "ntg", -- Ngantangarra
["ঙ্গানয়ায়ওয়ানা"] = "nyx", -- Nganyaywana
["ঙ্গার্দি"] = "rxd", -- Ngardi
["ঙ্গারিগু"] = "xni", -- Ngarigu
["ঙ্গারিনম্যান"] = "nbj", -- Ngarinman
["ঙ্গারিনয়িন"] = "ung", -- Ngarinyin
["ঙ্গার্লা"] = "nrk", -- Ngarla
["ঙ্গার্লুমা"] = "nrl", -- Ngarluma
["ঙ্গারিন্দজেরি"] = "nay", -- Ngarrindjeri
["ঙ্গাস"] = "anc", -- Ngas
["ঙ্গাসা"] = "nsg", -- Ngasa
["ঙ্গাতিক মেন'স ক্রেওল"] = "ngm", -- Ngatik Men's Creole
["ঙ্গাউন চিন"] = "cnw", -- Ngawn Chin
["ঙ্গাউন"] = "nxn", -- Ngawun
["ঙ্গাজিদজা কোমোরিয়ান"] = "zdj", -- Ngazidja Comorian
["ঙ্গবাকা"] = "nga", -- Ngbaka
["ঙ্গবাকা মা'বো"] = "nbm", -- Ngbaka Ma'bo
["ঙ্গবাকা মানজা"] = "ngg", -- Ngbaka Manza
["ঙ্গবি"] = "jgb", -- Ngbee
["ঙ্গবিন্ডা"] = "nbd", -- Ngbinda
["ঙ্গবুন্ডু"] = "nuu", -- Ngbundu
["ঙ্গেলিমা"] = "agh", -- Ngelima
["ঙ্গেম্বা"] = "nge", -- Ngemba
["ঙ্গেন অফ ডজনক্রো"] = "gnj", -- Ngen of Djonkro
["ঙ্গেন্ডেলেঙ্গো"] = "nql", -- Ngendelengo
["ঙ্গেক"] = "ngt", -- Ngeq
["ঙ্গেতে"] = "nnn", -- Ngete
["ঙ্গেম"] = "nbq", -- Nggem
["ঙ্গওয়ায়ি"] = "ngx", -- Nggwahyi
["ঙ্গিয়ে"] = "ngj", -- Ngie
["ঙ্গিেম্বুন"] = "nnh", -- Ngiemboon
["ঙ্গিল]"] = "jle", -- Ngile
["ঙ্গিন্ডো"] = "nnq", -- Ngindo
["ঙ্গিতি"] = "niy", -- Ngiti
["ঙ্গিয়াম্বা"] = "wyb", -- Ngiyambaa
["ঙ্গিজি়ম"] = "ngi", -- Ngizim
["ঙ্গকথ"] = "aus-ngk", -- Ngkoth
["ঙ্গকালম্পু কানুম"] = "kcd", -- Ngkâlmpw Kanum
["ঙ্গোচাং"] = "tbq-ngo", -- Ngochang
["ঙ্গোম"] = "nra", -- Ngom
["ঙ্গোম্বা"] = "jgo", -- Ngomba
["ঙ্গোমবালে"] = "nla", -- Ngombale
["ঙ্গোম্বে (সেন্ট্রাল আফ্রিকান রিপাবলিক)"] = "nmj", -- Ngombe (Central African Republic)
["ঙ্গোম্বে (কঙ্গো)"] = "ngc", -- Ngombe (Congo)
["ঙ্গোঙ্গ"] = "nnx", -- Ngong
["ঙ্গোঙ্গো"] = "noq", -- Ngongo
["ঙ্গোনি"] = "ngo", -- Ngoni
["ঙ্গোরেমে"] = "ngq", -- Ngoreme
["ঙ্গোশি"] = "nsh", -- Ngoshie
["ঙ্গুল"] = "nlo", -- Ngul
["ঙ্গুলু"] = "ngp", -- Ngulu
["ঙ্গুলুওয়ান"] = "nuw", -- Nguluwan
["ঙ্গুম্বি"] = "nui", -- Ngumbi
["ঙ্গুনোয়াল"] = "xul", -- Ngunawal
["ঙ্গুন্ডি"] = "ndn", -- Ngundi
["ঙ্গুনডু"] = "nue", -- Ngundu
["ঙ্গুঙ্গওয়েল"] = "ngz", -- Ngungwel
["ঙ্গুরমুর"] = "nrx", -- Ngurmbur
["ঙ্গুওন"] = "nuo", -- Nguôn
["ঙ্গাওয়াবা"] = "ngw", -- Ngwaba
["ঙ্গওয়ে"] = "nwe", -- Ngwe
["ঙ্গো"] = "ngn", -- Ngwo
["ঙ্গাবেড়ে"] = "gym", -- Ngäbere
["নহান্দা"] = "nha", -- Nhanda
["নহীঙ্গাাতু"] = "yrl", -- Nheengatu
["নহির্রপি"] = "hrp", -- Nhirrpi
["নহুয়ালা"] = "nhf", -- Nhuwala
["নিয়াস"] = "nia", -- Nias
["নিকারাগুয়ান ক্রেওল"] = "bzk", -- Nicaraguan Creole
["নিকারাগুয়ান সাইন ল্যাঙ্গুয়েজ"] = "ncs", -- Nicaraguan Sign Language
["নিকোলা"] = "ath-nic", -- Nicola
["নিয়েল্লিম"] = "nie", -- Niellim
["নাইজেরিয়া মাম্বিলা"] = "mzk", -- Nigeria Mambila
["নাইজেরিয়ান পিডজিন"] = "pcm", -- Nigerian Pidgin
["নাইজেরিয়ান সাইন ল্যাঙ্গুয়েজ"] = "nsi", -- Nigerian Sign Language
["নিহালি"] = "nll", -- Nihali
["নিই"] = "nii", -- Nii
["নিক্সেক"] = "gbe", -- Niksek
["নিলা"] = "nil", -- Nila
["নিলম্বা"] = "nim", -- Nilamba
["নিমাদি"] = "noe", -- Nimadi
["নিমানবুর"] = "nmp", -- Nimanbur
["নিমবারি"] = "nmr", -- Nimbari
["নিমবোরান"] = "nir", -- Nimboran
["নিমি"] = "nis", -- Nimi
["নিমো"] = "niw", -- Nimo
["নিমোয়া"] = "nmw", -- Nimoa
["নিনাম"] = "shb", -- Ninam
["নিন্ডি"] = "nxi", -- Nindi
["নিঙ্গেরা"] = "nby", -- Ningera
["নিঙ্গেরুম"] = "nxr", -- Ninggerum
["নিনগিল"] = "niz", -- Ningil
["নিনিয়া ইয়ালি"] = "nlk", -- Ninia Yali
["নিনজো"] = "nin", -- Ninzo
["নিপসান"] = "nps", -- Nipsan
["নিসা"] = "njs", -- Nisa
["নিসেনান"] = "nsz", -- Nisenan
["নিসগা'আ"] = "ncg", -- Nisga'a
["নিসি"] = "yso", -- Nisi
["নিউয়াফো'উ"] = "num", -- Niuafo'ou
["নিউয়াতোপুটাপু"] = "nkp", -- Niuatoputapu
["নিউয়িয়ান"] = "niu", -- Niuean
["নিভাকলে"] = "cag", -- Nivaclé
["নিভখ"] = "niv", -- Nivkh
["নিওয়ার মিল"] = "hrc", -- Niwer Mil
["নিয়া প্রাকৃত"] = "pra-niy", -- Niya Prakrit
["নজাল্গুল্গুলে"] = "njl", -- Njalgulgule
["নজেবি"] = "nzb", -- Njebi
["নজেন"] = "njj", -- Njen
["নজেরেপ"] = "njr", -- Njerep
["নজিয়েম"] = "njy", -- Njyem
["নকামি"] = "nkq", -- Nkami
["নকাঙ্গালা"] = "nkn", -- Nkangala
["নকারি"] = "nkz", -- Nkari
["নকেম-নকুম"] = "isi", -- Nkem-Nkum
["নখুম্বি"] = "khu", -- Nkhumbi
["নকংহো"] = "nkc", -- Nkongho
["নকোন্যা"] = "nko", -- Nkonya
["নকোরো"] = "nkx", -- Nkoroo
["নকয়া"] = "nka", -- Nkoya
["নকুকোলি"] = "nbo", -- Nkukoli
["নকুতু"] = "nkw", -- Nkutu
["ন্নাম"] = "nbp", -- Nnam
["নোবিন"] = "fia", -- Nobiin
["নোবো্নব"] = "gaw", -- Nobonob
["নোচামান"] = "nom", -- Nocamán
["নোক্তে"] = "njb", -- Nocte
["নোগাই"] = "nog", -- Nogai
["নোইরি"] = "noi", -- Noiri
["নোকুকু"] = "nkk", -- Nokuku
["নোমান্ডে"] = "lem", -- Nomaande
["নোমানে"] = "nof", -- Nomane
["নোমাতিসিগুয়েঙ্গা"] = "not", -- Nomatsiguenga
["নোমলাকি"] = "nol", -- Nomlaki
["নোমু"] = "noh", -- Nomu
["নঙ্গ ঝুয়াং"] = "zhn", -- Nong Zhuang
["নোনুয়া"] = "noj", -- Nonuya
["নুকসাক"] = "nok", -- Nooksack
["নুন"] = "snf", -- Noon
["নুন"] = "nhu", -- Noone
["নুটকা"] = "nuk", -- Nootka
["নোপালা চাতিনো"] = "cya", -- Nopala Chatino
["নোরিক"] = "nrc", -- Noric
["নরম্যান"] = "nrf", -- Norman
["নর্ন"] = "nrn", -- Norn
["নোররা"] = "nrr", -- Norra
["উত্তর আম্ব্রিম"] = "mmg", -- North Ambrym
["উত্তর আসমাত"] = "nks", -- North Asmat
["উত্তর অয়ু"] = "yir", -- North Awyu
["উত্তর বাবার"] = "bcd", -- North Babar
["উত্তর বোমা"] = "boh", -- North Boma
["উত্তর সেন্ট্রাল মিক্সে"] = "neq", -- North Central Mixe
["উত্তর ইফাতে"] = "llp", -- North Efate
["উত্তর ফালি"] = "fll", -- North Fali
["উত্তর ফ্রিজিয়ান"] = "frr", -- North Frisian
["উত্তর গিজিগা"] = "gis", -- North Giziga
["উত্তর লেভান্টাইন আরবি"] = "apc", -- North Levantine Arabic
["উত্তর মারকুয়েসান"] = "mrq", -- North Marquesan
["উত্তর মেসোপটেমিয়ান আরবি"] = "ayp", -- North Mesopotamian Arabic
["উত্তর মোফু"] = "mfk", -- North Mofu
["উত্তর মোলুকান মালয়"] = "max", -- North Moluccan Malay
["উত্তর মুয়ু"] = "kti", -- North Muyu
["উত্তর নুয়ালো"] = "nni", -- North Nuaulu
["উত্তর পিসেন"] = "nrp", -- North Picene
["উত্তর স্লেভী"] = "scs", -- North Slavey
["উত্তর তাইরোরা"] = "tbg", -- North Tairora
["উত্তর তান্না"] = "tnn", -- North Tanna
["উত্তর ওয়াঘি"] = "whg", -- North Wahgi
["উত্তর ওয়াতুত"] = "una", -- North Watut
["উত্তরপূর্ব কিওয়াই"] = "kiw", -- Northeast Kiwai
["উত্তরপূর্ব মাইডু"] = "nmu", -- Northeast Maidu
["উত্তরপূর্ব মালকুলা"] = "upv", -- Northeast Malakula
["উত্তরপূর্ব পাশায়ী"] = "aee", -- Northeast Pashayi
["উত্তরপূর্বী ডিংকা"] = "dip", -- Northeastern Dinka
["উত্তরপূর্বী পোমো"] = "pef", -- Northeastern Pomo
["উত্তরি আলটা"] = "aqn", -- Northern Alta
["উত্তরি আলতাই"] = "atv", -- Northern Altai
["উত্তরি আমামি ওশিমা"] = "ryn", -- Northern Amami Ōshima
["উত্তরি বন্টক"] = "rbk", -- Northern Bontoc
["উত্তরি কাতান্দুয়ানেস বিকোলানো"] = "cts", -- Northern Catanduanes Bicolano
["উত্তরি দাগারা"] = "dgi", -- Northern Dagara
["উত্তরি পূর্ব ক্রী"] = "crl", -- Northern East Cree
["উত্তরি এম্বেরা"] = "emp", -- Northern Emberá
["উত্তরি ঘালে"] = "ghh", -- Northern Ghale
["উত্তরি গ্রেবো"] = "gbo", -- Northern Grebo
["উত্তরি গুইইয়াং হ্মং"] = "huj", -- Northern Guiyang Hmong
["উত্তরি হাইডা"] = "hdn", -- Northern Haida
["উত্তরি হিন্দকো"] = "hno", -- Northern Hindko
["উত্তরি হুইশুই হ্মং"] = "hmi", -- Northern Huishui Hmong
["উত্তরি কালাপুইয়া"] = "nrt", -- Northern Kalapuya
["উত্তরি কাম"] = "doc", -- Northern Kam
["উত্তরি কাঙ্কানায়"] = "xnn", -- Northern Kankanay
["উত্তরি খান্টি"] = "kca-nor", -- Northern Khanty
["উত্তরি খেমার"] = "kxm", -- Northern Khmer
["উত্তরি কিসি"] = "kqs", -- Northern Kissi
["উত্তরি কুর্দিশ"] = "kmr", -- Northern Kurdish
["উত্তরি লোরুং"] = "lbr", -- Northern Lorung
["উত্তরি লুরি"] = "lrc", -- Northern Luri
["উত্তরি মান্সি"] = "mns-nor", -- Northern Mansi
["উত্তরি মাশান হ্মং"] = "hmp", -- Northern Mashan Hmong
["উত্তরি মিন"] = "mnp", -- Northern Min
["উত্তরি মুজি"] = "ymx", -- Northern Muji
["উত্তরি ন্দেবেলে"] = "nd", -- Northern Ndebele
["উত্তরি ঙ্গবান্দি"] = "ngb", -- Northern Ngbandi
["উত্তরি নিসু"] = "yiv", -- Northern Nisu
["উত্তরি নুনী"] = "nuv", -- Northern Nuni
["উত্তরি ওক্সাকা নাহুয়াতল"] = "nhy", -- Northern Oaxaca Nahuatl
["উত্তরি ওহলোন"] = "cst", -- Northern Ohlone
["উত্তরি ওয়ান"] = "onr", -- Northern One
["উত্তরি পাইউটে"] = "pao", -- Northern Paiute
["উত্তরি পামে"] = "pmq", -- Northern Pame
["উত্তরি পিংহুয়া"] = "cnp", -- Northern Pinghua
["উত্তরি পোমো"] = "pej", -- Northern Pomo
["উত্তরি পুয়েব্লা নাহুয়াতল"] = "ncj", -- Northern Puebla Nahuatl
["উত্তরি পুমি"] = "pmi", -- Northern Pumi
["উত্তরি পিভো"] = "pww", -- Northern Pwo
["উত্তরি কিয়ান্ডোং মিয়াও"] = "hea", -- Northern Qiandong Miao
["উত্তরি কিয়াং"] = "cng", -- Northern Qiang
["উত্তরি রেঙ্গমা নাগা"] = "nnl", -- Northern Rengma Naga
["উত্তরি রোগ্লাই"] = "rog", -- Northern Roglai
["উত্তরি সাহারান বারবার"] = "mzb", -- Northern Saharan Berber
["উত্তরি সামি"] = "se", -- Northern Sami
["উত্তরি সেলকাপ"] = "sel-nor", -- Northern Selkup
["উত্তরি সিয়েরা মিউক"] = "nsq", -- Northern Sierra Miwok
["উত্তরি সোথো"] = "nso", -- Northern Sotho
["উত্তরি সুবানেন"] = "stb", -- Northern Subanen
["উত্তরি তারাহুমারা"] = "thh", -- Northern Tarahumara
["উত্তরি তেপেহুয়ান"] = "ntp", -- Northern Tepehuan
["উত্তরি থাই"] = "nod", -- Northern Thai
["উত্তরি টিডুং"] = "ntd", -- Northern Tidung
["উত্তরি ত্লাক্সিয়াকো মিক্সটেক"] = "xtn", -- Northern Tlaxiaco Mixtec
["উত্তরি তউসিয়ান"] = "tsp", -- Northern Toussian
["উত্তরি তুজিয়া"] = "tji", -- Northern Tujia
["উত্তরি তুতচোন"] = "ttm", -- Northern Tutchone
["উত্তরি ভ্যালি ইয়োকুতস"] = "yok-nvy", -- Northern Valley Yokuts
["উত্তরি ইয়ুকাজির"] = "ykg", -- Northern Yukaghir
["উত্তরপশ্চিম গবায়া"] = "gya", -- Northwest Gbaya
["উত্তরপশ্চিম মাইডু"] = "mjd", -- Northwest Maidu
["উত্তরপশ্চিম ওক্সাকা মিক্সটেক"] = "mxa", -- Northwest Oaxaca Mixtec
["উত্তরপশ্চিম পাশায়ী"] = "glh", -- Northwest Pashayi
["উত্তরপশ্চিমি ডিংকা"] = "diw", -- Northwestern Dinka
["উত্তরপশ্চিমি ফার্স"] = "faz", -- Northwestern Fars
["উত্তরপশ্চিমি ওজিবওয়া"] = "ojb", -- Northwestern Ojibwa
["উত্তরপশ্চিমি তামাং"] = "tmk", -- Northwestern Tamang
["নরওয়েজিয়ান"] = "no", -- Norwegian
["নরওয়েজিয়ান বোকমল"] = "nb", -- Norwegian Bokmål
["নরওয়েজিয়ান নিনর্স্ক"] = "nn", -- Norwegian Nynorsk
["নরওয়েজিয়ান সাইন ল্যাঙ্গুয়েজ"] = "nsl", -- Norwegian Sign Language
["নোত্রে"] = "bly", -- Notre
["নোটসি"] = "ncf", -- Notsi
["নটওয়াই"] = "ntw", -- Nottoway
["নটওয়াই-মেহেরিন"] = "nwy", -- Nottoway-Meherrin
["নোভিয়াল"] = "nov", -- Novial
["নয়"] = "noy", -- Noy
["নসারি"] = "asj", -- Nsari
["নসেঙ্গা"] = "nse", -- Nsenga
["নশি"] = "nsc", -- Nshi
["নসঙ"] = "soo", -- Nsong
["নসঙো"] = "nsx", -- Nsongo
["নটচাম"] = "bud", -- Ntcham
["নতোম্বা"] = "nto", -- Ntomba
["ন্ত্রাংগিথ"] = "dgt", -- Ntra'ngith
["নুবাকা"] = "baf", -- Nubaca
["নুবি"] = "kcn", -- Nubi
["নুয়ের"] = "nus", -- Nuer
["নুগুরিয়া"] = "nur", -- Nuguria
["নুক"] = "noc", -- Nuk
["নুকাক মাকু"] = "mbr", -- Nukak Makú
["নুকনা"] = "klt", -- Nukna
["নুকুইনি"] = "nuc", -- Nukuini
["নুকুম্যানু"] = "nuq", -- Nukumanu
["নুকুনু"] = "nnv", -- Nukunu
["নুকুনুল"] = "xnu", -- Nukunul
["নুকুওরো"] = "nkr", -- Nukuoro
["নুম্যানা"] = "nbr", -- Numana
["নুমাঙ্গগ্যাং"] = "nop", -- Numanggang
["নুম্বামি"] = "sij", -- Numbami
["নুমে"] = "tgs", -- Nume
["নুমীডিয়ান"] = "nxm", -- Numidian
["নুমেই"] = "kdk", -- Numèè
["নুঙ্গালি"] = "nug", -- Nungali
["নুঙ্গুবুয়ু"] = "nuy", -- Nunggubuyu
["নুনগোন"] = "paa-nun", -- Nungon
["নুঙ্গু"] = "rin", -- Nungu
["নুওসু"] = "ii", -- Nuosu
["নুপবিখা"] = "npb", -- Nupbikha
["নুপে"] = "nup", -- Nupe
["নুসা লাউট"] = "nul", -- Nusa Laut
["নুসু"] = "nuf", -- Nusu
["নুতাবে"] = "cba-nut", -- Nutabe
["নিয়াবওয়া"] = "nwb", -- Nyabwa
["নিয়াগ্রং মিনিয়াগ"] = "ero-nya", -- Nyagrong Minyag
["নিয়া কুর"] = "cbn", -- Nyah Kur
["নিয়াহেউন"] = "nev", -- Nyaheun
["নিয়াকুসা"] = "nyy", -- Nyakyusa
["নিয়ালি"] = "nlj", -- Nyali
["নিয়াম"] = "nmi", -- Nyam
["নিয়ামাল"] = "nly", -- Nyamal
["নিয়াম্বো"] = "now", -- Nyambo
["নিয়ামুসা-মোলো"] = "nwm", -- Nyamusa-Molo
["নিয়ামওয়ানগা"] = "mwn", -- Nyamwanga
["নিয়ামওয়েজি"] = "nym", -- Nyamwezi
["নিয়ানকা"] = "nyk", -- Nyaneka
["নিয়াং'ই"] = "nyp", -- Nyang'i
["নিয়াঙ্গা (কঙ্গো)"] = "nyj", -- Nyanga (Congo)
["নিয়াঙ্গা (টোগো)"] = "ayg", -- Nyanga (Togo)
["নিয়াঙ্গা-লি"] = "nyc", -- Nyanga-li
["নিয়াঙ্গাটম"] = "nnj", -- Nyangatom
["নিয়াংবো"] = "nyb", -- Nyangbo
["নিয়াঙ্গা"] = "nny", -- Nyangga
["নিয়াংগু্মার্টা"] = "nna", -- Nyangumarta
["নিয়ানকোলে"] = "nyn", -- Nyankole
["নিয়ারাফোলো সেনুফো"] = "sev", -- Nyarafolo Senoufo
["নিয়াতুরু"] = "rim", -- Nyaturu
["নিয়াও"] = "nyw", -- Nyaw
["নিয়াবায়গি"] = "nyt", -- Nyawaygi
["নিয়েল]"] = "yly", -- Nyelâyu
["নিয়েম্বা"] = "nba", -- Nyemba
["নিয়েনগো"] = "nye", -- Nyengo
["নিয়েনখা"] = "neh", -- Nyenkha
["নিয়ু"] = "nyl", -- Nyeu
["নিয়িগিনা"] = "nyh", -- Nyigina
["নিইহা"] = "nih", -- Nyiha
["নিয়িকা"] = "nkt", -- Nyika
["নিয়িমান"] = "nyi", -- Nyimang
["নিয়িন্ড্রু"] = "lid", -- Nyindrou
["নিয়িন্ডু"] = "nyg", -- Nyindu
["নিয়িশি"] = "njz", -- Nyishi
["নিয়াপারলি"] = "xny", -- Nyiyaparli
["নিয়োকোন"] = "nvo", -- Nyokon
["নিয়োলে (কেনিয়া)"] = "nyd", -- Nyole (Kenya)
["নিয়োলে (উগান্ডা)"] = "nuj", -- Nyole (Uganda)
["নিয়ং"] = "muo", -- Nyong
["নিয়োরো"] = "nyo", -- Nyoro
["নিয়ুলনিয়ুল"] = "nyv", -- Nyulnyul
["নিয়ুঙ্গা"] = "nys", -- Nyunga
["নিয়ুঙ্গওয়ে"] = "nyu", -- Nyungwe
["নজাদি"] = "nzd", -- Nzadi
["নজাকাম্বে"] = "nzy", -- Nzakambay
["নজাকারা"] = "nzk", -- Nzakara
["নজানি"] = "nja", -- Nzanyi
["নজিমা"] = "nzi", -- Nzima
["না-মেও"] = "neo", -- Ná-Meo
["নুঙ্গ"] = "nut", -- Nùng
["নুপোডে হুইটোটো"] = "hux", -- Nüpode Huitoto
["নউ"] = "ngh", -- Nǀuu
["ও'চি'চি'"] = "xoc", -- O'chi'chi'
["ও'ডু"] = "tyh", -- O'du
["ও'ওধাম"] = "ood", -- O'odham
["ওবানলিকু"] = "bzy", -- Obanliku
["ওবিসপিনো"] = "obi", -- Obispeño
["অবলো"] = "obl", -- Oblo
["ওবো মানোবো"] = "obo", -- Obo Manobo
["ওবোকুইতাই"] = "afz", -- Obokuitai
["ওবোলো"] = "ann", -- Obolo
["ওবুলম"] = "obu", -- Obulom
["ওকাইনা"] = "oca", -- Ocaina
["ওকসিটান"] = "oc", -- Occitan
["ওকোটেপেক মিক্সেটেক"] = "mie", -- Ocotepec Mixtec
["ওকোটলান জাপোটেক"] = "zac", -- Ocotlán Zapotec
["ওড"] = "odk", -- Od
["ওড়িয়া"] = "or", -- Odia
["ওডিয়াই"] = "bhf", -- Odiai
["ওডোডি"] = "kkc", -- Odoodee
["ওডুয়াল"] = "odu", -- Odual
["ওডুট"] = "oda", -- Odut
["ওফায়ে"] = "opy", -- Ofayé
["ওফো"] = "ofo", -- Ofo
["ওগবাহ"] = "ogc", -- Ogbah
["ওগবিয়া"] = "ogb", -- Ogbia
["ওগবোগোলো"] = "ogg", -- Ogbogolo
["ওগবরোনুয়াগুম"] = "ogu", -- Ogbronuagum
["ওগিয়া"] = "eri", -- Ogea
["ওইরাতা"] = "oia", -- Oirata
["ওজিবওয়ে"] = "oj", -- Ojibwe
["ওজিতলান চিনান্তে"] = "chj", -- Ojitlán Chinantec
["ওকানাগান"] = "oka", -- Okanagan
["ওকিয়াক"] = "oki", -- Okiek
["ওকিনাওয়ান"] = "ryu", -- Okinawan
["ওকিনোইরাবু"] = "okn", -- Okinoerabu
["ওকো-এনি-ওসায়েন"] = "oks", -- Oko-Eni-Osayen
["ওকো-জুই"] = "okj", -- Oko-Juwoi
["ওকোবো"] = "okb", -- Okobo
["ওকোদিয়া"] = "okd", -- Okodia
["ওকোল্ড"] = "kqv", -- Okolod
["ওকপামহেরি"] = "opa", -- Okpamheri
["ওকপে (উত্তরপশ্চিমি ইডো)"] = "okx", -- Okpe (Northwestern Edo)
["ওকপে (দক্ষিণপশ্চিমি ইডো)"] = "oke", -- Okpe (Southwestern Edo)
["ওকপেল]"] = "atg", -- Okpela
["ওক্সাপমিন"] = "opm", -- Oksapmin
["ওকু"] = "oku", -- Oku
["ওকওয়ানুকু"] = "nai-okw", -- Okwanuchu
["প্রাচীন আনাতোলিয়ান তুর্কি"] = "trk-oat", -- Old Anatolian Turkish
["প্রাচীন আর্মেনিয়ান"] = "xcl", -- Old Armenian
["প্রাচীন আভার"] = "oav", -- Old Avar
["প্রাচীন অবধী"] = "inc-oaw", -- Old Awadhi
["প্রাচীন বাংলা"] = "inc-obn", -- Old Bengali
["প্রাচীন ব্রেটন"] = "obt", -- Old Breton
["প্রাচীন বর্মী"] = "obr", -- Old Burmese
["প্রাচীন কাতালান"] = "roa-oca", -- Old Catalan
["প্রাচীন চাইনিজ"] = "och", -- Old Chinese
["প্রাচীন চার্চ স্লাভোনিক"] = "cu", -- Old Church Slavonic
["প্রাচীন কর্নিশ"] = "oco", -- Old Cornish
["প্রাচীন চেক"] = "zlw-ocs", -- Old Czech
["প্রাচীন ডেনিশ"] = "gmq-oda", -- Old Danish
["প্রাচীন ডাচ"] = "odt", -- Old Dutch
["প্রাচীন পূর্ব স্লাভিক"] = "orv", -- Old East Slavic
["প্রাচীন ইংলিশ"] = "ang", -- Old English
["প্রাচীন ফরাসি"] = "fro", -- Old French
["প্রাচীন ফ্রিজিয়ান"] = "ofs", -- Old Frisian
["প্রাচীন গ্যালিশিয়ান-পর্তুগিজ"] = "roa-opt", -- Old Galician-Portuguese
["প্রাচীন জর্জিয়ান"] = "oge", -- Old Georgian
["প্রাচীন গুজরাটি"] = "inc-ogu", -- Old Gujarati
["প্রাচীন গুটনিশ"] = "gmq-ogt", -- Old Gutnish
["প্রাচীন হাই জার্মান"] = "goh", -- Old High German
["প্রাচীন হিন্দি"] = "inc-ohi", -- Old Hindi
["প্রাচীন হাঙ্গেরিয়ান"] = "ohu", -- Old Hungarian
["প্রাচীন আইরিশ"] = "sga", -- Old Irish
["প্রাচীন জাপানিজ"] = "ojp", -- Old Japanese
["প্রাচীন জাভানিজ"] = "kaw", -- Old Javanese
["প্রাচীন কান্নাডা"] = "dra-okn", -- Old Kannada
["প্রাচীন কেন্টিশ সাইন ল্যাঙ্গুয়েজ"] = "okl", -- Old Kentish Sign Language
["প্রাচীন খেমার"] = "okz", -- Old Khmer
["প্রাচীন কোমি"] = "urj-koo", -- Old Komi
["প্রাচীন কোরিয়ান"] = "oko", -- Old Korean
["প্রাচীন লিওনিজ"] = "roa-ole", -- Old Leonese
["প্রাচীন লিথুয়ানিয়ান"] = "olt", -- Old Lithuanian
["প্রাচীন মনিপুরি"] = "omp", -- Old Manipuri
["প্রাচীন মারাঠি"] = "omr", -- Old Marathi
["প্রাচীন মিডিয়ান"] = "xme-old", -- Old Median
["প্রাচীন মন"] = "omx", -- Old Mon
["প্রাচীন নাভারো-আরাগোনিজ"] = "roa-ona", -- Old Navarro-Aragonese
["প্রাচীন নর্স"] = "non", -- Old Norse
["প্রাচীন নভগোরোডিয়ান"] = "zle-ono", -- Old Novgorodian
["প্রাচীন নুবিয়ান"] = "onw", -- Old Nubian
["প্রাচীন ওকসিটান"] = "pro", -- Old Occitan
["প্রাচীন ওড়িয়া"] = "inc-oor", -- Old Odia
["প্রাচীন পার্সিয়ান"] = "peo", -- Old Persian
["প্রাচীন পোলিশ"] = "zlw-opl", -- Old Polish
["প্রাচীন প্রুশিয়ান"] = "prg", -- Old Prussian
["প্রাচীন পাঞ্জাবি"] = "inc-opa", -- Old Punjabi
["প্রাচীন রুথেনিয়ান"] = "zle-ort", -- Old Ruthenian
["প্রাচীন স্যাক্সন"] = "osx", -- Old Saxon
["প্রাচীন স্লোভাক"] = "zlw-osk", -- Old Slovak
["প্রাচীন দক্ষিণ আরবিয়ান"] = "sem-srb", -- Old South Arabian
["প্রাচীন স্প্যানিশ"] = "osp", -- Old Spanish
["প্রাচীন সুন্দানিস"] = "osn", -- Old Sundanese
["প্রাচীন সুইডিশ"] = "gmq-osw", -- Old Swedish
["প্রাচীন তামিল"] = "oty", -- Old Tamil
["প্রাচীন তাতি"] = "xme-ott", -- Old Tati
["প্রাচীন তেলুগু"] = "dra-ote", -- Old Telugu
["প্রাচীন তিব্বতি"] = "otb", -- Old Tibetan
["প্রাচীন তুপি"] = "tpw", -- Old Tupi
["প্রাচীন তুর্কি"] = "otk", -- Old Turkic
["প্রাচীন উইঘুর"] = "oui", -- Old Uyghur
["প্রাচীন ওয়েলশ"] = "owl", -- Old Welsh
["ওলেখা"] = "ole", -- Olekha
["ওলারি"] = "gdb", -- Ollari
["ওলো"] = "ong", -- Olo
["ওলোমা"] = "olm", -- Oloma
["ওলরাত"] = "olr", -- Olrat
["ওলু'বো"] = "lul", -- Olu'bo
["ওলুকুমী"] = "ulb", -- Olukumi
["ওলুলুমো-ইকম"] = "iko", -- Olulumo-Ikom
["ওলুটা পোপোলোকা"] = "plo", -- Oluta Popoluca
["ওলুতসোসো"] = "lto", -- Olutsotso
["ওমাগুয়া"] = "omg", -- Omagua
["ওমাহা-পনকা"] = "oma", -- Omaha-Ponca
["ওমানি আরবি"] = "acx", -- Omani Arabic
["ওম্বা"] = "omb", -- Omba
["ওম্বাম্বা"] = "mbm", -- Ombamba
["ওম্বো"] = "oml", -- Ombo
["ওমেটেপেক নাহুয়াতল"] = "nht", -- Ometepec Nahuatl
["ওমি"] = "omi", -- Omi
["ওমোক"] = "omk", -- Omok
["ওমোতিক"] = "omt", -- Omotik
["ওমুরানো"] = "omu", -- Omurano
["ওয়ানাইড]"] = "one", -- Oneida
["ওঙ্গ"] = "oog", -- Ong
["ওঙ্গোটা"] = "bxe", -- Ongota
["ওনিন"] = "oni", -- Onin
["ওনজোব"] = "onj", -- Onjob
["ওনো"] = "ons", -- Ono
["ওনওবাসুলু"] = "onn", -- Onobasulu
["ওনোনডাগা"] = "ono", -- Onondaga
["ওনতেনু"] = "ont", -- Ontenu
["ওনতোং জাভা"] = "ojv", -- Ontong Java
["ওরাল]"] = "oor", -- Oorlams
["ওপাও"] = "opo", -- Opao
["ওপতা"] = "opt", -- Opata
["ওপুউও"] = "lgn", -- Opuuo
["ওপন"] = "sai-opo", -- Opón
["ওরাওন সাদ্রি"] = "sdr", -- Oraon Sadri
["ওরেজন"] = "ore", -- Orejón
["ওরিং"] = "org", -- Oring
["ওরিজাবা নাহুয়াতল"] = "nlv", -- Orizaba Nahuatl
["অরলিয়ানা"] = "roa-orl", -- Orléanais
["ওর্মু"] = "orz", -- Ormu
["ওর্মুরি"] = "oru", -- Ormuri
["ওরো"] = "orx", -- Oro
["ওরো উইন"] = "orw", -- Oro Win
["ওরোচ"] = "oac", -- Oroch
["ওরোাহা"] = "ora", -- Oroha
["ওড়োক"] = "oaa", -- Orok
["ওরোকাইভা"] = "okv", -- Orokaiva
["ওড়োকো"] = "bdu", -- Oroko
["ওড়োকোলো"] = "oro", -- Orokolo
["ওরোমো"] = "om", -- Oromo
["ওরোকেঁন"] = "orh", -- Oroqen
["ওরোওয়ে"] = "bpk", -- Orowe
["ওরুম]"] = "orr", -- Oruma
["ওরিয়া"] = "ury", -- Orya
["ওসেজ"] = "osa", -- Osage
["ওসামায়ি"] = "syx", -- Osamayi
["ওসাতু"] = "ost", -- Osatu
["ওস্কান"] = "osc", -- Oscan
["ওসিং"] = "osi", -- Osing
["ওসোসো"] = "oso", -- Ososo
["ওসেতিয়ান"] = "os", -- Ossetian
["ওত ডানুম"] = "otd", -- Ot Danum
["ওটাঙ্ক"] = "uta", -- Otank
["ওটি"] = "oti", -- Oti
["ওটোমাকো"] = "sai-oto", -- Otomaco
["ওতোরো"] = "otr", -- Otoro
["ওটাওয়া"] = "otw", -- Ottawa
["অটোমান তুর্কি"] = "ota", -- Ottoman Turkish
["ওতুক]"] = "otu", -- Otuke
["ওউমা"] = "oum", -- Ouma
["ওউনে"] = "oue", -- Oune
["ওওয়া"] = "stn", -- Owa
["ওউইনিয়া"] = "wsr", -- Owenia
["ওউইনিগা"] = "owi", -- Owiniga
["অয়"] = "oyb", -- Oy
["ওয়া'ওয়া"] = "oyy", -- Oya'oya
["ওয়াইডা"] = "oyd", -- Oyda
["ওজোলোটেপেক জাপোটেক"] = "zao", -- Ozolotepec Zapotec
["ওজুমাসিন চিনান্তে"] = "chz", -- Ozumacín Chinantec
["পা"] = "ppt", -- Pa
["পা ডি"] = "pdi", -- Pa Di
["পা'আ"] = "pqa", -- Pa'a
["পা'ও কারেন"] = "blk", -- Pa'o Karen
["পা-হং"] = "pha", -- Pa-Hng
["পামেস"] = "pma", -- Paamese
["পাসাল"] = "sig", -- Paasaal
["পাকাহুয়ারা"] = "pcp", -- Pacahuara
["পাকোহ"] = "pac", -- Pacoh
["পাদোয়ে"] = "pdo", -- Padoe
["পাইলিনিয়ান"] = "pgn", -- Paelignian
["পায়োনিয়ান"] = "ine-pae", -- Paeonian
["পাগি"] = "pgi", -- Pagi
["পাগিবেতে"] = "pae", -- Pagibete
["পাগু"] = "pgu", -- Pagu
["পাহানান আগতা"] = "apf", -- Pahanan Agta
["পাহাড়ি-পোতওয়ারি"] = "phr", -- Pahari-Potwari
["পাহি"] = "lgt", -- Pahi
["পাহলাভানি"] = "phv", -- Pahlavani
["পাই ট্যাভিটেরা"] = "pta", -- Pai Tavytera
["পাইসি"] = "pri", -- Paicî
["পাইকোনকা"] = "awd-pai", -- Paikoneka
["পাইপাই"] = "ppi", -- Paipai
["পাইটে"] = "pck", -- Paite
["পাইওয়ান"] = "pwn", -- Paiwan
["পাজাপান নাহুয়াতল"] = "nhp", -- Pajapan Nahuatl
["পাক-তং"] = "pkg", -- Pak-Tong
["পাকানহা"] = "pkn", -- Pakanha
["পাকিস্তান সাইন ল্যাঙ্গুয়েজ"] = "pks", -- Pakistan Sign Language
["পাকু"] = "pku", -- Paku
["পাকু কারেন"] = "jkp", -- Paku Karen
["পাল"] = "abw", -- Pal
["পালাইক"] = "plq", -- Palaic
["পালাকা সেনুফো"] = "plr", -- Palaka Senoufo
["পালান্টলা চিনান্তে"] = "cpa", -- Palantla Chinantec
["পালাউয়ান"] = "pau", -- Palauan
["পালাওয়ান বাতাক"] = "bya", -- Palawan Batak
["পালেণী"] = "pnl", -- Paleni
["পালেঙ্কেড়ো"] = "pln", -- Palenquero
["পালেয়ামি"] = "yok-ply", -- Palewyami
["পালি"] = "pi", -- Pali
["পালিকুর"] = "plu", -- Palikur
["পালিয়ান"] = "pcf", -- Paliyan
["পাল্লাঙ্গানমিডডাং"] = "pmd", -- Pallanganmiddang
["পালর"] = "fap", -- Palor
["পাল্টা"] = "sai-pal", -- Palta
["পালু'এ"] = "ple", -- Palu'e
["পালুয়ান"] = "plz", -- Paluan
["পাল্যা বারেলি"] = "bpx", -- Palya Bareli
["পাম"] = "pmn", -- Pam
["পাম্বিয়া"] = "pmb", -- Pambia
["পামিগুয়া"] = "sai-pam", -- Pamigua
["পামলিকো"] = "pmk", -- Pamlico
["পামোনা"] = "pmf", -- Pamona
["পামোসু"] = "hih", -- Pamosu
["পামপ্লোনা আত্তা"] = "att", -- Pamplona Atta
["পানা (সেন্ট্রাল আফ্রিকা)"] = "pnz", -- Pana (Central Africa)
["পানা (পশ্চিম আফ্রিকা)"] = "pnq", -- Pana (West Africa)
["পানামানিয়ান সাইন ল্যাঙ্গুয়েজ"] = "lsp", -- Panamanian Sign Language
["পানামিন্ট"] = "par", -- Panamint
["পানারে"] = "pbh", -- Panare
["পানারা"] = "kre", -- Panará
["পানাসুয়ান"] = "psn", -- Panasuan
["পানাওয়া"] = "pwb", -- Panawa
["পানসানা"] = "pnp", -- Pancana
["পাঞ্চপার্গানিয়া"] = "tdb", -- Panchpargania
["পান্ডে"] = "bkj", -- Pande
["পাঙ্গাসিনান"] = "pag", -- Pangasinan
["পাংসেনগ"] = "pgs", -- Pangseng
["পাঙ্গুতারাণ সামা"] = "slm", -- Pangutaran Sama
["পাংওয়া"] = "pbr", -- Pangwa
["পাংওয়ালি"] = "pgg", -- Pangwali
["পানিম"] = "pnr", -- Panim
["পানিয়া"] = "pcg", -- Paniya
["পানকারারে"] = "pax", -- Pankararé
["পানকারারু"] = "paz", -- Pankararú
["পানখু"] = "pkh", -- Pankhu
["পান্নেই"] = "pnc", -- Pannei
["পানোনিয়ান রুসিন"] = "rsk", -- Pannonian Rusyn
["পানবো"] = "pno", -- Panobo
["পানয়ি বাই"] = "bfc", -- Panyi Bai
["পানয়িজমা"] = "pnw", -- Panyjima
["পানজালেও"] = "sai-pnz", -- Panzaleo
["পাও"] = "ppa", -- Pao
["পাপান্তলা টোটোনাক"] = "top", -- Papantla Totonac
["পাপাপানা"] = "ppn", -- Papapana
["পাপার"] = "dpp", -- Papar
["পাপাসেনা"] = "pas", -- Papasena
["পাপেল"] = "pbo", -- Papel
["পাপি"] = "ppe", -- Papi
["পাপিয়ামান্টু"] = "pap", -- Papiamentu
["পাপোরা"] = "ppu", -- Papora
["পাপুয়া নিউ গিনি সাইন ল্যাঙ্গুয়েজ"] = "pgz", -- Papua New Guinean Sign Language
["পাপুয়ান মালয়"] = "pmy", -- Papuan Malay
["পাপুমা"] = "ppm", -- Papuma
["পারা নাগা"] = "pzn", -- Para Naga
["পারচি"] = "prc", -- Parachi
["প্যারাগুয়েয়ান গুয়ারানি"] = "gug", -- Paraguayan Guaraní
["প্যারাগুয়েয়ান সাইন ল্যাঙ্গুয়েজ"] = "pys", -- Paraguayan Sign Language
["পরাকানা"] = "pak", -- Parakanã
["পারাণান"] = "prf", -- Paranan
["পারানাওয়াত"] = "paf", -- Paranawát
["পারাতো"] = "sai-par", -- Paratió
["পারাউজানো"] = "pbg", -- Paraujano
["পারৌক"] = "prk", -- Parauk
["পারওয়েন"] = "prw", -- Parawen
["পারধান"] = "pch", -- Pardhan
["পার্ধী"] = "pcl", -- Pardhi
["পারে"] = "asa", -- Pare
["পারেসি"] = "pab", -- Pareci
["পারেডারের্মে"] = "xpd", -- Paredarerme
["পারেঙ্গা"] = "pcj", -- Parenga
["পার্কারি কোলি"] = "kvx", -- Parkari Koli
["পার্শিয়ান"] = "xpr", -- Parthian
["পারিয়া"] = "paq", -- Parya
["পারা আরারা"] = "aap", -- Pará Arára
["পারা গাভিয়াও"] = "gvp", -- Pará Gavião
["পশতু"] = "ps", -- Pashto
["পাসি"] = "psq", -- Pasi
["পাস ভ্যালি ইয়ালি"] = "yac", -- Pass Valley Yali
["পাসে"] = "awd-pas", -- Pasé
["পাতাগন"] = "sai-ptg", -- Patagón
["পাতামোনা"] = "pbc", -- Patamona
["পাতানি"] = "ptn", -- Patani
["পাতাক্সো হা-হা-হা"] = "pth", -- Pataxó Hã-Ha-Hãe
["পাতেপ"] = "ptp", -- Patep
["পাথিয়া"] = "pty", -- Pathiya
["পাতপাতার"] = "gfk", -- Patpatar
["পাতানি"] = "lae", -- Pattani
["পাতানি মালয়"] = "mfa", -- Pattani Malay
["পাত্তাপু"] = "ptq", -- Pattapu
["পাতউইন"] = "pwi", -- Patwin
["পাউলোহি"] = "plh", -- Paulohi
["পাউমারি"] = "pad", -- Paumarí
["পাউনাকে"] = "pnk", -- Paunaka
["পাউরি বারেলি"] = "bfb", -- Pauri Bareli
["পাউসের্না"] = "psm", -- Pauserna
["পাওয়াইয়া"] = "pwa", -- Pawaia
["পাওনী"] = "paw", -- Pawnee
["পায়াগুয়া"] = "sai-pyg", -- Payaguá
["পায়ানামার"] = "pmr", -- Paynamar
["পাজেহ"] = "pzh", -- Pazeh
["পে"] = "pai", -- Pe
["পেয়ার"] = "pcb", -- Pear
["পেচ"] = "pay", -- Pech
["পেচেনেগ"] = "xpc", -- Pecheneg
["পিরেপার"] = "xpw", -- Peerapper
["পিরে"] = "pfe", -- Peere
["পেই"] = "ppq", -- Pei
["পেকাল"] = "pel", -- Pekal
["পেলা"] = "bxd", -- Pela
["পেলে-আতা"] = "ata", -- Pele-Ata
["পেমোন"] = "aoc", -- Pemon
["পেনাং সাইন ল্যাঙ্গুয়েজ"] = "psg", -- Penang Sign Language
["পেঞ্চাল"] = "pek", -- Penchal
["পেন্ডাউ"] = "ums", -- Pendau
["পেঙ্গো"] = "peg", -- Pengo
["পেনসিলভেনিয়া জার্মান"] = "pdc", -- Pennsylvania German
["পেনবস্কট"] = "aaq", -- Penobscot
["পেনরিন"] = "pnh", -- Penrhyn
["পেন্টলাচ"] = "ptw", -- Pentlatch
["পেরাই"] = "wet", -- Perai
["পেরানাকান ইন্দোনেশিয়ান"] = "pea", -- Peranakan Indonesian
["পেরেমা"] = "wom", -- Perema
["পেরিকু"] = "nai-per", -- Pericú
["পেরো"] = "pip", -- Pero
["পার্সিয়ান"] = "fa", -- Persian
["পার্সিয়ান সাইন ল্যাঙ্গুয়েজ"] = "psc", -- Persian Sign Language
["পেরুভিয়ান সাইন ল্যাঙ্গুয়েজ"] = "prl", -- Peruvian Sign Language
["পেটাপা জাপোটেক"] = "zpe", -- Petapa Zapotec
["পেটাতস"] = "pex", -- Petats
["পেটজো"] = "pey", -- Petjo
["পেনোলেস মিক্সটেক"] = "mil", -- Peñoles Mixtec
["ফাই"] = "prt", -- Phai
["ফাকে"] = "phk", -- Phake
["ফালা"] = "ypa", -- Phala
["ফালুরা"] = "phl", -- Phalura
["ফানা'"] = "phq", -- Phana'
["ফাংডুয়ালি"] = "phw", -- Phangduwali
["ফেন্দে"] = "pem", -- Phende
["ফিলিপাইন সাইন ল্যাঙ্গুয়েজ"] = "psp", -- Philippine Sign Language
["ফিলিস্তিন"] = "mis-phi", -- Philistine
["ফিম্বি"] = "phm", -- Phimbi
["ফোয়েনিসিয়ান"] = "phn", -- Phoenician
["ফোলা"] = "ypg", -- Phola
["ফলো"] = "yip", -- Pholo
["ফম"] = "nph", -- Phom
["ফং-নিয়াং"] = "pnx", -- Phong-Kniang
["ফ্রাই পিভো"] = "kjt", -- Phrae Pwo
["ফ্রাইগিয়ান"] = "xpg", -- Phrygian
["ফু থাই"] = "pht", -- Phu Thai
["ফুয়ান"] = "phu", -- Phuan
["ফুডাগি"] = "phd", -- Phudagi
["ফুয়ি"] = "pug", -- Phuie
["ফুখ]"] = "phh", -- Phukha
["ফুমা"] = "ypm", -- Phuma
["ফুনি"] = "pho", -- Phunoi
["ফুওং"] = "phg", -- Phuong
["ফুপা"] = "ypp", -- Phupa
["ফুফা"] = "yph", -- Phupha
["ফুতি"] = "bnt-phu", -- Phuthi
["ফুজ]"] = "ypz", -- Phuza
["পিয়ামাটিঁসা"] = "ptr", -- Piamatsina
["পিয়ামে"] = "pin", -- Piame
["পিয়াপোকো"] = "pio", -- Piapoco
["পিয়ারোয়া"] = "pid", -- Piaroa
["পিকার্ড"] = "pcd", -- Picard
["পিচিংগ্লিস"] = "fpe", -- Pichinglis
["পিচিস আসেঙ্কা"] = "cpu", -- Pichis Ashéninka
["পিকটিশন"] = "xpi", -- Pictish
["পিকুরিস"] = "nai-pic", -- Picuris
["পিডজিন ডেলাওয়্যার"] = "dep", -- Pidgin Delaware
["পিডজিন ইহা"] = "ihb", -- Pidgin Iha
["পিডজিন ওনিন"] = "onx", -- Pidgin Onin
["পিয়েডমন্টিস"] = "pms", -- Piedmontese
["পিজাও"] = "pij", -- Pijao
["পিজে"] = "piz", -- Pije
["পিজিন"] = "pis", -- Pijin
["পিলাগ]"] = "plg", -- Pilagá
["পিলেনি"] = "piv", -- Pileni
["পিমা বাজো"] = "pia", -- Pima Bajo
["পিম্বওয়ে"] = "piw", -- Pimbwe
["পিনাই-হাগাহাই"] = "pnn", -- Pinai-Hagahai
["পিঙ্গেল্যাপিস"] = "pif", -- Pingelapese
["পিনি"] = "pii", -- Pini
["পিনিকুরা"] = "pnv", -- Pinigura
["পিনজারুপ"] = "pnj", -- Pinjarup
["পিনজি"] = "pic", -- Pinji
["পিনাটেপা নাসিওনাল মিক্সটেক"] = "mio", -- Pinotepa Nacional Mixtec
["পিন্টিইনি"] = "pti", -- Pintiini
["পিন্টুপি-লুরিটজা"] = "piu", -- Pintupi-Luritja
["পিনয়িন"] = "pny", -- Pinyin
["পিপিল"] = "ppl", -- Pipil
["পিরাহা"] = "myp", -- Pirahã
["পিরাটাপুয়ো"] = "pir", -- Piratapuyo
["পিয়ারলাটাপা"] = "bxi", -- Pirlatapa
["পিরো"] = "pie", -- Piro
["পিরিয়]"] = "xpa", -- Pirriya
["পিসাবো"] = "pig", -- Pisabo
["পিসাফ্লোরেস তেপেহুয়া"] = "tpp", -- Pisaflores Tepehua
["পিস্কাটাওয়াই"] = "psy", -- Piscataway
["পিসিডিয়ান"] = "xps", -- Pisidian
["পিটকায়র্ন-নরফোক"] = "pih", -- Pitcairn-Norfolk
["পিটে সামি"] = "sje", -- Pite Sami
["পিটি"] = "pcn", -- Piti
["পিটজান্টজাটজার]"] = "pjt", -- Pitjantjatjara
["পিট্টা-পিট্টা"] = "pit", -- Pitta-Pitta
["পিইউ"] = "pix", -- Piu
["পিয়া-কোয়ানচি"] = "piy", -- Piya-Kwonci
["প্লেইনস আপাচি"] = "apk", -- Plains Apache
["প্লেইনস ক্রী"] = "crk", -- Plains Cree
["প্লেইনস ইন্ডিয়ান সাইন ল্যাঙ্গুয়েজ"] = "psd", -- Plains Indian Sign Language
["প্লেইনস মিউক"] = "pmw", -- Plains Miwok
["প্লাপো ক্রুমেন"] = "ktj", -- Plapo Krumen
["প্লাউটডিটশ"] = "pdt", -- Plautdietsch
["প্লেয়ারো"] = "gob", -- Playero
["পনার"] = "pbv", -- Pnar
["পোচুরি নাগা"] = "npo", -- Pochuri Naga
["পোচুটেক"] = "xpo", -- Pochutec
["পোডোকো"] = "pbi", -- Podoko
["পোগালি"] = "hkh", -- Pogali
["পোগোলো"] = "poy", -- Pogolo
["পনপিয়ান"] = "pon", -- Pohnpeian
["পোইটেভিন-সাইনটোঞ্জাইস"] = "roa-poi", -- Poitevin-Saintongeais
["পোকঙ্গা"] = "pok", -- Pokangá
["পোকে"] = "pof", -- Poke
["পোল"] = "pmm", -- Pol
["পোলাবিয়ান"] = "pox", -- Polabian
["পোলসি"] = "plj", -- Polci
["পোলিশ"] = "pl", -- Polish
["পোলিশ সাইন ল্যাঙ্গুয়েজ"] = "pso", -- Polish Sign Language
["পোলোনোম্বাউক"] = "plb", -- Polonombauk
["পম"] = "pmo", -- Pom
["পোনাম"] = "ncc", -- Ponam
["পঙ্গু"] = "png", -- Pongu
["পোনোশাকান"] = "pns", -- Ponosakan
["পন্টিক গ্রিক"] = "pnt", -- Pontic Greek
["পনিয়ো"] = "npg", -- Ponyo
["পোকোমম"] = "poc", -- Poqomam
["পোকোমচি'"] = "poh", -- Poqomchi'
["পোরোহানন"] = "prh", -- Porohanon
["পোর্ট স্যান্ডউইচ"] = "psw", -- Port Sandwich
["পোর্ট সোরেল"] = "xpl", -- Port Sorell
["পোর্ট ভাটো"] = "ptv", -- Port Vato
["পর্তুগিজ"] = "pt", -- Portuguese
["পর্তুগিজ সাইন ল্যাঙ্গুয়েজ"] = "psr", -- Portuguese Sign Language
["পোটাওয়াটোমি"] = "pot", -- Potawatomi
["পোটিগুয়ারা"] = "pog", -- Potiguára
["পৌমেই নাগা"] = "pmx", -- Poumei Naga
["পুইয়ে"] = "bye", -- Pouye
["পওয়ারি"] = "pwr", -- Powari
["পওহটান"] = "pim", -- Powhatan
["পোয়ানাউয়া"] = "pyn", -- Poyanáwa
["প্রাকৃত"] = "pra", -- Prakrit
["প্রাসুনি"] = "prn", -- Prasuni
["প্রি-স্যামনাইট"] = "itc-psa", -- Pre-Samnite
["প্রিমিটিভ আইরিশ"] = "pgl", -- Primitive Irish
["প্রিন্সিপেন্স"] = "pre", -- Principense
["প্রত্ন-আবখাজ-আবাজা"] = "cau-abz-pro", -- Proto-Abkhaz-Abaza
["প্রত্ন-আফ্রোসিয়াটিক"] = "afa-pro", -- Proto-Afroasiatic
["প্রত্ন-আলবেনিয়ান"] = "sqj-pro", -- Proto-Albanian
["প্রত্ন-আলগিক"] = "aql-pro", -- Proto-Algic
["প্রত্ন-আলগনকুইয়ান"] = "alg-pro", -- Proto-Algonquian
["প্রত্ন-আমুয়েসা-চামিকুরো"] = "awd-amc-pro", -- Proto-Amuesha-Chamicuro
["প্রত্ন-আনাতোলিয়ান"] = "ine-ana-pro", -- Proto-Anatolian
["প্রত্ন-আন্ডিয়ান"] = "cau-and-pro", -- Proto-Andian
["প্রত্ন-আপাচিয়ান"] = "apa-pro", -- Proto-Apachean
["প্রত্ন-আরাভা"] = "auf-pro", -- Proto-Arawa
["প্রত্ন-আরাওয়াক"] = "awd-pro", -- Proto-Arawak
["প্রত্ন-আর্মেনিয়ান"] = "hyx-pro", -- Proto-Armenian
["প্রত্ন-আর্নহেম"] = "aus-arn-pro", -- Proto-Arnhem
["প্রত্ন-অ্যারয়েড"] = "omv-aro-pro", -- Proto-Aroid
["প্রত্ন-আস্লিয়ান"] = "mkh-asl-pro", -- Proto-Aslian
["প্রত্ন-আটায়ালিক"] = "map-ata-pro", -- Proto-Atayalic
["প্রত্ন-আথাবাস্কান"] = "ath-pro", -- Proto-Athabaskan
["প্রত্ন-আটলান্টিক-কঙ্গো"] = "alv-pro", -- Proto-Atlantic-Congo
["প্রত্ন-অস্ট্রোএশিয়াটিক"] = "aav-pro", -- Proto-Austroasiatic
["প্রত্ন-অস্ট্রোনেশিয়ান"] = "map-pro", -- Proto-Austronesian
["প্রত্ন-আভারো-আন্ডিয়ান"] = "cau-ava-pro", -- Proto-Avaro-Andian
["প্রত্ন-বাহ্নারিক"] = "mkh-ban-pro", -- Proto-Bahnaric
["প্রত্ন-বাই"] = "sit-bai-pro", -- Proto-Bai
["প্রত্ন-বাল্টো-স্লাভিক"] = "ine-bsl-pro", -- Proto-Balto-Slavic
["প্রত্ন-বান্টয়েড"] = "nic-bod-pro", -- Proto-Bantoid
["প্রত্ন-বান্টু"] = "bnt-pro", -- Proto-Bantu
["প্রত্ন-বাস্ক"] = "euq-pro", -- Proto-Basque
["প্রত্ন-বাটাক"] = "btk-pro", -- Proto-Batak
["প্রত্ন-বে"] = "qfa-onb-pro", -- Proto-Be
["প্রত্ন-বে-তাই"] = "qfa-bet-pro", -- Proto-Be-Tai
["প্রত্ন-বেনুয়ে-কঙ্গো"] = "nic-bco-pro", -- Proto-Benue-Congo
["প্রত্ন-বার্বার"] = "ber-pro", -- Proto-Berber
["প্রত্ন-বোডিশ"] = "sit-bdi-pro", -- Proto-Bodish
["প্রত্ন-বোডো-গারো"] = "tbq-bdg-pro", -- Proto-Bodo-Garo
["প্রত্ন-বংগো-বাগির্মি"] = "csu-bba-pro", -- Proto-Bongo-Bagirmi
["প্রত্ন-বোরান"] = "sai-bor-pro", -- Proto-Boran
["প্রত্ন-ব্রাইথনিক"] = "cel-bry-pro", -- Proto-Brythonic
["প্রত্ন-বুয়া"] = "alv-bua-pro", -- Proto-Bua
["প্রত্ন-বুংকু-তোলাকি"] = "poz-btk-pro", -- Proto-Bungku-Tolaki
["প্রত্ন-বর্মী"] = "tbq-brm-pro", -- Proto-Burmish
["প্রত্ন-ক্যাডডোহান"] = "cdd-pro", -- Proto-Caddoan
["প্রত্ন-কাঙ্গিন"] = "alv-cng-pro", -- Proto-Cangin
["প্রত্ন-কারিবান"] = "sai-car-pro", -- Proto-Cariban
["প্রত্ন-কেল্টিক"] = "cel-pro", -- Proto-Celtic
["প্রত্ন-সেন্ট্রাল চাডিক"] = "cdc-cbm-pro", -- Proto-Central Chadic
["প্রত্ন-সেন্ট্রাল দ্রাবিড়িয়ান"] = "dra-cen-pro", -- Proto-Central Dravidian
["প্রত্ন-সেন্ট্রাল জে"] = "sai-cje-pro", -- Proto-Central Jê
["প্রত্ন-সেন্ট্রাল নাগা"] = "sit-aao-pro", -- Proto-Central Naga
["প্রত্ন-সেন্ট্রাল নিউ দক্ষিণ ওয়েলস"] = "aus-cww-pro", -- Proto-Central New South Wales
["প্রত্ন-সেন্ট্রাল সুদানি"] = "csu-pro", -- Proto-Central Sudanic
["প্রত্ন-সেন্ট্রাল টোগো"] = "alv-gtm-pro", -- Proto-Central Togo
["প্রত্ন-সেন্ট্রাল-পূর্বী মালয়ো-পলিনেশিয়ান"] = "poz-cet-pro", -- Proto-Central-Eastern Malayo-Polynesian
["প্রত্ন-সেরাদো"] = "sai-cer-pro", -- Proto-Cerrado
["প্রত্ন-চাডিক"] = "cdc-pro", -- Proto-Chadic
["প্রত্ন-চামিক"] = "cmc-pro", -- Proto-Chamic
["প্রত্ন-চ্যাটিনো"] = "omq-cha-pro", -- Proto-Chatino
["প্রত্ন-চিবচান"] = "cba-pro", -- Proto-Chibchan
["প্রত্ন-চিমাকুয়ান"] = "chi-pro", -- Proto-Chimakuan
["প্রত্ন-চিনুকান"] = "nai-ckn-pro", -- Proto-Chinookan
["প্রত্ন-চুকোটকো-কামচাটকান"] = "qfa-cka-pro", -- Proto-Chukotko-Kamchatkan
["প্রত্ন-চুমাস"] = "nai-chu-pro", -- Proto-Chumash
["প্রত্ন-সার্কাসিয়ান"] = "cau-cir-pro", -- Proto-Circassian
["প্রত্ন-কুপান"] = "azc-cup-pro", -- Proto-Cupan
["প্রত্ন-কুশিয়টিক"] = "cus-pro", -- Proto-Cushitic
["প্রত্ন-ডাজু"] = "sdv-daj-pro", -- Proto-Daju
["প্রত্ন-ডালি"] = "aus-dal-pro", -- Proto-Daly
["প্রত্ন-দারগওয়া"] = "cau-drg-pro", -- Proto-Dargwa
["প্রত্ন-ডিজয়েড"] = "omv-diz-pro", -- Proto-Dizoid
["প্রত্ন-দ্রাবিড়িয়ান"] = "dra-pro", -- Proto-Dravidian
["প্রত্ন-পূর্বী জেবেল"] = "sdv-eje-pro", -- Proto-Eastern Jebel
["প্রত্ন-পূর্বী মালয়ো-পলিনেশিয়ান"] = "pqe-pro", -- Proto-Eastern Malayo-Polynesian
["প্রত্ন-পূর্বী ওটি-ভোল্টা"] = "nic-eov-pro", -- Proto-Eastern Oti-Volta
["প্রত্ন-পূর্বী পলিনেশিয়ান"] = "poz-pep-pro", -- Proto-Eastern Polynesian
["প্রত্ন-এডেগিরি"] = "alv-edk-pro", -- Proto-Edekiri
["প্রত্ন-এডয়েড"] = "alv-edo-pro", -- Proto-Edoid
["প্রত্ন-এরসুয়িক"] = "sit-ers-pro", -- Proto-Ersuic
["প্রত্ন-এস্কিমো"] = "esx-esk-pro", -- Proto-Eskimo
["প্রত্ন-এস্কিমো-আলেউট"] = "esx-pro", -- Proto-Eskimo-Aleut
["প্রত্ন-ফালি"] = "alv-fli-pro", -- Proto-Fali
["প্রত্ন-ফিনিক"] = "urj-fin-pro", -- Proto-Finnic
["প্রত্ন-গবায়া"] = "gba-pro", -- Proto-Gbaya
["প্রত্ন-গ্বে"] = "alv-gbe-pro", -- Proto-Gbe
["প্রত্ন-জর্জিয়ান-জান"] = "ccs-gzn-pro", -- Proto-Georgian-Zan
["প্রত্ন-জার্মানিক"] = "gem-pro", -- Proto-Germanic
["প্রত্ন-গ্রাসফিল্ডস"] = "nic-grf-pro", -- Proto-Grassfields
["প্রত্ন-গ্রেট আন্ডামানিজ"] = "qfa-adm-pro", -- Proto-Great Andamanese
["প্রত্ন-গুয়াং"] = "alv-gng-pro", -- Proto-Guang
["প্রত্ন-গুর"] = "nic-gur-pro", -- Proto-Gur
["প্রত্ন-গুরুনসি"] = "nic-gns-pro", -- Proto-Gurunsi
["প্রত্ন-হাল্মাহেরা-সেন্ডেরাওয়াসিহ"] = "poz-hce-pro", -- Proto-Halmahera-Cenderawasih
["প্রত্ন-হেইবান"] = "alv-hei-pro", -- Proto-Heiban
["প্রত্ন-হেলেনিক"] = "grk-pro", -- Proto-Hellenic
["প্রত্ন-হাইল্যান্ড পূর্ব কুশিয়টিক"] = "cus-hec-pro", -- Proto-Highland East Cushitic
["প্রত্ন-হলাই"] = "qfa-lic-pro", -- Proto-Hlai
["প্রত্ন-হ্মং"] = "hmn-pro", -- Proto-Hmong
["প্রত্ন-হ্মং-মিয়েন"] = "hmx-pro", -- Proto-Hmong-Mien
["প্রত্ন-হ্রুশিস"] = "sit-hrs-pro", -- Proto-Hrusish
["প্রত্ন-হুরো-উরারতিয়ান"] = "qfa-hur-pro", -- Proto-Hurro-Urartian
["প্রত্ন-ইদোময়েড"] = "alv-ido-pro", -- Proto-Idomoid
["প্রত্ন-ইগবয়েড"] = "alv-igb-pro", -- Proto-Igboid
["প্রত্ন-ইজয়েড"] = "ijo-pro", -- Proto-Ijoid
["প্রত্ন-ইন্দো-আর্য"] = "inc-pro", -- Proto-Indo-Aryan
["প্রত্ন-ইন্দো-ইউরোপীয়"] = "ine-pro", -- Proto-Indo-European
["প্রত্ন-ইন্দো-ইরানিয়ান"] = "iir-pro", -- Proto-Indo-Iranian
["প্রত্ন-ইনুইত"] = "esx-inu-pro", -- Proto-Inuit
["প্রত্ন-ইরানিয়ান"] = "ira-pro", -- Proto-Iranian
["প্রত্ন-ইরোকোইয়ান"] = "iro-pro", -- Proto-Iroquoian
["প্রত্ন-ইটালিক"] = "itc-pro", -- Proto-Italic
["প্রত্ন-ইওয়াইজিয়ান"] = "aus-wdj-pro", -- Proto-Iwaidjan
["প্রত্ন-জাপোনিক"] = "jpx-pro", -- Proto-Japonic
["প্রত্ন-জুনয়েড"] = "nic-jkn-pro", -- Proto-Jukunoid
["প্রত্ন-জে"] = "sai-jee-pro", -- Proto-Jê
["প্রত্ন-কাদু"] = "qfa-kad-pro", -- Proto-Kadu
["প্রত্ন-কালামিয়ান"] = "phi-kal-pro", -- Proto-Kalamian
["প্রত্ন-কালাপুয়ান"] = "nai-klp-pro", -- Proto-Kalapuyan
["প্রত্ন-কাম-সুই"] = "qfa-kms-pro", -- Proto-Kam-Sui
["প্রত্ন-কাম্পা"] = "awd-kmp-pro", -- Proto-Kampa
["প্রত্ন-কামতা"] = "inc-krd-pro", -- Proto-Kamta
["প্রত্ন-কারেন"] = "kar-pro", -- Proto-Karen
["প্রত্ন-কার্টভেলিয়ান"] = "ccs-pro", -- Proto-Kartvelian
["প্রত্ন-কাতুইক"] = "mkh-kat-pro", -- Proto-Katuic
["প্রত্ন-খাম"] = "sit-kha-pro", -- Proto-Kham
["প্রত্ন-খান্টি"] = "kca-pro", -- Proto-Khanty
["প্রত্ন-খাসিয়ান"] = "aav-khs-pro", -- Proto-Khasian
["প্রত্ন-খেমেরিক"] = "mkh-kmr-pro", -- Proto-Khmeric
["প্রত্ন-খ্মুইক"] = "mkh-khm-pro", -- Proto-Khmuic
["প্রত্ন-খো-বওয়া"] = "sit-khb-pro", -- Proto-Kho-Bwa
["প্রত্ন-খোয়ে"] = "khi-kho-pro", -- Proto-Khoe
["প্রত্ন-কোমান"] = "ssa-kom-pro", -- Proto-Koman
["প্রত্ন-কোমিসেনিয়ান"] = "ira-kms-pro", -- Proto-Komisenian
["প্রত্ন-কোরিয়ানিক"] = "qfa-kor-pro", -- Proto-Koreanic
["প্রত্ন-ক্রা"] = "qfa-kra-pro", -- Proto-Kra
["প্রত্ন-ক্রা-ডাই"] = "qfa-tak-pro", -- Proto-Kra-Dai
["প্রত্ন-ক্রু"] = "kro-pro", -- Proto-Kru
["প্রত্ন-কুকি-চিন"] = "tbq-kuk-pro", -- Proto-Kuki-Chin
["প্রত্ন-কুলিয়াক"] = "ssa-klk-pro", -- Proto-Kuliak
["প্রত্ন-কুর্দিশ"] = "ku-pro", -- Proto-Kurdish
["প্রত্ন-কোয়া"] = "alv-kwa-pro", -- Proto-Kwa
["প্রত্ন-লালু"] = "tbq-lal-pro", -- Proto-Lalo
["প্রত্ন-লাম্পুংগিক"] = "poz-lgx-pro", -- Proto-Lampungic
["প্রত্ন-লেজগিয়ান"] = "cau-lzg-pro", -- Proto-Lezghian
["প্রত্ন-লোলো-বর্মী"] = "tbq-lob-pro", -- Proto-Lolo-Burmese
["প্রত্ন-লোলোইশ"] = "tbq-lol-pro", -- Proto-Loloish
["প্রত্ন-লোয়ার ক্রস রিভার"] = "nic-lcr-pro", -- Proto-Lower Cross River
["প্রত্ন-লুইশ"] = "sit-luu-pro", -- Proto-Luish
["প্রত্ন-মাইডুন"] = "nai-mdu-pro", -- Proto-Maidun
["প্রত্ন-মালয়িক"] = "poz-mly-pro", -- Proto-Malayic
["প্রত্ন-মালয়ো-চামিক"] = "poz-mcm-pro", -- Proto-Malayo-Chamic
["প্রত্ন-মালয়ো-পলিনেশিয়ান"] = "poz-pro", -- Proto-Malayo-Polynesian
["প্রত্ন-মালয়ো-সুম্বাওয়ান"] = "poz-msa-pro", -- Proto-Malayo-Sumbawan
["প্রত্ন-মান্দে"] = "dmn-pro", -- Proto-Mande
["প্রত্ন-মাংবেতু"] = "csu-maa-pro", -- Proto-Mangbetu
["প্রত্ন-মান্সি"] = "mns-pro", -- Proto-Mansi
["প্রত্ন-মারি"] = "chm-pro", -- Proto-Mari
["প্রত্ন-মাসা"] = "cdc-mas-pro", -- Proto-Masa
["প্রত্ন-মায়ান"] = "myn-pro", -- Proto-Mayan
["প্রত্ন-মাজাটেক"] = "omq-maz-pro", -- Proto-Mazatec
["প্রত্ন-মেডো-পার্থিয়ান"] = "ira-mpr-pro", -- Proto-Medo-Parthian
["প্রত্ন-মাইক্রোনেশিয়ান"] = "poz-mic-pro", -- Proto-Micronesian
["প্রত্ন-মিয়েন"] = "hmx-mie-pro", -- Proto-Mien
["প্রত্ন-মিন"] = "zhx-min-pro", -- Proto-Min
["প্রত্ন-মিক্সে-জোক"] = "nai-miz-pro", -- Proto-Mixe-Zoque
["প্রত্ন-মিক্সটেক"] = "omq-mxt-pro", -- Proto-Mixtec
["প্রত্ন-মিক্সটেকান"] = "omq-mix-pro", -- Proto-Mixtecan
["প্রত্ন-মন-খেমের"] = "mkh-pro", -- Proto-Mon-Khmer
["প্রত্ন-মঙ্গোলিক"] = "xgn-pro", -- Proto-Mongolic
["প্রত্ন-মনিক"] = "mkh-mnc-pro", -- Proto-Monic
["প্রত্ন-মর্ডভিনিক"] = "urj-mdv-pro", -- Proto-Mordvinic
["প্রত্ন-মুমুয়ে"] = "alv-mum-pro", -- Proto-Mumuye
["প্রত্ন-মুন্ডা"] = "mun-pro", -- Proto-Munda
["প্রত্ন-মুঞ্জি-ইডঘা"] = "ira-mny-pro", -- Proto-Munji-Yidgha
["প্রত্ন-মাস্কোগিয়ান"] = "nai-mus-pro", -- Proto-Muskogean
["প্রত্ন-না-ডেন"] = "xnd-pro", -- Proto-Na-Dene
["প্রত্ন-নাহুয়ান"] = "azc-nah-pro", -- Proto-Nahuan
["প্রত্ন-নাইশ"] = "sit-nas-pro", -- Proto-Naish
["প্রত্ন-নাখ"] = "cau-nkh-pro", -- Proto-Nakh
["প্রত্ন-নাভিকি"] = "awd-nwk-pro", -- Proto-Nawiki
["প্রত্ন-নগুনি"] = "bnt-ngu-pro", -- Proto-Nguni
["প্রত্ন-নিকোবারেসে"] = "aav-nic-pro", -- Proto-Nicobarese
["প্রত্ন-নাইজার-কঙ্গো"] = "nic-pro", -- Proto-Niger-Congo
["প্রত্ন-নিলো-সাহারা"] = "ssa-pro", -- Proto-Nilo-Saharan
["প্রত্ন-নিলোটিক"] = "sdv-nil-pro", -- Proto-Nilotic
["প্রত্ন-নর্স"] = "gmq-pro", -- Proto-Norse
["প্রত্ন-উত্তর দ্রাবিড়িয়ান"] = "dra-nor-pro", -- Proto-North Dravidian
["প্রত্ন-উত্তর হাল্মাহেরা"] = "paa-nha-pro", -- Proto-North Halmahera
["প্রত্ন-উত্তর ইরোকোইয়ান"] = "iro-nor-pro", -- Proto-North Iroquoian
["প্রত্ন-উত্তর সারাওয়াক"] = "poz-swa-pro", -- Proto-North Sarawak
["প্রত্ন-উত্তরপূর্ব ককেশিয়ান"] = "cau-nec-pro", -- Proto-Northeast Caucasian
["প্রত্ন-উত্তরি জে"] = "sai-nje-pro", -- Proto-Northern Jê
["প্রত্ন-উত্তরি নাগা"] = "sit-kon-pro", -- Proto-Northern Naga
["প্রত্ন-উত্তরপশ্চিম ককেশিয়ান"] = "cau-nwc-pro", -- Proto-Northwest Caucasian
["প্রত্ন-নুবিয়ান"] = "nub-pro", -- Proto-Nubian
["প্রত্ন-নিউক্লিয়ার পলিনেশিয়ান"] = "poz-pnp-pro", -- Proto-Nuclear Polynesian
["প্রত্ন-নুমিক"] = "azc-num-pro", -- Proto-Numic
["প্রত্ন-নুপয়েড"] = "alv-nup-pro", -- Proto-Nupoid
["প্রত্ন-নুরিস্তানি"] = "iir-nur-pro", -- Proto-Nuristani
["প্রত্ন-নাইমা"] = "sdv-nyi-pro", -- Proto-Nyima
["প্রত্ন-নিউইয়ুলান"] = "aus-nyu-pro", -- Proto-Nyulnyulan
["প্রত্ন-ওশিয়ানিক"] = "poz-oce-pro", -- Proto-Oceanic
["প্রত্ন-ওগনি"] = "nic-ogo-pro", -- Proto-Ogoni
["প্রত্ন-ওমোটিক"] = "omv-pro", -- Proto-Omotic
["প্রত্ন-ওঙ্গান"] = "qfa-ong-pro", -- Proto-Ongan
["প্রত্ন-ওটি-ভোল্টা"] = "nic-ovo-pro", -- Proto-Oti-Volta
["প্রত্ন-ওটো-মাঙ্গুয়ান"] = "omq-pro", -- Proto-Oto-Manguean
["প্রত্ন-ওটো-পামিয়ান"] = "omq-otp-pro", -- Proto-Oto-Pamean
["প্রত্ন-ওটোমি"] = "oto-otm-pro", -- Proto-Otomi
["প্রত্ন-ওটোমিয়ান"] = "oto-pro", -- Proto-Otomian
["প্রত্ন-পাকানিক"] = "mkh-pkn-pro", -- Proto-Pakanic
["প্রত্ন-পালাউংগিক"] = "mkh-pal-pro", -- Proto-Palaungic
["প্রত্ন-পামা-নিউইউংগান"] = "aus-pam-pro", -- Proto-Pama-Nyungan
["প্রত্ন-পারেসি-ওয়ারা"] = "awd-prw-pro", -- Proto-Paresi-Waura
["প্রত্ন-পাঠান"] = "ira-pat-pro", -- Proto-Pathan
["প্রত্ন-পিয়ারিক"] = "mkh-pea-pro", -- Proto-Pearic
["প্রত্ন-পার্মিক"] = "urj-prm-pro", -- Proto-Permic
["প্রত্ন-ফিলিপাইন"] = "phi-pro", -- Proto-Philippine
["প্রত্ন-প্লেটো"] = "nic-plt-pro", -- Proto-Plateau
["প্রত্ন-প্লেটো পেনুটিয়ান"] = "nai-plp-pro", -- Proto-Plateau Penutian
["প্রত্ন-পনার-খাসি-লিংগনম"] = "aav-pkl-pro", -- Proto-Pnar-Khasi-Lyngngam
["প্রত্ন-পলিনেশিয়ান"] = "poz-pol-pro", -- Proto-Polynesian
["প্রত্ন-পোমো"] = "nai-pom-pro", -- Proto-Pomo
["প্রত্ন-পুরোইক"] = "sit-khp-pro", -- Proto-Puroik
["প্রত্ন-কুয়েচুয়ান"] = "qwe-pro", -- Proto-Quechuan
["প্রত্ন-রুকাই"] = "dru-pro", -- Proto-Rukai
["প্রত্ন-রিউইউকুয়ান"] = "jpx-ryu-pro", -- Proto-Ryukyuan
["প্রত্ন-সাকা"] = "xsc-sak-pro", -- Proto-Saka
["প্রত্ন-সাকা-ওয়াখি"] = "xsc-skw-pro", -- Proto-Saka-Wakhi
["প্রত্ন-সালিফ"] = "sal-pro", -- Proto-Salish
["প্রত্ন-সামিক"] = "smi-pro", -- Proto-Samic
["প্রত্ন-স্যাময়িডিক"] = "syd-pro", -- Proto-Samoyedic
["প্রত্ন-সাংলেচি-ইশকাসিমি"] = "ira-sgi-pro", -- Proto-Sanglechi-Ishkashimi
["প্রত্ন-সারা"] = "csu-sar-pro", -- Proto-Sara
["প্রত্ন-সার্মাটিয়ান"] = "xsc-sar-pro", -- Proto-Sarmatian
["প্রত্ন-সিথিয়ান"] = "xsc-pro", -- Proto-Scythian
["প্রত্ন-সেলকাপ"] = "sel-pro", -- Proto-Selkup
["প্রত্ন-সেমিটিক"] = "sem-pro", -- Proto-Semitic
["প্রত্ন-শুগনি-রৌশানি"] = "ira-shr-pro", -- Proto-Shughni-Roshani
["প্রত্ন-শুগনি-ইয়াজঘুলামি"] = "ira-shy-pro", -- Proto-Shughni-Yazghulami
["প্রত্ন-শুগনি-ইয়াজঘুলামি-মুঞ্জি"] = "ira-sym-pro", -- Proto-Shughni-Yazghulami-Munji
["প্রত্ন-সিনো-তিব্বতি"] = "sit-pro", -- Proto-Sino-Tibetan
["প্রত্ন-সিওয়ান"] = "sio-pro", -- Proto-Siouan
["প্রত্ন-সিওয়ান-ক্যাটাওয়াবান"] = "nai-sca-pro", -- Proto-Siouan-Catawban
["প্রত্ন-স্লাভিক"] = "sla-pro", -- Proto-Slavic
["প্রত্ন-সোগডিক"] = "ira-sgc-pro", -- Proto-Sogdic
["প্রত্ন-সোমালয়েড"] = "cus-som-pro", -- Proto-Somaloid
["প্রত্ন-সংহাই"] = "son-pro", -- Proto-Songhay
["প্রত্ন-সোথো-তসওয়ানা"] = "bnt-sts-pro", -- Proto-Sotho-Tswana
["প্রত্ন-দক্ষিণ কুশিয়টিক"] = "cus-sou-pro", -- Proto-South Cushitic
["প্রত্ন-দক্ষিণ দ্রাবিড়িয়ান"] = "dra-sou-pro", -- Proto-South Dravidian
["প্রত্ন-দক্ষিণ দ্রাবিড়িয়ান আই"] = "dra-sdo-pro", -- Proto-South Dravidian I
["প্রত্ন-দক্ষিণ দ্রাবিড়িয়ান দ্বিতীয়"] = "dra-sdt-pro", -- Proto-South Dravidian II
["প্রত্ন-দক্ষিণ সুলাওয়েসি"] = "poz-ssw-pro", -- Proto-South Sulawesi
["প্রত্ন-দক্ষিণি জে"] = "sai-sje-pro", -- Proto-Southern Jê
["প্রত্ন-দক্ষিণপশ্চিমি তাই"] = "tai-swe-pro", -- Proto-Southwestern Tai
["প্রত্ন-তা-আরাওয়াক"] = "awd-taa-pro", -- Proto-Ta-Arawak
["প্রত্ন-তাই"] = "tai-pro", -- Proto-Tai
["প্রত্ন-তাকিক"] = "azc-tak-pro", -- Proto-Takic
["প্রত্ন-তামান"] = "sdv-tmn-pro", -- Proto-Taman
["প্রত্ন-তামাংগিক"] = "sit-tam-pro", -- Proto-Tamangic
["প্রত্ন-টাংখুলিক"] = "sit-tng-pro", -- Proto-Tangkhulic
["প্রত্ন-তানি"] = "sit-tan-pro", -- Proto-Tani
["প্রত্ন-তারানোয়ান"] = "sai-tar-pro", -- Proto-Taranoan
["প্রত্ন-তাতিক"] = "xme-ttc-pro", -- Proto-Tatic
["প্রত্ন-টোচারিয়ান"] = "ine-toc-pro", -- Proto-Tocharian
["প্রত্ন-টোটোজোকিয়ান"] = "nai-tot-pro", -- Proto-Totozoquean
["প্রত্ন-ট্রান্স-নিউ গিনি"] = "ngf-pro", -- Proto-Trans-New Guinea
["প্রত্ন-ত্রিক"] = "omq-tri-pro", -- Proto-Trique
["প্রত্ন-ত্সেজিয়ান"] = "cau-tsz-pro", -- Proto-Tsezian
["প্রত্ন-সিমশিয়ানিক"] = "nai-tsi-pro", -- Proto-Tsimshianic
["প্রত্ন-তুংগাসিক"] = "tuw-pro", -- Proto-Tungusic
["প্রত্ন-তূপি-গুয়ারানি"] = "tup-gua-pro", -- Proto-Tupi-Guarani
["প্রত্ন-তূপিয়ান"] = "tup-pro", -- Proto-Tupian
["প্রত্ন-তুর্কি"] = "trk-pro", -- Proto-Turkic
["প্রত্ন-উবাংগিয়ান"] = "nic-ubg-pro", -- Proto-Ubangian
["প্রত্ন-উগ্রিক"] = "urj-ugr-pro", -- Proto-Ugric
["প্রত্ন-আপার ক্রস রিভার"] = "nic-ucr-pro", -- Proto-Upper Cross River
["প্রত্ন-ইউরালীয়"] = "urj-pro", -- Proto-Uralic
["প্রত্ন-উটিয়ান"] = "nai-utn-pro", -- Proto-Utian
["প্রত্ন-উটো-আজটেকান"] = "azc-pro", -- Proto-Uto-Aztecan
["প্রত্ন-ভিয়েটিক"] = "mkh-vie-pro", -- Proto-Vietic
["প্রত্ন-ভোল্টা-কঙ্গো"] = "nic-vco-pro", -- Proto-Volta-Congo
["প্রত্ন-ভোল্টা-নাইজার"] = "alv-von-pro", -- Proto-Volta-Niger
["প্রত্ন-পশ্চিম জার্মানিক"] = "gmw-pro", -- Proto-West Germanic
["প্রত্ন-পশ্চিম সেমিটিক"] = "sem-wes-pro", -- Proto-West Semitic
["প্রত্ন-পশ্চিমি খো-বওয়া"] = "sit-khw-pro", -- Proto-Western Kho-Bwa
["প্রত্ন-পশ্চিমি মান্দে"] = "dmn-mdw-pro", -- Proto-Western Mande
["প্রত্ন-উইটোটোয়ানো"] = "sai-wit-pro", -- Proto-Witotoan
["প্রত্ন-ইয়েনিসেইয়ান"] = "qfa-yen-pro", -- Proto-Yeniseian
["প্রত্ন-ইয়োরুবা"] = "alv-yor-pro", -- Proto-Yoruba
["প্রত্ন-ইয়োরুবয়েড"] = "alv-yrd-pro", -- Proto-Yoruboid
["প্রত্ন-য়ুকাগির"] = "qfa-yuk-pro", -- Proto-Yukaghir
["প্রত্ন-য়ুপিক"] = "ypk-pro", -- Proto-Yupik
["প্রত্ন-জাপোটেক"] = "omq-zpc-pro", -- Proto-Zapotec
["প্রত্ন-জাপোটেকান"] = "omq-zap-pro", -- Proto-Zapotecan
["প্রত্ন-জাজা-গোরানি"] = "ira-zgr-pro", -- Proto-Zaza-Gorani
["প্রভিডেন্সিয়া সাইন ল্যাঙ্গুয়েজ"] = "prz", -- Providencia Sign Language
["পসিকিয়ে"] = "kvj", -- Psikye
["পুয়ারে"] = "pux", -- Puare
["পুদটল আট্টা"] = "atp", -- Pudtol Atta
["পুইব্লা মাজাটেক"] = "pbm", -- Puebla Mazatec
["পুয়েলচে"] = "pue", -- Puelche
["পুয়ের্তো রিকান সাইন ল্যাঙ্গুয়েজ"] = "psl", -- Puerto Rican Sign Language
["পুইমেই নাগা"] = "npu", -- Puimei Naga
["পুইনাভ"] = "pui", -- Puinave
["পুইরন"] = "sit-prn", -- Puiron
["পুকাপুকান"] = "pkp", -- Pukapukan
["পুলাবু"] = "pup", -- Pulabu
["পুলুয়াট"] = "puw", -- Puluwat
["পুমা"] = "pum", -- Puma
["পুাম্পোকোল"] = "xpm", -- Pumpokol
["পুম"] = "yae", -- Pumé
["পুনান আপুত"] = "pud", -- Punan Aput
["পুনান বাহ-বিয়াউ"] = "pna", -- Punan Bah-Biau
["পুনান বাটু"] = "pnm", -- Punan Batu
["পুনান মেরাহ"] = "puf", -- Punan Merah
["পুনান মেরাপ"] = "puc", -- Punan Merap
["পুনান টুবু"] = "puj", -- Punan Tubu
["পুনি"] = "xpu", -- Punic
["পাঞ্জাবি"] = "pa", -- Punjabi
["পুনু"] = "puu", -- Punu
["পুয়োক"] = "puo", -- Puoc
["পুকুইনা"] = "puq", -- Puquina
["পুরাগি"] = "pru", -- Puragi
["পুরারী"] = "iar", -- Purari
["পুরেরেচা"] = "pua", -- Purepecha
["পুরি"] = "prr", -- Puri
["পুরিক"] = "prx", -- Purik
["পুরিসিমেনো"] = "puy", -- Purisimeño
["পুরোইক"] = "suv", -- Puroik
["পুরুবোরা"] = "pur", -- Puruborá
["পুরোহা"] = "sai-prh", -- Puruhá
["পুরুকোতো"] = "sai-pur", -- Purukotó
["পুরুম"] = "pub", -- Purum
["পুতাই"] = "mfl", -- Putai
["পুতোহ"] = "put", -- Putoh
["পুটুকওয়াম"] = "afe", -- Putukwam
["পক্সিয়ান মিন"] = "cpx", -- Puxian Min
["পুয়ো-পায়েকচে"] = "xpp", -- Puyo-Paekche
["পুইয়ুমা"] = "pyu", -- Puyuma
["পওয়াউমেই"] = "pme", -- Pwaamèi
["পওয়াপওয়া"] = "pop", -- Pwapwâ
["পিয়াপুন"] = "pcw", -- Pyapun
["পিয়ে ক্রুমেন"] = "pye", -- Pye Krumen
["পিয়েমমায়ার"] = "xpb", -- Pyemmairre
["পিয়েন"] = "pyy", -- Pyen
["পিকোজবে"] = "sai-pyk", -- Pykobjê
["পিয়ু (মিয়ানমার)"] = "pyx", -- Pyu (Myanmar)
["পিয়ু (নিউ গিনি)"] = "pby", -- Pyu (New Guinea)
["পায়েজ"] = "pbb", -- Páez
["পাআফ্যাং"] = "pfa", -- Pááfang
["প্যারি"] = "lkr", -- Päri
["পেমোনো"] = "pev", -- Pémono
["পেভে"] = "lme", -- Pévé
["পোকুট"] = "pko", -- Pökoot
["কি'আঞ্জোবাল"] = "kjb", -- Q'anjob'al
["কি'একচি'"] = "kek", -- Q'eqchi'
["কাবিরাও"] = "laq", -- Qabiao
["কাকিট"] = "byx", -- Qaqet
["কাতা্বানিয়ান"] = "xqt", -- Qatabanian
["কাউ"] = "gqu", -- Qau
["কিলা মুজি"] = "ymq", -- Qila Muji
["কিম্যান্ট"] = "ahg", -- Qimant
["কুয়াপাও"] = "qua", -- Quapaw
["কুইবেক সাইন ল্যাঙ্গুয়েজ"] = "fcs", -- Quebec Sign Language
["কেচুয়া"] = "qu", -- Quechua
["কুইনিয়া"] = "qya", -- Quenya
["কেরেতারো ওটোমি"] = "otq", -- Querétaro Otomi
["কেতসালতেপেক মিক্সে"] = "pxm", -- Quetzaltepec Mixe
["কুইয়ু"] = "qvy", -- Queyu
["কুইয়াভিকুজাস জাপোটেক"] = "zpj", -- Quiavicuzas Zapotec
["কুইলেউট"] = "qui", -- Quileute
["কুইম্বায়া"] = "sai-qmb", -- Quimbaya
["কুইনল্ট"] = "qun", -- Quinault
["কুইনিগুয়া"] = "nai-qng", -- Quinigua
["কুইনকুই"] = "quq", -- Quinqui
["কুইওকুইতানি-কুইয়েরি জাপোটেক"] = "ztq", -- Quioquitani-Quierí Zapotec
["কুইওটেপেক চিনান্টেক"] = "chq", -- Quiotepec Chinantec
["কুইরিপি"] = "qyp", -- Quiripi
["কুইতেমো"] = "sai-qtm", -- Quitemo
["রাভা"] = "rah", -- Rabha
["রাবোনা"] = "sai-rab", -- Rabona
["রাদে"] = "rad", -- Rade
["রাইটিক"] = "xrr", -- Raetic
["রাগা"] = "lml", -- Raga
["রাহাম্বু"] = "raz", -- Rahambuu
["রাজা কাবুন্সাওয়ান মানোবো"] = "mqk", -- Rajah Kabunsuwan Manobo
["রাজবংশী"] = "rjs", -- Rajbanshi
["রাজি"] = "rji", -- Raji
["রাজং"] = "rjg", -- Rajong
["রাজপুত গারাসিয়া"] = "gra", -- Rajput Garasia
["রাকাহাঙ্গা-মানিহিকি"] = "rkh", -- Rakahanga-Manihiki
["রাখাইন"] = "rki", -- Rakhine
["রাল্টে"] = "ral", -- Ralte
["রামা"] = "rma", -- Rama
["রামান্দি"] = "tks", -- Ramandi
["রামাস"] = "sai-ram", -- Ramanos
["রামোআইনা"] = "rai", -- Ramoaaina
["রামোপা"] = "kjx", -- Ramopa
["রাম্পি"] = "lje", -- Rampi
["রানা থারু"] = "thr", -- Rana Tharu
["রাং"] = "rax", -- Rang
["রাংকাস"] = "rgk", -- Rangkas
["রাংলং"] = "rnl", -- Ranglong
["রাও"] = "rao", -- Rao
["রাপা"] = "ray", -- Rapa
["রাপা নুই"] = "rap", -- Rapa Nui
["রাপোইসি"] = "kyx", -- Rapoisi
["রাপটিং"] = "rpt", -- Rapting
["রারা বাকাতী'"] = "lra", -- Rara Bakati'
["রারোটংগান"] = "rar", -- Rarotongan
["রাসাওয়া"] = "rac", -- Rasawa
["রাটানন"] = "btn", -- Ratagnon
["রাটাহান"] = "rth", -- Ratahan
["রাথাভি"] = "rtw", -- Rathawi
["রাথাভি বারেলি"] = "bgd", -- Rathwi Bareli
["রাউতে"] = "rau", -- Raute
["রাভুলা"] = "yea", -- Ravula
["রাওয়া"] = "rwo", -- Rawa
["রাওয়াং"] = "raw", -- Rawang
["রাওয়াত"] = "jnl", -- Rawat
["রাবো"] = "rwa", -- Rawo
["রায়োন জোক"] = "zor", -- Rayón Zoque
["রাজাজের্দি"] = "rat", -- Razajerdi
["রাজিহি"] = "rzh", -- Razihi
["রেয়াং"] = "ria", -- Reang
["রেড গেলাও"] = "gir", -- Red Gelao
["রিল"] = "atu", -- Reel
["রেজাং"] = "rej", -- Rejang
["রেজাং কায়ান"] = "ree", -- Rejang Kayan
["রিলি"] = "rei", -- Reli
["রেমা"] = "bow", -- Rema
["রেম্বারুঙ্গা"] = "rmb", -- Rembarunga
["রেম্বং"] = "reb", -- Rembong
["রেমো"] = "rem", -- Remo
["রেমন্ট্যাডো আগটা"] = "agv", -- Remontado Agta
["রেম্পি"] = "rmp", -- Rempi
["রেমুন"] = "lkj", -- Remun
["রেন্ডিল"] = "rel", -- Rendille
["রেঙ্গাও"] = "ren", -- Rengao
["রেন্নেলেস"] = "mnv", -- Rennellese
["রেপানбити"] = "rpn", -- Repanbitip
["রেয়ার বারে"] = "rer", -- Rer Bare
["রেয়াউ"] = "rea", -- Rerau
["রেয়ারপ"] = "pgk", -- Rerep
["রেসে"] = "res", -- Reshe
["রেসিগারো"] = "rgr", -- Resígaro
["রেট্টা"] = "ret", -- Retta
["রেয়াসানো"] = "rey", -- Reyesano
["রাইন ফ্রাঙ্কনিয়ান"] = "gmw-rfr", -- Rhine Franconian
["রিয়াং"] = "ril", -- Riang
["রিয়ান্টানা"] = "ran", -- Riantana
["রিবুন"] = "rir", -- Ribun
["রিগওয়ে"] = "iri", -- Rigwe
["রিকবাক্তসা"] = "rkb", -- Rikbaktsa
["রিঙ্কন জাপোটেক"] = "zar", -- Rincón Zapotec
["রিংগু"] = "rgu", -- Ringgou
["রিইরিও"] = "rri", -- Ririo
["রিটারুংগো"] = "rit", -- Ritarungo
["রিউং"] = "riu", -- Riung
["রিভারেইন সাঙ্গো"] = "snj", -- Riverain Sango
["রোগো"] = "rod", -- Rogo
["রোহিঙ্গা"] = "rhg", -- Rohingya
["রোমা"] = "rmm", -- Roma
["রোমাগনোল"] = "rgn", -- Romagnol
["রোমাম"] = "rmx", -- Romam
["রোমানি"] = "rom", -- Romani
["রোমানিয়ান"] = "ro", -- Romanian
["রোমানিয়ান সাইন ল্যাঙ্গুয়েজ"] = "rms", -- Romanian Sign Language
["রোমানো-গ্রিক"] = "rge", -- Romano-Greek
["রোমানো-সার্বিয়ান"] = "rsb", -- Romano-Serbian
["রোমানোভা"] = "rmv", -- Romanova
["রোমানস"] = "rm", -- Romansch
["রোমব্লোমানন"] = "rol", -- Romblomanon
["রোম্বো"] = "rof", -- Rombo
["রোমকুন"] = "rmk", -- Romkun
["রন"] = "cla", -- Ron
["রংগা"] = "rng", -- Ronga
["রংগা"] = "ror", -- Rongga
["রংমেই নাগা"] = "nbu", -- Rongmei Naga
["রংপো"] = "rnp", -- Rongpo
["রনজি"] = "roe", -- Ronji
["রুন"] = "rnn", -- Roon
["রোরিয়া"] = "rga", -- Roria
["রোরো"] = "rro", -- Roro
["রোটোকাস"] = "roo", -- Rotokas
["রুটুম্যান"] = "rtm", -- Rotuman
["রৌরাণ"] = "mis-rou", -- Rouran
["রোভিয়ানা"] = "rug", -- Roviana
["রুচিং পালাম"] = "pce", -- Ruching Palaung
["রুদবারি"] = "rdb", -- Rudbari
["রুফিজী"] = "rui", -- Rufiji
["রুগা"] = "ruh", -- Ruga
["রুকাই"] = "dru", -- Rukai
["রুকিগা"] = "cgg", -- Rukiga
["রুমা"] = "ruz", -- Ruma
["রুমাই পালাম"] = "rbb", -- Rumai Palaung
["রুমু"] = "klq", -- Rumu
["রুংগা"] = "rou", -- Runga
["রুংটু"] = "rtc", -- Rungtu
["রুংগুস"] = "drg", -- Rungus
["রুংওয়া"] = "rnw", -- Rungwa
["রুসেনরস্ক"] = "crp-rsn", -- Russenorsk
["রাশিয়ান"] = "ru", -- Russian
["রাশিয়ান সাইন ল্যাঙ্গুয়েজ"] = "rsl", -- Russian Sign Language
["রুতুল"] = "rut", -- Rutul
["রুলী"] = "ruc", -- Ruuli
["রুউনড"] = "rnd", -- Ruwund
["রুয়া"] = "rwk", -- Rwa
["রুয়ান্ডা-রুন্ডি"] = "rw", -- Rwanda-Rundi
["রেইউনিয়ন ক্রেওল ফরাসি"] = "rcf", -- Réunion Creole French
["স'গাউ কারেন"] = "ksw", -- S'gaw Karen
["সা"] = "sax", -- Sa
["সা'আ"] = "apb", -- Sa'a
["সা'বান"] = "snv", -- Sa'ban
["সা'ওচ"] = "scq", -- Sa'och
["সাআফি-সাআফি"] = "sav", -- Saafi-Saafi
["সাআম"] = "raq", -- Saam
["সাআমিয়া"] = "lsm", -- Saamia
["সানিক"] = "str", -- Saanich
["সাআর"] = "uss", -- Saare
["সাআরোয়া"] = "sxr", -- Saaroa
["সাবা"] = "saa", -- Saba
["সাবেয়ান"] = "xsa", -- Sabaean
["সাবাহ বিসায়া"] = "bsy", -- Sabah Bisaya
["সাবাহ মালয়"] = "msi", -- Sabah Malay
["সাবেনা"] = "sae", -- Sabanê
["সাবাোট"] = "spy", -- Sabaot
["সাবিন"] = "sbv", -- Sabine
["সাবির"] = "pml", -- Sabir
["সাবু"] = "hvn", -- Sabu
["সাবুএম"] = "sbo", -- Sabüm
["সাকাপুল্টেকো"] = "quv", -- Sacapulteco
["সাদ্রি"] = "sck", -- Sadri
["সায়েক"] = "skb", -- Saek
["সায়াপ"] = "spd", -- Saep
["সাফাইতিক"] = "sem-saf", -- Safaitic
["সাফালিবা"] = "saf", -- Safaliba
["সাফেয়োকা"] = "apz", -- Safeyoka
["সাফওয়া"] = "sbk", -- Safwa
["সাগালা"] = "sbm", -- Sagala
["সাগাল্লা"] = "tga", -- Sagalla
["সাহাপতিন"] = "nai-spt", -- Sahaptin
["সাহো"] = "ssy", -- Saho
["সাহু"] = "saj", -- Sahu
["সাইসিয়াত"] = "xsy", -- Saisiyat
["সাজাউ বাসাপ"] = "sjb", -- Sajau Basap
["সাক্যাচেপ"] = "sch", -- Sakachep
["সাকাম"] = "skm", -- Sakam
["সাকাও"] = "sku", -- Sakao
["সাকাটা"] = "skt", -- Sakata
["সাকে"] = "sak", -- Sake
["সাকিজায়া"] = "szy", -- Sakizaya
["সালা"] = "shq", -- Sala
["সালাম্পাসু"] = "slx", -- Salampasu
["সালার"] = "slr", -- Salar
["সালাস"] = "sgu", -- Salas
["সালচুক"] = "slq", -- Salchuq
["সালেমান"] = "sau", -- Saleman
["সালিবা (কলম্বিয়া)"] = "slc", -- Saliba (Colombia)
["সালিবা (নিউ গিনি)"] = "sbe", -- Saliba (New Guinea)
["সালিনান"] = "sln", -- Salinan
["সল্ট-ইয়ুই"] = "sll", -- Salt-Yui
["সালুয়ান"] = "loe", -- Saluan
["সালুমা"] = "slj", -- Salumá
["সালভাদোরান লেনকা"] = "nai-sln", -- Salvadoran Lenca
["সালভাদোরান সাইন ল্যাঙ্গুয়েজ"] = "esn", -- Salvadoran Sign Language
["সাম"] = "snx", -- Sam
["সামা"] = "smd", -- Sama
["সামারিটান আরামাইক"] = "sam", -- Samaritan Aramaic
["সামারিটান হিব্রু"] = "smp", -- Samaritan Hebrew
["সামারোকেনা"] = "tmj", -- Samarokena
["সামাতাও"] = "ysd", -- Samatao
["সাম্বা"] = "smx", -- Samba
["সাম্বালী"] = "xsb", -- Sambali
["সাম্বালপুরী"] = "spv", -- Sambalpuri
["সাম্বে"] = "xab", -- Sambe
["সাম্বেরিগি"] = "ssx", -- Samberigi
["সাম্বুরু"] = "saq", -- Samburu
["সামেই"] = "smh", -- Samei
["সামো"] = "smq", -- Samo
["সামোয়ান"] = "sm", -- Samoan
["সামোয়ান প্ল্যান্টেশন পিজিন"] = "crp-spp", -- Samoan Plantation Pidgin
["সামোগিশিয়ান"] = "sgs", -- Samogitian
["সামোসা"] = "swm", -- Samosa
["সাম্পাং"] = "rav", -- Sampang
["সামরে"] = "sxm", -- Samre
["সামটাও"] = "stu", -- Samtao
["সামভেদি"] = "smv", -- Samvedi
["সান আগাস্টিন মিক্সটেপেক জাপোটেক"] = "ztm", -- San Agustín Mixtepec Zapotec
["সান বাল্টাজার লক্সিকা জাপোটেক"] = "zpx", -- San Baltazar Loxicha Zapotec
["সান ফেলিপ ওটলাল্টেপেক পোপোলোকা"] = "pow", -- San Felipe Otlaltepec Popoloca
["সান জেরোনিমো টেকোআটল মাজাটেক"] = "maa", -- San Jerónimo Tecóatl Mazatec
["সান জুয়ান আটজিংগো পোপোলোকা"] = "poe", -- San Juan Atzingo Popoloca
["সান জুয়ান কলোরাডো মিক্সটেক"] = "mjc", -- San Juan Colorado Mixtec
["সান জুয়ান গুয়েলাভিয়া জাপোটেক"] = "zab", -- San Juan Guelavía Zapotec
["সান জুয়ান কিয়াহিজ চ্যাটিনো"] = "omq-sjq", -- San Juan Quiahije Chatino
["সান জুয়ান টেইটা মিক্সটেক"] = "xtj", -- San Juan Teita Mixtec
["সান লুইস তেমাল্যাকায়ুকা পোপোলোকা"] = "pps", -- San Luís Temalacayuca Popoloca
["সান মার্কোস ত্লালকোয়ালকো পোপোলোকা"] = "pls", -- San Marcos Tlalcoyalco Popoloca
["সান মার্টিন ইটুনয়োসো ত্রিকি"] = "trq", -- San Martín Itunyoso Triqui
["সান মিগুয়েল ক্রেওল ফরাসি"] = "scf", -- San Miguel Creole French
["সান মিগুয়েল পিয়েদ্রাস মিক্সটেক"] = "xtp", -- San Miguel Piedras Mixtec
["সান মিগুয়েল এল গ্র্যান্ডে মিক্সটেক"] = "mig", -- San Miguel el Grande Mixtec
["সান পাবলো গুয়িলা জাপোটেক"] = "ztu", -- San Pablo Güilá Zapotec
["সান পেড্রো আমুজগোস আমুজগো"] = "azg", -- San Pedro Amuzgos Amuzgo
["সান পেড্রো কুইয়াতোনি জাপোটেক"] = "zpf", -- San Pedro Quiatoni Zapotec
["সান ভিসেন্তে কোয়াটলান জাপোটেক"] = "zpt", -- San Vicente Coatlán Zapotec
["সানাাপানা"] = "spn", -- Sanapaná
["সানাভিরন"] = "sai-san", -- Sanaviron
["সান্ডাভে"] = "sad", -- Sandawe
["সাঙ্গা (কঙ্গো)"] = "sng", -- Sanga (Congo)
["সাঙ্গা (নাইজেরিয়া)"] = "xsn", -- Sanga (Nigeria)
["সাংগাউ"] = "scg", -- Sanggau
["সাংগিল"] = "snl", -- Sangil
["সাংগির"] = "sxn", -- Sangir
["সাংগিসারী"] = "sgr", -- Sangisari
["সাংগকং"] = "sgk", -- Sangkong
["সাংলেচি"] = "sgy", -- Sanglechi
["সাংগো"] = "sg", -- Sango
["সাংগটাম নাগা"] = "nsa", -- Sangtam Naga
["সাংগু (গাবন)"] = "snq", -- Sangu (Gabon)
["সাংগু (তানজানিয়া)"] = "sbp", -- Sangu (Tanzania)
["সানি"] = "ysn", -- Sani
["সানিই"] = "ysy", -- Sanie
["সানিয়ো-হিয়োয়ে"] = "sny", -- Saniyo-Hiyewe
["সান্কারান মানিঙ্কা"] = "msc", -- Sankaran Maninka
["সানসি"] = "ssi", -- Sansi
["সংস্কৃত"] = "sa", -- Sanskrit
["সান্তা ক্যাটরিনা আলবার্রাদাস জাপোটেক"] = "ztn", -- Santa Catarina Albarradas Zapotec
["সান্তা ইনেস আহুয়াটেম্পান পোপোলোকা"] = "pca", -- Santa Inés Ahuatempan Popoloca
["সান্তা ইনেস ইয়াতজেচি জাপোটেক"] = "zpn", -- Santa Inés Yatzechi Zapotec
["সান্তা লুসিয়া মন্টেভার্দে মিক্সটেক"] = "mdv", -- Santa Lucía Monteverde Mixtec
["সান্তা মারিয়া লা আল্টা নাহুয়াতল"] = "nhz", -- Santa María La Alta Nahuatl
["সান্তা মারিয়া কুইয়েগোলানি জাপোটেক"] = "zpi", -- Santa María Quiegolani Zapotec
["সান্তা মারিয়া জাকাটেপেক মিক্সটেক"] = "mza", -- Santa María Zacatepec Mixtec
["সান্তা তেরেসা কোরা"] = "cok", -- Santa Teresa Cora
["সান্তালি"] = "sat", -- Santali
["সান্তিয়াগো জানিকা জাপোটেক"] = "zpr", -- Santiago Xanica Zapotec
["সান্তো ডোমিংগো আলবার্রাদাস জাপোটেক"] = "zas", -- Santo Domingo Albarradas Zapotec
["সানুম"] = "xsu", -- Sanumá
["সানসিয়াং মিন"] = "nan-zsh", -- Sanxiang Min
["সাপা"] = "tys", -- Sapa
["সাপারুয়া"] = "spr", -- Saparua
["সাপারা"] = "sai-sap", -- Sapará
["সাপো"] = "krn", -- Sapo
["সাপোনি"] = "spi", -- Saponi
["সাপোসা"] = "sps", -- Saposa
["সাপুয়ান"] = "spu", -- Sapuan
["সাপে"] = "spc", -- Sapé
["সার"] = "mwm", -- Sar
["সারা"] = "sre", -- Sara
["সারা কাবা"] = "sbz", -- Sara Kaba
["সারা কাবা ডেমে"] = "kwg", -- Sara Kaba Deme
["সারা কাবা নাআ"] = "kwv", -- Sara Kaba Náà
["সারাইকি"] = "skr", -- Saraiki
["সারামাক্কান"] = "srm", -- Saramaccan
["সারানগানি ব্লাআন"] = "bps", -- Sarangani Blaan
["সারানগানি মানোবো"] = "mbs", -- Sarangani Manobo
["সারাসিরা"] = "zsa", -- Sarasira
["সারাভেকা"] = "sar", -- Saraveca
["সারাওয়াক মালয়"] = "poz-sml", -- Sarawak Malay
["সার্ডিনিয়ান"] = "sc", -- Sardinian
["সারিকোলি"] = "srh", -- Sarikoli
["সার্লি"] = "sdf", -- Sarli
["সার্টাং"] = "onp", -- Sartang
["সারুয়া"] = "swy", -- Sarua
["সারুডু"] = "sdu", -- Sarudu
["সারুগা"] = "sra", -- Saruga
["সাসাক"] = "sas", -- Sasak
["সাসারু"] = "sxs", -- Sasaru
["সাসারেস"] = "sdc", -- Sassarese
["সাটাওয়ালেস"] = "stw", -- Satawalese
["সাটারল্যান্ড ফ্রিজিয়ান"] = "stq", -- Saterland Frisian
["সাটেরে-মাওয়ে"] = "mav", -- Sateré-Mawé
["সাথমর সোয়াবিয়ান"] = "gmw-stm", -- Sathmar Swabian
["সৌদি আরবীয় সাইন ল্যাঙ্গুয়েজ"] = "sdl", -- Saudi Arabian Sign Language
["সওরাষ্ট্র"] = "saz", -- Saurashtra
["সউরি"] = "srt", -- Sauri
["সাউস"] = "sao", -- Sause
["সাউসি"] = "ssj", -- Sausi
["সাভি"] = "sdg", -- Savi
["সাভোসাবো"] = "svs", -- Savosavo
["সাওয়াই"] = "szw", -- Sawai
["সাউয়েরু"] = "swr", -- Saweru
["সাভি"] = "saw", -- Sawi
["সাবিলা"] = "swt", -- Sawila
["সউরিয়া পাহাড়িয়া"] = "mjt", -- Sawriya Paharia
["সাক্সওয়ে গ্বে"] = "sxw", -- Saxwe Gbe
["সায়া"] = "say", -- Saya
["সায়ুলা পোপোলুকা"] = "pos", -- Sayula Popoluca
["স্কানিয়ান"] = "gmq-scy", -- Scanian
["স্কটস"] = "sco", -- Scots
["স্কটিশ গ্যালিক"] = "gd", -- Scottish Gaelic
["সেবা"] = "kdg", -- Seba
["সেবাত বেট গুরেজ"] = "sgw", -- Sebat Bet Gurage
["সেবেরুয়াং"] = "sbx", -- Seberuang
["সেবপ"] = "sib", -- Sebop
["সেবুয়ু"] = "snb", -- Sebuyau
["সেচেল্ট"] = "sec", -- Sechelt
["সেচুরা"] = "sai-sec", -- Sechura
["সেকোয়া"] = "sey", -- Secoya
["সেডাং"] = "sed", -- Sedang
["সেডোয়া"] = "tvw", -- Sedoa
["সীনকু"] = "sos", -- Seenku
["সেগাই"] = "sge", -- Segai
["সেগেজু"] = "seg", -- Segeju
["সেগেট"] = "sbg", -- Seget
["সেহউই"] = "sfw", -- Sehwi
["সেইম"] = "sim", -- Seim
["সেইমাত"] = "ssg", -- Seimat
["সেইট-কাইটেটু"] = "hik", -- Seit-Kaitetu
["সেকানি"] = "sek", -- Sekani
["সেকাপান"] = "skp", -- Sekapan
["সেকার"] = "skz", -- Sekar
["সেকে"] = "skj", -- Seke
["সেকেলে"] = "vaj", -- Sekele
["সেকি"] = "syi", -- Seki
["সেকো পাডাং"] = "skx", -- Seko Padang
["সেকো টেঙ্গাহ"] = "sko", -- Seko Tengah
["সেকপেলে"] = "lip", -- Sekpele
["সেলাংগর সাইন ল্যাঙ্গুয়েজ"] = "kgi", -- Selangor Sign Language
["সেলুরু"] = "slu", -- Selaru
["সেলায়ার"] = "sly", -- Selayar
["সিলি"] = "snw", -- Selee
["সিলিফেট"] = "spl", -- Selepet
["সেল্ক'নাম"] = "ona", -- Selk'nam
["সেলোনিয়ান"] = "sxl", -- Selonian
["সেলুংগাই মুরুট"] = "slg", -- Selungai Murut
["সেলুয়াসান"] = "sws", -- Seluwasan
["সেমা"] = "nsm", -- Sema
["সেমেই"] = "sea", -- Semai
["সেমান্ডাং"] = "sdm", -- Semandang
["সেমাক বেরি"] = "szc", -- Semaq Beri
["সেম্বাকুং মুরুট"] = "sbr", -- Sembakung Murut
["সেমেলাই"] = "sza", -- Semelai
["সেমিগাল্লিয়ান"] = "xzm", -- Semigallian
["সেমিমি"] = "etz", -- Semimi
["সেমনাম"] = "ssm", -- Semnam
["সেম্নানি"] = "smy", -- Semnani
["সেম্পান"] = "xse", -- Sempan
["সেনা"] = "seh", -- Sena
["সেনারা সেনোউফো"] = "seq", -- Senara Sénoufo
["সেনায়া"] = "syn", -- Senaya
["সেনে"] = "sej", -- Sene
["সেনেকা"] = "see", -- Seneca
["সেনগেলে"] = "szg", -- Sengele
["সেংগি"] = "snu", -- Senggi
["সেংগো"] = "spk", -- Sengo
["সেংসেন্ং"] = "ssz", -- Sengseng
["সেনহাজা দে সেরাইর"] = "sjs", -- Senhaja De Srair
["সেন্সি"] = "sni", -- Sensi
["সেনতানি"] = "set", -- Sentani
["সেন্থাং চিন"] = "sez", -- Senthang Chin
["সেনটিনেলিস"] = "std", -- Sentinelese
["সেপা (ইন্দোনেশিয়া)"] = "spb", -- Sepa (Indonesia)
["সেপা (নিউ গিনি)"] = "spe", -- Sepa (New Guinea)
["সেপেন"] = "spm", -- Sepen
["সেপিক ইওয়াম"] = "iws", -- Sepik Iwam
["সেপিক মারি"] = "mbx", -- Sepik Mari
["সেরা"] = "sry", -- Sera
["সার্বো-ক্রোয়েশিয়ান"] = "sh", -- Serbo-Croatian
["সেরে"] = "swf", -- Sere
["সারের"] = "srr", -- Serer
["সেরি"] = "sei", -- Seri
["সেরিলি"] = "sve", -- Serili
["সেরোয়া"] = "kqu", -- Seroa
["সেরানো"] = "ser", -- Serrano
["সেরু"] = "szd", -- Seru
["সেরুয়া"] = "srw", -- Serua
["সেরুডুং মুরুট"] = "srk", -- Serudung Murut
["সেরুই-লাউত"] = "seu", -- Serui-Laut
["সেটা"] = "stf", -- Seta
["সেতামান"] = "stm", -- Setaman
["সেতি"] = "sbi", -- Seti
["সেভার্ন ওজিবওয়া"] = "ojs", -- Severn Ojibwa
["সেওয়া বে"] = "sew", -- Sewa Bay
["সেচেলোইজ ক্রেওল"] = "crs", -- Seychellois Creole
["সেজে"] = "sze", -- Seze
["শা"] = "scw", -- Sha
["শাবাক"] = "sdb", -- Shabak
["শাবো"] = "sbf", -- Shabo
["শাহমিরজাদি"] = "srz", -- Shahmirzadi
["শাহরুদি"] = "shm", -- Shahrudi
["শাল-জওয়াল"] = "sha", -- Shall-Zwall
["শামা-সামবুগা"] = "sqa", -- Shama-Sambuga
["শামাং"] = "xsh", -- Shamang
["শাম্বালা"] = "ksb", -- Shambala
["শান"] = "shn", -- Shan
["শানেনাওয়া"] = "swo", -- Shanenawa
["শাংগা"] = "sho", -- Shanga
["শাংঝাই"] = "jih", -- Shangzhai
["শাওজিয়াং মিন"] = "sjc", -- Shaojiang Min
["শাওঝউ তুহুয়া"] = "zhx-sht", -- Shaozhou Tuhua
["শারানাহুয়া"] = "mcd", -- Sharanahua
["শার্ক বে"] = "ssv", -- Shark Bay
["শারওয়া"] = "swq", -- Sharwa
["শাস্তা"] = "sht", -- Shasta
["শাট"] = "shj", -- Shatt
["শাউ"] = "sqh", -- Shau
["শাওনি"] = "sjw", -- Shawnee
["শে"] = "shx", -- She
["শেবায়ো"] = "awd-she", -- Shebayo
["শেহরি"] = "shv", -- Shehri
["শেখাচো"] = "moy", -- Shekkacho
["শেকো"] = "she", -- Sheko
["শেল্টা"] = "sth", -- Shelta
["শেন্ডু"] = "shl", -- Shendu
["শেনি"] = "scv", -- Sheni
["শেরব্রো"] = "bun", -- Sherbro
["শেরডুকপেন"] = "sdp", -- Sherdukpen
["শেরপা"] = "xsr", -- Sherpa
["শেশি খাম"] = "kip", -- Sheshi Kham
["শি"] = "shr", -- Shi
["শিহহি আরবি"] = "ssh", -- Shihhi Arabic
["শিকি"] = "gua", -- Shiki
["শিলুক"] = "shk", -- Shilluk
["শিনা"] = "scl", -- Shina
["শিনাশা"] = "bwo", -- Shinasha
["শিপিবো-কোনিবো"] = "shp", -- Shipibo-Conibo
["শিক্সিং"] = "sxg", -- Shixing
["শোলগা"] = "sle", -- Sholaga
["শম পেং"] = "sii", -- Shom Peng
["শোনা"] = "sn", -- Shona
["শু-মিন্ডা-নি"] = "bcv", -- Shoo-Minda-Nye
["শোর"] = "cjs", -- Shor
["শোশোন"] = "shh", -- Shoshone
["শুয়া"] = "shg", -- Shua
["শুয়ার"] = "jiv", -- Shuar
["শুগনি"] = "sgh", -- Shughni
["শুমাস্টি"] = "sts", -- Shumashti
["শুমচো"] = "scu", -- Shumcho
["শুসওয়া"] = "shs", -- Shuswap
["শুয়া-জামানি"] = "ksa", -- Shuwa-Zamani
["শওয়াই"] = "shw", -- Shwai
["শওয়ে পালাউং"] = "pll", -- Shwe Palaung
["সিয়ালুম"] = "slw", -- Sialum
["সিয়ামু"] = "sif", -- Siamou
["সিয়ান"] = "spg", -- Sian
["সিয়ানে"] = "snp", -- Siane
["সিয়াং"] = "sya", -- Siang
["সিয়ার-লাক"] = "sjr", -- Siar-Lak
["সিবে"] = "nco", -- Sibe
["সাইবেরিয়ান তাতার"] = "sty", -- Siberian Tatar
["সিবিউ মেলানাও"] = "sdx", -- Sibu Melanau
["সিকানিয়ান"] = "sxc", -- Sicanian
["সিকেল"] = "scx", -- Sicel
["সিচুয়ানেস"] = "zhx-sic", -- Sichuanese
["সিসিলিয়ান"] = "scn", -- Sicilian
["সিকুলো-আরবি"] = "sqr", -- Siculo-Arabic
["সিডামো"] = "sid", -- Sidamo
["সিডেটিক"] = "xsd", -- Sidetic
["সিই"] = "erg", -- Sie
["সিয়েরা লিওন সাইন ল্যাঙ্গুয়েজ"] = "sgx", -- Sierra Leone Sign Language
["সিয়েরা নেগ্রা নাহুয়াতল"] = "nsu", -- Sierra Negra Nahuatl
["সিয়েরা দে জুয়ারেজ জাপোটেক"] = "zaa", -- Sierra de Juárez Zapotec
["সিঘু"] = "sxe", -- Sighu
["সিহান"] = "snr", -- Sihan
["সিকা"] = "ski", -- Sika
["সিকাইয়ানা"] = "sky", -- Sikaiana
["সিকারিটাই"] = "tty", -- Sikaritai
["সিকিয়ানা"] = "sik", -- Sikiana
["সিক্কিমী"] = "sip", -- Sikkimese
["সিকুলে"] = "skh", -- Sikule
["সিলা"] = "slt", -- Sila
["সিল্যাকায়োআপান মিক্সটেক"] = "mks", -- Silacayoapan Mixtec
["সিলিবি"] = "sbq", -- Sileibi
["সিলেসিয়ান"] = "szl", -- Silesian
["সিলিমো"] = "wul", -- Silimo
["সিলিপুট"] = "mkc", -- Siliput
["সিলোপি"] = "xsp", -- Silopi
["সিলটি'ই"] = "stv", -- Silt'e
["সিমাআ"] = "sie", -- Simaa
["সিমালুংগুন বাটাক"] = "bts", -- Simalungun Batak
["সিম্বা"] = "sbw", -- Simba
["সিম্বালী"] = "smg", -- Simbali
["সিম্বারী"] = "smb", -- Simbari
["সিম্বো"] = "sbb", -- Simbo
["সিমেকু"] = "smz", -- Simeku
["সিমেউলুয়ে"] = "smr", -- Simeulue
["সিম্টে"] = "smt", -- Simte
["সিনাকান্তান"] = "nai-sin", -- Sinacantán
["সিনাগেন"] = "siu", -- Sinagen
["সিনাসিনা"] = "sst", -- Sinasina
["সিনাগোরো"] = "snc", -- Sinaugoro
["সিন্ডারিন"] = "sjn", -- Sindarin
["সিন্ধি"] = "sd", -- Sindhi
["সিন্ধি ভিল"] = "sbn", -- Sindhi Bhil
["সিন্ধিহুই মিক্সটেক"] = "xts", -- Sindihui Mixtec
["সিঙ্গা"] = "sgm", -- Singa
["সিঙ্গাপুর সাইন ল্যাঙ্গুয়েজ"] = "sls", -- Singapore Sign Language
["সিংফো"] = "sgp", -- Singpho
["সিংহলী"] = "si", -- Sinhalese
["সিনিচাহুয়া মিক্সটেক"] = "xti", -- Sinicahua Mixtec
["সিনিন্কেরে"] = "skq", -- Sininkere
["সিন্টে রোমানি"] = "rmo", -- Sinte Romani
["সিনিয়ার"] = "sys", -- Sinyar
["সিনুফানা"] = "sai-sin", -- Sinúfana
["সিয়ো"] = "xsi", -- Sio
["সিওনা"] = "snn", -- Siona
["সিপাকাপেনসে"] = "qum", -- Sipakapense
["সিরা"] = "swj", -- Sira
["সিরায়"] = "fos", -- Siraya
["সিরেনিক"] = "ysr", -- Sirenik
["সিরি"] = "sir", -- Siri
["সিরিয়ানো"] = "sri", -- Siriano
["সিরিওনো"] = "srq", -- Sirionó
["সিরমাউরি"] = "srx", -- Sirmauri
["সিরোই"] = "ssd", -- Siroi
["সুইসসালা"] = "sld", -- Sissala
["সিইসানো"] = "sso", -- Sissano
["সিটু"] = "sit-sit", -- Situ
["সিয়াস্ল্যাও"] = "sis", -- Siuslaw
["সিভান্দি"] = "siy", -- Sivandi
["সিওয়াই"] = "siw", -- Siwai
["সিভি"] = "siz", -- Siwi
["সিউউ"] = "akp", -- Siwu
["সিয়িন চিন"] = "csy", -- Siyin Chin
["স্কাজিট"] = "ska", -- Skagit
["স্কালভিয়ান"] = "svx", -- Skalvian
["স্কে"] = "ske", -- Ske
["স্কেপি ক্রেওল ডাচ"] = "skw", -- Skepi Creole Dutch
["স্কোল্ট সামি"] = "sms", -- Skolt Sami
["স্কোউ"] = "skv", -- Skou
["স্লাভোমলিসানো"] = "svm", -- Slavomolisano
["স্লোভাক"] = "sk", -- Slovak
["স্লোভাকিয়ান সাইন ল্যাঙ্গুয়েজ"] = "svk", -- Slovakian Sign Language
["স্লোভেন"] = "sl", -- Slovene
["স্লোভিনসিয়ান"] = "zlw-slv", -- Slovincian
["স্মল ফ্লাওয়ারি মিয়াও"] = "sfm", -- Small Flowery Miao
["স্মার্কি কানুম"] = "kxq", -- Smärky Kanum
["স্নোহোমিশ"] = "sno", -- Snohomish
["সো'আ"] = "ssq", -- So'a
["সোবেই"] = "sob", -- Sobei
["সোচিয়াপাম চিনান্টেক"] = "cso", -- Sochiapam Chinantec
["সোগা"] = "xog", -- Soga
["সোগডিয়ান"] = "sog", -- Sogdian
["সোক"] = "skk", -- Sok
["সোকনা"] = "swn", -- Sokna
["সোকো"] = "soc", -- Soko
["সোকোরো"] = "sok", -- Sokoro
["সোলানো"] = "xso", -- Solano
["সোলি"] = "sby", -- Soli
["সোলোম্বালা ইংলিশ"] = "crp-slb", -- Solombala English
["সোলন"] = "tuw-sol", -- Solon
["সোলোং"] = "aaw", -- Solong
["সোলোস"] = "sol", -- Solos
["সোম"] = "smc", -- Som
["সোমালি"] = "so", -- Somali
["সোম্বা-সিয়াওয়ারি"] = "bmu", -- Somba-Siawari
["সোমরা"] = "ntx", -- Somra
["সোমরাই"] = "sor", -- Somrai
["সোমরায়"] = "smu", -- Somray
["সোমিয়েভ"] = "kgt", -- Somyev
["সোনাগা"] = "ysg", -- Sonaga
["সন্ডে"] = "shc", -- Sonde
["সোঙ্গে"] = "sop", -- Songe
["সংলাই চিন"] = "csj", -- Songlai Chin
["সোনগোমেনো"] = "soe", -- Songomeno
["সোনগুরো"] = "sod", -- Songoora
["সনহা"] = "soi", -- Sonha
["সোনিয়া"] = "siq", -- Sonia
["সোনিনকে"] = "snk", -- Soninke
["সনসোরোলেস"] = "sov", -- Sonsorolese
["সু"] = "teu", -- Soo
["সোপ"] = "urw", -- Sop
["সোকোট্রি"] = "sqt", -- Soqotri
["সরা"] = "srb", -- Sora
["সোরি-হারেনগান"] = "sbh", -- Sori-Harengan
["সোরখেই"] = "sqo", -- Sorkhei
["সোরোথ্যাপ্টিক"] = "sxo", -- Sorothaptic
["সরসোগন আইটা"] = "ays", -- Sorsogon Ayta
["সোস কুন্ডি"] = "sdk", -- Sos Kundi
["সোটা কানুম"] = "krz", -- Sota Kanum
["সোথো"] = "st", -- Sotho
["সু"] = "sqq", -- Sou
["দক্ষিণ আফ্রিকান সাইন ল্যাঙ্গুয়েজ"] = "sfs", -- South African Sign Language
["দক্ষিণ আয়ু"] = "aws", -- South Awyu
["দক্ষিণ বোমা"] = "bnt-sbo", -- South Boma
["দক্ষিণ সেন্ট্রাল বান্ডা"] = "lnl", -- South Central Banda
["দক্ষিণ সেন্ট্রাল দিনকা"] = "dib", -- South Central Dinka
["দক্ষিণ ইফাতে"] = "erk", -- South Efate
["দক্ষিণ ফালি"] = "fal", -- South Fali
["দক্ষিণ জিজীগা"] = "giz", -- South Giziga
["দক্ষিণ লেম্বাতা"] = "lmf", -- South Lembata
["দক্ষিণ লেভান্টাইন আরবি"] = "ajp", -- South Levantine Arabic
["দক্ষিণ মার্কেসান"] = "mqm", -- South Marquesan
["দক্ষিণ মুয়ু"] = "kts", -- South Muyu
["দক্ষিণ নুয়ালু"] = "nxl", -- South Nuaulu
["দক্ষিণ পিসিন"] = "spx", -- South Picene
["দক্ষিণ স্লেভি"] = "xsl", -- South Slavey
["দক্ষিণ টাইরোরা"] = "omw", -- South Tairora
["দক্ষিণ উকায়ালি আশেনিনকা"] = "cpy", -- South Ucayali Ashéninka
["দক্ষিণ ওয়াতুত"] = "mcy", -- South Watut
["দক্ষিণপূর্ব অ্যামব্রিম"] = "tvk", -- Southeast Ambrym
["দক্ষিণপূর্ব বাবার"] = "vbb", -- Southeast Babar
["দক্ষিণপূর্ব ইজো"] = "ijs", -- Southeast Ijo
["দক্ষিণপূর্ব পাশায়ি"] = "psi", -- Southeast Pashayi
["দক্ষিণপূর্ব তাসমানিয়ান"] = "xpf", -- Southeast Tasmanian
["দক্ষিণপূর্বী দিনকা"] = "dks", -- Southeastern Dinka
["দক্ষিণপূর্বী ইক্সটলান জাপোটেক"] = "zpd", -- Southeastern Ixtlán Zapotec
["দক্ষিণপূর্বী কোলামি"] = "nit", -- Southeastern Kolami
["দক্ষিণপূর্বী নোচিক্সটলান মিক্সটেক"] = "mxy", -- Southeastern Nochixtlán Mixtec
["দক্ষিণপূর্বী পোমো"] = "pom", -- Southeastern Pomo
["দক্ষিণপূর্বী পুইব্লা নাহুয়াতল"] = "npl", -- Southeastern Puebla Nahuatl
["দক্ষিণপূর্বী তারাহুমারা"] = "tcu", -- Southeastern Tarahumara
["দক্ষিণপূর্বী তেপেহুয়ান"] = "stp", -- Southeastern Tepehuan
["দক্ষিণি আল্টা"] = "agy", -- Southern Alta
["দক্ষিণি আলতাই"] = "alt", -- Southern Altai
["দক্ষিণি আমামি ওশিমা"] = "ams", -- Southern Amami Ōshima
["দক্ষিণি বাই"] = "bfs", -- Southern Bai
["দক্ষিণি বিরিফর"] = "biv", -- Southern Birifor
["দক্ষিণি বোবো"] = "bwq", -- Southern Bobo
["দক্ষিণি বনটক"] = "obk", -- Southern Bontoc
["দক্ষিণি ক্যারিয়ার"] = "caf", -- Southern Carrier
["দক্ষিণি কাটাওয়ান্ডুয়ানিস বিকোলানো"] = "bln", -- Southern Catanduanes Bicolano
["দক্ষিণি দাগারি"] = "dga", -- Southern Dagaare
["দক্ষিণি পূর্ব ক্রি"] = "crj", -- Southern East Cree
["দক্ষিণি গালে"] = "ghe", -- Southern Ghale
["দক্ষিণি গ্রেবো"] = "grj", -- Southern Grebo
["দক্ষিণি গুইইয়াং হ্মং"] = "hmy", -- Southern Guiyang Hmong
["দক্ষিণি হাইডা"] = "hax", -- Southern Haida
["দক্ষিণি হিন্দকো"] = "hnd", -- Southern Hindko
["দক্ষিণি কালাপুয়া"] = "sxk", -- Southern Kalapuya
["দক্ষিণি কালিঙ্গা"] = "ksc", -- Southern Kalinga
["দক্ষিণি কাম"] = "kmc", -- Southern Kam
["দক্ষিণি খান্টি"] = "kca-sou", -- Southern Khanty
["দক্ষিণি কিসি"] = "kss", -- Southern Kissi
["দক্ষিণি কিওয়াই"] = "kjd", -- Southern Kiwai
["দক্ষিণি কুর্দিশ"] = "sdh", -- Southern Kurdish
["দক্ষিণি লোলোপো"] = "ysp", -- Southern Lolopo
["দক্ষিণি লোরুং"] = "lrr", -- Southern Lorung
["দক্ষিণি লুরি"] = "luz", -- Southern Luri
["দক্ষিণি মা'দি"] = "snm", -- Southern Ma'di
["দক্ষিণি মান্সি"] = "mns-sou", -- Southern Mansi
["দক্ষিণি মাশান হ্মং"] = "hma", -- Southern Mashan Hmong
["দক্ষিণি মনং"] = "mnn", -- Southern Mnong
["দক্ষিণি মুজি"] = "ymc", -- Southern Muji
["দক্ষিণি এনডেবেলে"] = "nr", -- Southern Ndebele
["দক্ষিণি এনগবান্দি"] = "nbw", -- Southern Ngbandi
["দক্ষিণি নিকোবারেসে"] = "nik", -- Southern Nicobarese
["দক্ষিণি নিসু"] = "nsd", -- Southern Nisu
["দক্ষিণি নুনি"] = "nnw", -- Southern Nuni
["দক্ষিণি ওহলোন"] = "css", -- Southern Ohlone
["দক্ষিণি ওয়ান"] = "osu", -- Southern One
["দক্ষিণি পামে"] = "pmz", -- Southern Pame
["দক্ষিণি পিংহুয়া"] = "csp", -- Southern Pinghua
["দক্ষিণি পোমো"] = "peq", -- Southern Pomo
["দক্ষিণি পুইব্লা মিক্সটেক"] = "mit", -- Southern Puebla Mixtec
["দক্ষিণি পুগেট সাউন্ড সালিশ"] = "slh", -- Southern Puget Sound Salish
["দক্ষিণি পুমি"] = "pmj", -- Southern Pumi
["দক্ষিণি কিয়াংডং মিয়াও"] = "hms", -- Southern Qiandong Miao
["দক্ষিণি কিয়াং"] = "qxs", -- Southern Qiang
["দক্ষিণি রেন্গমা নাগা"] = "nre", -- Southern Rengma Naga
["দক্ষিণি রিঙ্কন জাপোটেক"] = "zsr", -- Southern Rincon Zapotec
["দক্ষিণি রোগলাই"] = "rgs", -- Southern Roglai
["দক্ষিণি সামা"] = "ssb", -- Southern Sama
["দক্ষিণি সামি"] = "sma", -- Southern Sami
["দক্ষিণি সামো"] = "sbd", -- Southern Samo
["দক্ষিণি সেলকাপ"] = "sel-sou", -- Southern Selkup
["দক্ষিণি সিয়েরা মিওক"] = "skd", -- Southern Sierra Miwok
["দক্ষিণি থাই"] = "sou", -- Southern Thai
["দক্ষিণি টিডুং"] = "itd", -- Southern Tidung
["দক্ষিণি টিওয়া"] = "tix", -- Southern Tiwa
["দক্ষিণি টুসিয়ান"] = "wib", -- Southern Toussian
["দক্ষিণি তুজিয়া"] = "tjs", -- Southern Tujia
["দক্ষিণি টুটচোন"] = "tce", -- Southern Tutchone
["দক্ষিণি ভ্যালি ইয়োকুটস"] = "yok-svy", -- Southern Valley Yokuts
["দক্ষিণি ইয়ুকাগির"] = "yux", -- Southern Yukaghir
["দক্ষিণপশ্চিম গবায়া"] = "gso", -- Southwest Gbaya
["দক্ষিণপশ্চিম পালাভানো"] = "plv", -- Southwest Palawano
["দক্ষিণপশ্চিম পাশায়ি"] = "psh", -- Southwest Pashayi
["দক্ষিণপশ্চিম তান্না"] = "nwi", -- Southwest Tanna
["দক্ষিণপশ্চিমি বনটক"] = "vbk", -- Southwestern Bontoc
["দক্ষিণপশ্চিমি দিনকা"] = "dik", -- Southwestern Dinka
["দক্ষিণপশ্চিমি ফার্স"] = "fay", -- Southwestern Fars
["দক্ষিণপশ্চিমি গুইইয়াং হ্মং"] = "hmg", -- Southwestern Guiyang Hmong
["দক্ষিণপশ্চিমি হুইশুই হ্মং"] = "hmh", -- Southwestern Huishui Hmong
["দক্ষিণপশ্চিমি নিসু"] = "nsv", -- Southwestern Nisu
["দক্ষিণপশ্চিমি তামাঙ্গ"] = "tsf", -- Southwestern Tamang
["দক্ষিণপশ্চিমি তারাহুমারা"] = "twr", -- Southwestern Tarahumara
["দক্ষিণপশ্চিমি তেপেহুয়ান"] = "tla", -- Southwestern Tepehuan
["দক্ষিণপশ্চিমি ত্লাজিয়াকো মিক্সটেক"] = "meh", -- Southwestern Tlaxiaco Mixtec
["সোয়া"] = "sww", -- Sowa
["সোয়ান্ডা"] = "sow", -- Sowanda
["সয়লতেপেক মাজাটেক"] = "vmp", -- Soyaltepec Mazatec
["সয়লতেপেক মিক্সটেক"] = "vmq", -- Soyaltepec Mixtec
["স্প্যানিশ"] = "es", -- Spanish
["স্প্যানিশ সাইন ল্যাঙ্গুয়েজ"] = "ssp", -- Spanish Sign Language
["স্পিতি ভোটি"] = "spt", -- Spiti Bhoti
["স্পোকান"] = "spo", -- Spokane
["স্কুয়ামিশ"] = "squ", -- Squamish
["স্রানান টংগো"] = "srn", -- Sranan Tongo
["শ্রীলঙ্কান ক্রেওল মালয়"] = "sci", -- Sri Lankan Creole Malay
["শ্রীলঙ্কান সাইন ল্যাঙ্গুয়েজ"] = "sqs", -- Sri Lankan Sign Language
["স্টাউ"] = "ero-tau", -- Stau
["স্টড ভোটি"] = "sbu", -- Stod Bhoti
["স্টোনি"] = "sto", -- Stoney
["সুয়াবো"] = "szp", -- Suabo
["সুয়ারমিন"] = "seo", -- Suarmin
["সুয়াউ"] = "swp", -- Suau
["সুবা"] = "sxb", -- Suba
["সুবা-সিম্বিটি"] = "ssc", -- Suba-Simbiti
["সুবি"] = "xsj", -- Subi
["সুবিয়া"] = "sbs", -- Subiya
["সুবতিয়াবা"] = "sut", -- Subtiaba
["সুদানিজ আরবি"] = "apd", -- Sudanese Arabic
["সুডেস্ট"] = "tgo", -- Sudest
["সুডোভিয়ান"] = "xsv", -- Sudovian
["সুয়েনা"] = "sue", -- Suena
["সুগা"] = "sgi", -- Suga
["সুগাংগা"] = "sug", -- Suganga
["সুগুত দুসুন"] = "kzs", -- Sugut Dusun
["সুই"] = "swi", -- Sui
["সুকি"] = "sui", -- Suki
["সুকু"] = "sub", -- Suku
["সুকুমা"] = "suk", -- Sukuma
["সুকুর"] = "syk", -- Sukur
["সুকুরুম"] = "zsu", -- Sukurum
["সুলা"] = "szn", -- Sula
["সুলকা"] = "sua", -- Sulka
["সুলোড"] = "srg", -- Sulod
["সুমা"] = "sqm", -- Suma
["সুমারিউপ"] = "siv", -- Sumariup
["সুমায়ু"] = "six", -- Sumau
["সুম্বাওয়া"] = "smw", -- Sumbawa
["সুম্বাওয়া"] = "suw", -- Sumbwa
["সুমেরিয়ান"] = "sux", -- Sumerian
["সুম্তু চিন"] = "csv", -- Sumtu Chin
["সুনাম"] = "ssk", -- Sunam
["সুন্দানিজ"] = "su", -- Sundanese
["সুংওয়াডাগা"] = "mwo", -- Sungwadaga
["সুংওয়াডিয়ো"] = "mrb", -- Sungwadia
["সুনুম"] = "ymn", -- Sunum
["সুনওয়ার"] = "suz", -- Sunwar
["সুয়োই"] = "syo", -- Suoy
["সুপিয়ের"] = "spp", -- Supyire
["সুর"] = "tdl", -- Sur
["সুরবাখাল"] = "sbj", -- Surbakhal
["সুরি"] = "suq", -- Suri
["সুরিগাওনন"] = "sgd", -- Surigaonon
["সুরজাপুরি"] = "sjp", -- Surjapuri
["সুরসুরুঙ্গা"] = "sgz", -- Sursurunga
["সুরিয়াহা"] = "swx", -- Suruahá
["সুরুবু"] = "sde", -- Surubu
["সুরুই"] = "sru", -- Suruí
["সুরুই ডো পারা"] = "mdz", -- Suruí Do Pará
["সাসকেহান্নক"] = "sqn", -- Susquehannock
["সুসু"] = "sus", -- Susu
["সুসুয়ামি"] = "ssu", -- Susuami
["সুউনদি"] = "sdj", -- Suundi
["সুওয়াওয়া"] = "swu", -- Suwawa
["সুয়া"] = "suy", -- Suyá
["স্বান"] = "sva", -- Svan
["সোয়াবিয়ান"] = "swg", -- Swabian
["সোয়াহিলি"] = "sw", -- Swahili
["সোয়াম্পি ক্রি"] = "csw", -- Swampy Cree
["সোয়াজি"] = "ss", -- Swazi
["সুইডিশ"] = "sv", -- Swedish
["সুইডিশ সাইন ল্যাঙ্গুয়েজ"] = "swl", -- Swedish Sign Language
["সুইস-ফরাসি সাইন ল্যাঙ্গুয়েজ"] = "ssr", -- Swiss-French Sign Language
["সুইস-জার্মান সাইন ল্যাঙ্গুয়েজ"] = "sgg", -- Swiss-German Sign Language
["সুইস-ইতালীয় সাইন ল্যাঙ্গুয়েজ"] = "slf", -- Swiss-Italian Sign Language
["সও"] = "sox", -- Swo
["সিয়েনারা সেনোউফো"] = "shz", -- Syenara Senoufo
["সিলেটি"] = "syl", -- Sylheti
["সাকাতা"] = "sai-sac", -- Sácata
["সাও পাওলো কাইনগাং"] = "zkp", -- São Paulo Kaingáng
["সাওতোমেনসে"] = "cri", -- Sãotomense
["সিতিটি সেনোউফো"] = "sep", -- Sìcìté Sénoufo
["সিশী"] = "sih", -- Sîshëë
["সো"] = "sss", -- Sô
["ত'এন"] = "tct", -- T'en
["তাবওয়া"] = "tap", -- Taabwa
["তাবা জাপোটেক"] = "zat", -- Tabaa Zapotec
["তাবানকালে"] = "sai-tab", -- Tabancale
["তাবরু"] = "tby", -- Tabaru
["তাবাসারান"] = "tab", -- Tabasaran
["তাবাসকো চন্টাল"] = "chf", -- Tabasco Chontal
["তাবাসকো নাহুয়াতল"] = "nhc", -- Tabasco Nahuatl
["তাবাসকো জোক"] = "zoq", -- Tabasco Zoque
["তাবলা"] = "tnm", -- Tabla
["তাবো"] = "knv", -- Tabo
["তাব্রিয়াক"] = "tzx", -- Tabriak
["টাকাহুয়া মিক্সটেক"] = "xtt", -- Tacahua Mixtec
["টাকানা"] = "tna", -- Tacana
["টাচাউইট"] = "shy", -- Tachawit
["টাডাক্সাহাক"] = "dsq", -- Tadaksahak
["টাডিয়ুয়ান"] = "tdy", -- Tadyawan
["টাই'"] = "rob", -- Tae'
["টাফি"] = "tcd", -- Tafi
["টাফ্রেসি"] = "xme-taf", -- Tafreshi
["টাগাবাওয়া"] = "bgs", -- Tagabawa
["টাগাকউলু কালগান"] = "klg", -- Tagakaulu Kalagan
["ট্যাগাল মুরুট"] = "mvv", -- Tagal Murut
["তাগালগ"] = "tl", -- Tagalog
["ট্যাগবানওয়া"] = "tbw", -- Tagbanwa
["ট্যাগবু"] = "tbm", -- Tagbu
["ট্যাগডাল"] = "tda", -- Tagdal
["ট্যাগিশ"] = "tgx", -- Tagish
["ট্যাগোই"] = "tag", -- Tagoi
["ট্যাগওয়ানা সেনোউফো"] = "tgw", -- Tagwana Senoufo
["তাহিতিয়ান"] = "ty", -- Tahitian
["টাহ্লটান"] = "tht", -- Tahltan
["তাই"] = "taw", -- Tai
["তাই ডায়েং"] = "tyr", -- Tai Daeng
["তাই ডাম"] = "blt", -- Tai Dam
["তাই ডো"] = "tyj", -- Tai Do
["তাই ডোন"] = "twh", -- Tai Dón
["তাই হ্যাং টং"] = "thc", -- Tai Hang Tong
["তাই হংজিন"] = "tiz", -- Tai Hongjin
["তাই লাইং"] = "tjl", -- Tai Laing
["তাই লোই"] = "tlq", -- Tai Loi
["তাই লং"] = "thi", -- Tai Long
["তাই নুয়া"] = "tdd", -- Tai Nüa
["তাই পাও"] = "tpo", -- Tai Pao
["তাই থান"] = "tmm", -- Tai Thanh
["তাই ইয়া"] = "cuu", -- Tai Ya
["তাইয়াপ"] = "gpn", -- Taiap
["তাইকাট"] = "aos", -- Taikat
["টাইমির পিজিন রাশিয়ান"] = "crp-tpr", -- Taimyr Pidgin Russian
["তাইনাই"] = "ago", -- Tainae
["টাইরুমা"] = "uar", -- Tairuma
["টাইশানিস"] = "zhx-tai", -- Taishanese
["টাইটা"] = "dav", -- Taita
["টাইভোয়ান"] = "tvx", -- Taivoan
["তাইওয়ান সাইন ল্যাঙ্গুয়েজ"] = "tss", -- Taiwan Sign Language
["তাজে"] = "pee", -- Taje
["তাজিক"] = "tg", -- Tajik
["তাজিকি আরবি"] = "abh", -- Tajiki Arabic
["তাজিও"] = "tdj", -- Tajio
["তাজুয়াসোন"] = "tja", -- Tajuasohn
["টাকেলমা"] = "tkm", -- Takelma
["টাকিয়া"] = "tbc", -- Takia
["টাকুয়া"] = "tkz", -- Takua
["টাকুউ"] = "nho", -- Takuu
["টাকওয়ানে"] = "tke", -- Takwane
["তাল"] = "tal", -- Tal
["তালা"] = "tak", -- Tala
["তালাউদ"] = "tld", -- Talaud
["তালিয়াবু"] = "tlv", -- Taliabu
["তালিয়েং"] = "tdf", -- Talieng
["তালিঙ্গা-বুইসি"] = "tlj", -- Talinga-Bwisi
["তালিসে"] = "tlr", -- Talise
["টাল্লান"] = "sai-tal", -- Tallán
["টালৌডি"] = "tlo", -- Talodi
["টালোকি"] = "tlk", -- Taloki
["তালন্দো'"] = "tln", -- Talondo'
["টালোসান"] = "tzl", -- Talossan
["টালু"] = "yta", -- Talu
["তালিশ"] = "tly", -- Talysh
["তমা (চাদ)"] = "tma", -- Tama (Chad)
["তমা (কলম্বিয়া)"] = "ten", -- Tama (Colombia)
["তামাগারিও"] = "tcg", -- Tamagario
["তামাম্বো"] = "mla", -- Tamambo
["তামান (ইন্দোনেশিয়া)"] = "tmn", -- Taman (Indonesia)
["তামান (মিয়ানমার)"] = "tcl", -- Taman (Myanmar)
["তামানাকু"] = "tmz", -- Tamanaku
["তামাজোলা মিক্সটেক"] = "vmx", -- Tamazola Mixtec
["তাম্বাস"] = "tdk", -- Tambas
["তাম্বোরা"] = "xxt", -- Tambora
["তাম্বোটালো"] = "tls", -- Tambotalo
["তাম্বুনান দুসুন"] = "kzt", -- Tambunan Dusun
["তামি"] = "tmy", -- Tami
["তামিল"] = "ta", -- Tamil
["তামকি"] = "tax", -- Tamki
["তামনিম চিতাক"] = "tml", -- Tamnim Citak
["তাম্পিয়াস লোবু"] = "low", -- Tampias Lobu
["তাম্পুয়ান"] = "tpu", -- Tampuan
["তাম্পুলমা"] = "tpm", -- Tampulma
["তানাক্রোস"] = "tcb", -- Tanacross
["তানাাহমেরাহ"] = "tcm", -- Tanahmerah
["তানাপাগ"] = "tpv", -- Tanapag
["তানচাংইয়া"] = "tnv", -- Tanchangya
["ট্যান্ডাগানন"] = "tgn", -- Tandaganon
["টান্ডিয়া"] = "tni", -- Tandia
["টানেমা"] = "tnx", -- Tanema
["টাঙ্গালে"] = "tan", -- Tangale
["টাংগাম"] = "sit-tgm", -- Tangam
["টাংগু"] = "tgu", -- Tanggu
["টাংখুল নাগা"] = "nmf", -- Tangkhul Naga
["টাংকো"] = "tkx", -- Tangko
["টাঙ্গোয়া"] = "tgp", -- Tangoa
["টাংসা"] = "nst", -- Tangsa
["টাঙ্গুয়াট"] = "tbs", -- Tanguat
["টাংগুট"] = "txg", -- Tangut
["টাংওয়াং"] = "mis-tnw", -- Tangwang
["টানিমবিলি"] = "tbe", -- Tanimbili
["তানিমুকা-রেতুয়ারা"] = "tnc", -- Tanimuca-Retuarã
["তানজিজিলি"] = "uji", -- Tanjijili
["টানুদ্যান কালিঙ্গা"] = "kml", -- Tanudan Kalinga
["তানজানিয়ান সাইন ল্যাঙ্গুয়েজ"] = "tza", -- Tanzanian Sign Language
["টাওস"] = "twf", -- Taos
["ট্যাপাচুল্টেক"] = "nai-tap", -- Tapachultec
["ট্যাপারিটা"] = "sai-tpr", -- Taparita
["ট্যাপায়ুনা"] = "sai-tap", -- Tapayuna
["টাপেবা"] = "tbb", -- Tapeba
["টাপেই"] = "afp", -- Tapei
["টাপিয়েতে"] = "tpj", -- Tapieté
["টাপিরাপে"] = "taf", -- Tapirapé
["টার গুলা"] = "kcm", -- Tar Gula
["তারা বাকা"] = "bdh", -- Tara Baka
["তারাইরিউ"] = "sai-trr", -- Tarairiú
["টারান্টিনো"] = "roa-tar", -- Tarantino
["টারো"] = "tro", -- Tarao
["টারোন"] = "mhu", -- Taraon
["টারেং"] = "tgr", -- Tareng
["তারিয়ানা"] = "tae", -- Tariana
["তারিফিট"] = "rif", -- Tarifit
["তারজুমা"] = "txj", -- Tarjumo
["টারোক"] = "yer", -- Tarok
["টারোকো"] = "trv", -- Taroko
["তারপিয়া"] = "tpf", -- Tarpia
["টার্তেসিয়ান"] = "txr", -- Tartessian
["তারুমা"] = "tdm", -- Taruma
["টাসাওয়াক"] = "twq", -- Tasawaq
["তাশেলহিটা"] = "shi", -- Tashelhit
["তাসমাটে"] = "tmt", -- Tasmate
["টাট"] = "ttt", -- Tat
["টাটাল্টেপেক চ্যাটিনো"] = "cta", -- Tataltepec Chatino
["টাটানা"] = "txx", -- Tatana
["তাতার"] = "tt", -- Tatar
["টাটাভিয়াম"] = "azc-tat", -- Tataviam
["টাটুইও"] = "tav", -- Tatuyo
["টাউয়াডে"] = "ttd", -- Tauade
["টাউলিল"] = "tuh", -- Taulil
["টাউংইয়ো"] = "tco", -- Taungyo
["টাউপটা"] = "tpa", -- Taupota
["টাউসে"] = "tad", -- Tause
["টাউশিরো"] = "trr", -- Taushiro
["টাউসুগ"] = "tsg", -- Tausug
["টাউইয়া"] = "tya", -- Tauya
["টাভেটা"] = "tvs", -- Taveta
["টাভোয়ান"] = "tvn", -- Tavoyan
["টাভরিংগার রোমানি"] = "rmu", -- Tavringer Romani
["টাওয়ালা"] = "tbo", -- Tawala
["টাওয়ান্ডে"] = "xtw", -- Tawandê
["টাওয়াং মওনপা"] = "twm", -- Tawang Monpa
["টাওয়াসা"] = "nai-taw", -- Tawasa
["টাওর্তা"] = "tbp", -- Taworta
["টাওয়োয়ান"] = "twy", -- Tawoyan
["টাওয়ার চিন"] = "tcp", -- Tawr Chin
["তাই খাং"] = "tnu", -- Tay Khang
["তাইয়াবাস আইটা"] = "ayy", -- Tayabas Ayta
["টাইমানিটিক"] = "sem-tay", -- Taymanitic
["তায়ো"] = "cks", -- Tayo
["তাইনো"] = "tnq", -- Taíno
["ট্বোলি"] = "tbl", -- Tboli
["টিচিচেগে"] = "tck", -- Tchitchege
["টিচুম্বুলি"] = "bqa", -- Tchumbuli
["তে'উন"] = "tve", -- Te'un
["তেয়ানু"] = "tkw", -- Teanu
["তেবুল সাইন ল্যাঙ্গুয়েজ"] = "tsy", -- Tebul Sign Language
["তেবুল উরে ডোগন"] = "dtu", -- Tebul Ure Dogon
["তেকপাটলান টোটোনাক"] = "tcw", -- Tecpatlán Totonac
["তেডাগা"] = "tuq", -- Tedaga
["তেডিম চিন"] = "ctd", -- Tedim Chin
["টিই"] = "tkq", -- Tee
["তেফারো"] = "tfo", -- Tefaro
["তেগালি"] = "ras", -- Tegali
["তেহিট"] = "kps", -- Tehit
["তেহুয়েলচে"] = "teh", -- Tehuelche
["তেইওয়া"] = "twe", -- Teiwa
["তেজালাপান জাপোটেক"] = "ztt", -- Tejalapan Zapotec
["টেকে-ফুউমু"] = "ifm", -- Teke-Fuumu
["টেকে-কুকুয়া"] = "kkw", -- Teke-Kukuya
["টেকে-লাআলি"] = "lli", -- Teke-Laali
["টেকে-টেগে"] = "teg", -- Teke-Tege
["টেকে-ৎসাই"] = "tyi", -- Teke-Tsaayi
["টেকে-টাইই"] = "tyx", -- Teke-Tyee
["টেকটাইটেকো"] = "ttc", -- Tektiteko
["তেলা-মাসবুয়ার"] = "tvm", -- Tela-Masbuar
["তেলেফোল"] = "tlf", -- Telefol
["তেলুগু"] = "te", -- Telugu
["তেলুটি"] = "tlt", -- Teluti
["তেম"] = "kdh", -- Tem
["তেমাসকাল্টেপেক নাহুয়াতল"] = "nhv", -- Temascaltepec Nahuatl
["তেম্বে"] = "tqb", -- Tembé
["তেমে"] = "tdo", -- Teme
["তেমেইন"] = "teq", -- Temein
["তেমি"] = "soz", -- Temi
["তেমিয়ার"] = "tea", -- Temiar
["তেমনে"] = "tem", -- Temne
["তেমোয়ায়া ওটোমি"] = "ott", -- Temoaya Otomi
["তেমোক"] = "tmo", -- Temoq
["তেম্পাসুক দুসুন"] = "tdu", -- Tempasuk Dusun
["তেন'এডন"] = "tnz", -- Ten'edn
["তেনাঙ্গো ওটোমি"] = "otn", -- Tenango Otomi
["তেন কান ডোগন"] = "dtk", -- Tene Kan Dogon
["তেংগারং কুতাই মালয়"] = "vkt", -- Tenggarong Kutai Malay
["তেংগার"] = "tes", -- Tengger
["তেনহারিম"] = "pah", -- Tenharim
["তেনিনো"] = "tqn", -- Tenino
["তেনিস"] = "tns", -- Tenis
["তেন্নেট"] = "tex", -- Tennet
["টিওচেউ"] = "nan-tws", -- Teochew
["তেওজোমুলকো চ্যাটিনো"] = "omq-teo", -- Teojomulco Chatino
["তেওপ"] = "tio", -- Teop
["তেয়োর"] = "tev", -- Teor
["তেপেকানো"] = "tep", -- Tepecano
["তেপেটোটুটলা চিনান্টেক"] = "cnt", -- Tepetotutla Chinantec
["তেপেউক্সিলা কুইকাটেক"] = "cux", -- Tepeuxila Cuicatec
["তেপিনাপা চিনান্টেক"] = "cte", -- Tepinapa Chinantec
["তেপো ক্রুমেন"] = "ted", -- Tepo Krumen
["তেপোসকোলুলা মিক্সটেক"] = "omq-tel", -- Teposcolula Mixtec
["তেকুপূর্ব্লাটেক"] = "nai-teq", -- Tequistlatec
["তের সামি"] = "sjt", -- Ter Sami
["তেরা"] = "ttr", -- Tera
["তেরেবু"] = "trb", -- Terebu
["তেরেই"] = "buo", -- Terei
["তেরেংগানু মালয়"] = "poz-ter", -- Terengganu Malay
["তেরেনো"] = "ter", -- Tereno
["তেরেসা"] = "tef", -- Teressa
["তেরেভেং"] = "twg", -- Tereweng
["তেরিবে"] = "tfr", -- Teribe
["তেরিক"] = "tec", -- Terik
["তেরমানু"] = "twu", -- Termanu
["তেরনাটে"] = "tft", -- Ternate
["তেরনাটেনো"] = "tmg", -- Ternateño
["তেসে"] = "keg", -- Tese
["তেশেনাওয়া"] = "twc", -- Teshenawa
["তেটেলা"] = "tll", -- Tetela
["তেটেলসিংগো নাহুয়াতল"] = "nhg", -- Tetelcingo Nahuatl
["তেটেটে"] = "teb", -- Tetete
["তেটসেরেট"] = "tez", -- Tetserret
["তেটুম"] = "tet", -- Tetum
["তেটুন দিলি"] = "tdt", -- Tetun Dili
["তেউশেন"] = "sai-teu", -- Teushen
["তেউটিলা কুইকাটেক"] = "cut", -- Teutila Cuicatec
["তেওয়া"] = "tew", -- Tewa
["তেক্সকাটেপেক ওটোমি"] = "otx", -- Texcatepec Otomi
["তেক্সিস্টেপেক পোপোলুকা"] = "poq", -- Texistepec Popoluca
["তেক্সমেলুকান জাপোটেক"] = "zpz", -- Texmelucan Zapotec
["তেওজোয়াটলান মিক্সটেক"] = "mxb", -- Tezoatlán Mixtec
["থা"] = "thy", -- Tha
["থাچانাদান"] = "thn", -- Thachanadan
["থাডো চিন"] = "tcz", -- Thado Chin
["থাই"] = "th", -- Thai
["থাই মন"] = "mnw-tha", -- Thai Mon
["থাই সাইন ল্যাঙ্গুয়েজ"] = "tsq", -- Thai Sign Language
["থাই সং"] = "soa", -- Thai Song
["থাইফুম চিন"] = "cth", -- Thaiphum Chin
["থাকালী"] = "ths", -- Thakali
["থামুডিক"] = "sem-tha", -- Thamudic
["থাঙ্গাল নাগা"] = "nki", -- Thangal Naga
["থাংমি"] = "thf", -- Thangmi
["থাও"] = "ssf", -- Thao
["থারাকা"] = "thk", -- Tharaka
["থারগারী"] = "dhr", -- Tharrgari
["থাভুং"] = "thm", -- Thavung
["থাওয়া"] = "xtv", -- Thawa
["থো"] = "tou", -- Tho
["থম্পসন"] = "thp", -- Thompson
["থোফো"] = "ytp", -- Thopho
["থ্রাসিয়ান"] = "txh", -- Thracian
["থু লাও"] = "tyl", -- Thu Lao
["থুলুং"] = "tdh", -- Thulung
["থুরাওয়াল"] = "tbh", -- Thurawal
["থুরি"] = "thu", -- Thuri
["তিয়াগবাম্রিন আইজি"] = "ahi", -- Tiagbamrin Aizi
["তিয়ালে"] = "mnl", -- Tiale
["তিয়াং"] = "tbj", -- Tiang
["তিবিয়া"] = "ngy", -- Tibea
["তিব্বতি"] = "bo", -- Tibetan
["টিকুনা"] = "tca", -- Ticuna
["টিডাআ মিক্সটেক"] = "mtx", -- Tidaá Mixtec
["টিডোর"] = "tvo", -- Tidore
["টিয়েমাসেওয়ে বঝো"] = "boo", -- Tiemacèwè Bozo
["তিয়েনে"] = "tii", -- Tiene
["টিফাল"] = "tif", -- Tifal
["টিগাক"] = "tgc", -- Tigak
["টিগোন ম্বেম্বে"] = "nza", -- Tigon Mbembe
["টিগ্রে"] = "tig", -- Tigre
["টিগ্রিনিয়া"] = "ti", -- Tigrinya
["টিই"] = "txq", -- Tii
["তিজাল্টেপেক মিক্সটেক"] = "xtl", -- Tijaltepec Mixtec
["টিকার"] = "tik", -- Tikar
["টিকোপিয়া"] = "tkp", -- Tikopia
["তিলাপ ওটোমি"] = "otl", -- Tilapa Otomi
["টিলামুক"] = "til", -- Tillamook
["টিলকুইয়াপান জাপোটেক"] = "zts", -- Tilquiapan Zapotec
["টিলুং"] = "tij", -- Tilung
["টিমা"] = "tms", -- Tima
["টিম্বে"] = "tim", -- Timbe
["টিমোর পিজিন"] = "tvy", -- Timor Pidgin
["টিমোটে"] = "sai-tim", -- Timote
["টিমুকুয়া"] = "tjm", -- Timucua
["টিমুগন মুরুট"] = "tih", -- Timugon Murut
["টিনানি"] = "lbf", -- Tinani
["টিন্দি"] = "tin", -- Tindi
["টিংগুই-বোটো"] = "tgv", -- Tingui-Boto
["টিনিগুয়া"] = "tit", -- Tinigua
["টিনোক কাল্লাহান"] = "tne", -- Tinoc Kallahan
["টিনপুৎজ"] = "tpz", -- Tinputz
["টিপাই"] = "nai-tip", -- Tipai
["টিপ্পেরা"] = "tpe", -- Tippera
["তিরা"] = "tic", -- Tira
["তিরাহি"] = "tra", -- Tirahi
["তিরানিগে দিগা ডোগন"] = "tde", -- Tiranige Diga Dogon
["টিরাক্স"] = "mme", -- Tirax
["টিরুরায়"] = "tiy", -- Tiruray
["টিটা"] = "tdq", -- Tita
["টাইটান"] = "ttv", -- Titan
["টিভি"] = "tiv", -- Tiv
["টিওয়া"] = "lax", -- Tiwa
["টিভি"] = "tiw", -- Tiwi
["টিয়েফো"] = "tiq", -- Tiéfo
["টিয়েইয়াক্সো বঝো"] = "boz", -- Tiéyaxo Bozo
["তিউরুরু"] = "tju", -- Tjurruru
["ত্লাচিচিলকো তেপেহুয়া"] = "tpt", -- Tlachichilco Tepehua
["ত্লাকোআপা মে'ফা"] = "tpl", -- Tlacoapa Me'phaa
["ত্লাকোয়াৎজিন্টেপেক চিনান্টেক"] = "ctl", -- Tlacoatzintepec Chinantec
["ত্লাকোয়ালুলিটা জাপোটেক"] = "zpk", -- Tlacolulita Zapotec
["ত্লাহুয়িকা"] = "ocu", -- Tlahuica
["ত্লাহুইটোল্টেপেক মিক্সে"] = "mxp", -- Tlahuitoltepec Mixe
["ত্লামাকাজাপ নাহুয়াতল"] = "nuz", -- Tlamacazapa Nahuatl
["ত্লাজওয়ায়াল্টেপেক মিক্সটেক"] = "mqh", -- Tlazoyaltepec Mixtec
["ত্লিঙ্গিত"] = "tli", -- Tlingit
["তো"] = "toz", -- To
["তো'আবাইটা"] = "mlu", -- To'abaita
["তোয়ারি"] = "tqo", -- Toaripi
["টোবা"] = "tob", -- Toba
["টোবা বাটাক"] = "bbc", -- Toba Batak
["টোবা-মাস্কোই"] = "tmf", -- Toba-Maskoy
["টোবাগোনিয়ান ক্রেওল ইংলিশ"] = "tgh", -- Tobagonian Creole English
["টোবাংগা"] = "tng", -- Tobanga
["টোবাটি"] = "tti", -- Tobati
["টোবেলো"] = "tlb", -- Tobelo
["টোবিয়ান"] = "tox", -- Tobian
["টোবিলুং"] = "tgb", -- Tobilung
["টোবো"] = "tbv", -- Tobo
["টোকাটিন্স আসুরিনি"] = "asu", -- Tocantins Asurini
["টোচারিয়ান এ"] = "xto", -- Tocharian A
["টোচারিয়ান বি"] = "txb", -- Tocharian B
["টোচো"] = "taz", -- Tocho
["টোডা"] = "tcx", -- Toda
["টোদ্রাহ"] = "tdr", -- Todrah
["টোফা"] = "kim", -- Tofa
["টোফ্যানমা"] = "tlg", -- Tofanma
["টোফিন গ্বে"] = "tfi", -- Tofin Gbe
["টোগবো-ভারা বান্ডা"] = "tor", -- Togbo-Vara Banda
["টোগোয়ো"] = "tgy", -- Togoyo
["টোজোলাবাল"] = "toj", -- Tojolabal
["টোক পিসিন"] = "tpi", -- Tok Pisin
["টোকা-লেইয়া"] = "dov", -- Toka-Leya
["টোকানো"] = "zuh", -- Tokano
["টোকেলান"] = "tkl", -- Tokelauan
["টোকি পোনা"] = "tok", -- Toki Pona
["টোকুনোশিমা"] = "tkn", -- Tokunoshima
["টল"] = "jic", -- Tol
["টোলাই"] = "ksd", -- Tolai
["টোলাকি"] = "lbw", -- Tolaki
["টোলোমাকো"] = "tlm", -- Tolomako
["টোলোয়া"] = "tol", -- Tolowa
["টোলওজা"] = "ytl", -- Toloza
["টোমা"] = "tod", -- Toma
["টোমাদিনো"] = "tdi", -- Tomadino
["টোম্বেলারা"] = "ttp", -- Tombelala
["টোম্বোনুও"] = "txa", -- Tombonuo
["টোম্বুলু"] = "tom", -- Tombulu
["টোমিনি"] = "txm", -- Tomini
["টোমমেগিন"] = "xxt", -- Tommeginne
["টোম্মো সো"] = "dto", -- Tommo So
["টোমো কান ডোগন"] = "dtm", -- Tomo Kan Dogon
["টোমোইপ"] = "tqp", -- Tomoip
["টোন্ডানো"] = "tdn", -- Tondano
["টোঙ্গা (মালাভি)"] = "tog", -- Tonga (Malawi)
["টোঙ্গা (মোজাম্বিক)"] = "toh", -- Tonga (Mozambique)
["টোঙ্গা (জাম্বিয়া)"] = "toi", -- Tonga (Zambia)
["টোঙ্গান"] = "to", -- Tongan
["টংওয়ে"] = "tny", -- Tongwe
["টোনজোন"] = "tjn", -- Tonjon
["টোনকাওয়া"] = "tqw", -- Tonkawa
["টোনসাওয়াং"] = "tnw", -- Tonsawang
["টোনসিয়া"] = "txs", -- Tonsea
["টোনটেমবোয়ান"] = "tnt", -- Tontemboan
["টোগী"] = "xpx", -- Toogee
["টোরো"] = "ttj", -- Tooro
["টোপোয়ো"] = "toy", -- Topoiyo
["টোপোসা"] = "toq", -- Toposa
["তোরাজা-সা'দান"] = "sda", -- Toraja-Sa'dan
["তোরাম"] = "trj", -- Toram
["টোরাউ"] = "ttu", -- Torau
["টোরো"] = "tdv", -- Toro
["টোরো সো ডোগন"] = "dts", -- Toro So Dogon
["টোরো তেগু ডোগন"] = "dtt", -- Toro Tegu Dogon
["টোরোমোনো"] = "tno", -- Toromono
["টোরোনা"] = "tqr", -- Torona
["টোরিস স্ট্রেইট ক্রেওল"] = "tcs", -- Torres Strait Creole
["টোরিসেলি"] = "tei", -- Torricelli
["টোরিসেলি ইয়াউ"] = "yyu", -- Torricelli Yau
["টোরওয়ালি"] = "trw", -- Torwali
["টোরা"] = "trz", -- Torá
["টোসু"] = "sit-tos", -- Tosu
["তোটেলা"] = "ttl", -- Totela
["টোটো"] = "txo", -- Toto
["টোটোলি"] = "txe", -- Totoli
["টোটোমাকাপান জাপোটেক"] = "zph", -- Totomachapan Zapotec
["টোটোনটেপেক মিক্সে"] = "mto", -- Totontepec Mixe
["টোটোরো"] = "ttk", -- Totoro
["টোউও"] = "tqu", -- Touo
["টওরা"] = "neb", -- Toura
["টোয়াই"] = "ttn", -- Towei
["ট্রান্সলিঙ্গুয়াল"] = "mul", -- Translingual
["ট্রান্সিলভানিয়ান স্যাক্সন"] = "gmw-tsx", -- Transylvanian Saxon
["ট্র্যাভেলার ড্যানিশ"] = "rmd", -- Traveller Danish
["ট্র্যাভেলার নরওয়েজিয়ান"] = "rmg", -- Traveller Norwegian
["ট্র্যাভেলার স্কটিশ"] = "trl", -- Traveller Scottish
["ত্রেগামি"] = "trm", -- Tregami
["ত্রেমেম্বে"] = "tme", -- Tremembé
["ত্রিয়েং"] = "stg", -- Trieng
["ত্রিমুরিস"] = "tip", -- Trimuris
["ত্রিং"] = "tgq", -- Tring
["ত্রিংগুস"] = "trx", -- Tringgus
["ত্রিনিদাদ অ্যান্ড টোবাগো সাইন ল্যাঙ্গুয়েজ"] = "lst", -- Trinidad and Tobago Sign Language
["ত্রিনিদাদিয়ান ক্রেওল ইংলিশ"] = "trf", -- Trinidadian Creole English
["ত্রিনিতারিও"] = "trn", -- Trinitario
["ত্রিয়ো"] = "tri", -- Trió
["ট্রুকা"] = "tka", -- Truká
["ট্রুমাই"] = "tpy", -- Trumai
["সুন-লাও"] = "tsl", -- Ts'ün-Lao
["স্সাংগি"] = "tsa", -- Tsaangi
["স্সাফিকি"] = "cof", -- Tsafiki
["স্সাক্সুর"] = "tkr", -- Tsakhur
["স্সাকোনিয়ান"] = "tsd", -- Tsakonian
["স্সাকওয়াম্বো"] = "kvz", -- Tsakwambo
["স্সামাই"] = "tsb", -- Tsamai
["স্সাত"] = "huq", -- Tsat
["স্সেটসাওট"] = "txc", -- Tsetsaut
["স্সেজ"] = "ddo", -- Tsez
["স্সাংগলা"] = "tsj", -- Tshangla
["স্সোব্ডুন"] = "sit-tsh", -- Tshobdun
["স্সওয়া"] = "hio", -- Tshwa
["স্সিকিম্বা"] = "kdl", -- Tsikimba
["স্সিমানে"] = "cas", -- Tsimané
["স্সিমশিয়ান"] = "tsi", -- Tsimshian
["স্সিশিংগিনি"] = "tsw", -- Tsishingini
["স্সো"] = "ldp", -- Tso
["স্সোগো"] = "tsv", -- Tsogo
["স্সোঙ্গা"] = "ts", -- Tsonga
["স্সোৎসিতাল"] = "fly", -- Tsotsitaal
["স্সোউ"] = "tsu", -- Tsou
["স্সুকুবা"] = "cbq", -- Tsucuba
["স্সুম"] = "ttz", -- Tsum
["স্সুট'ইনা"] = "srs", -- Tsuut'ina
["স্সুভাডি"] = "tvd", -- Tsuvadi
["স্সুভান"] = "tsh", -- Tsuvan
["স্সওয়া"] = "tsc", -- Tswa
["স্সওয়ানা"] = "tn", -- Tswana
["স্সওয়াপং"] = "two", -- Tswapong
["তুয়ামোতুয়ান"] = "pmt", -- Tuamotuan
["তুয়ারেগ"] = "tmh", -- Tuareg
["টুবর"] = "tbu", -- Tubar
["টুকানো"] = "tuo", -- Tucano
["টুগেন"] = "tuy", -- Tugen
["টুগুন"] = "tzn", -- Tugun
["টুগুটিল"] = "tuj", -- Tugutil
["টুকং বেসি উত্তর"] = "khc", -- Tukang Besi North
["টুকং বেসি দক্ষিণ"] = "bhq", -- Tukang Besi South
["টুকি"] = "bag", -- Tuki
["টুকপা"] = "tpq", -- Tukpa
["টুকুদেরে"] = "tkd", -- Tukudede
["টুকুম্যানফ্যাড"] = "tkf", -- Tukumanféd
["তুলা"] = "tul", -- Tula
["তুলে-কাওয়েয়া ইয়োকুটস"] = "yok-tky", -- Tule-Kaweah Yokuts
["তুলেহু"] = "tlu", -- Tulehu
["তুলিশি"] = "tey", -- Tulishi
["তুলু"] = "tcy", -- Tulu
["তুলু-বোহুয়া"] = "rak", -- Tulu-Bohuai
["তুলুয়া"] = "aus-tul", -- Tulua
["টুমা-ইরুমু"] = "iou", -- Tuma-Irumu
["টুমাক"] = "tmc", -- Tumak
["তুম্বুকা"] = "tum", -- Tumbuka
["তুমি"] = "kku", -- Tumi
["তুমলেয়ো"] = "tmq", -- Tumleo
["তুমশুকেস"] = "xtq", -- Tumshuqese
["তুমতুম"] = "tbr", -- Tumtum
["তুমুলুং সিইসলা"] = "sil", -- Tumulung Sisaala
["টুন্ড্রা এনেটস"] = "enh", -- Tundra Enets
["টুন্ড্রা নেনেন্টস"] = "yrk", -- Tundra Nenets
["টুনেন"] = "tvu", -- Tunen
["টুংগাগ"] = "lcm", -- Tungag
["টুংগারে"] = "trt", -- Tunggare
["টুনিয়া"] = "tug", -- Tunia
["টুনিকা"] = "tun", -- Tunica
["তুনিসিয়ান আরবি"] = "aeb", -- Tunisian Arabic
["তুনিসিয়ান বার্বার"] = "sds", -- Tunisian Berber
["তুনিসিয়ান সাইন ল্যাঙ্গুয়েজ"] = "tse", -- Tunisian Sign Language
["তুনজুং"] = "tjg", -- Tunjung
["তুননি"] = "tqq", -- Tunni
["তুনুমিইসুট"] = "esx-tut", -- Tunumiisut
["তুনজু"] = "dza", -- Tunzu
["টুওবা"] = "mis-tuo", -- Tuoba
["টুওটোম্ব"] = "ttf", -- Tuotomb
["টুপারী"] = "tpr", -- Tuparí
["টুপিনাম্বা"] = "tpn", -- Tupinambá
["টুপিনিকিন"] = "tpk", -- Tupinikin
["টুপুরি"] = "tui", -- Tupuri
["তুরকা"] = "trh", -- Turaka
["তুরডেতানিয়ান"] = "mis-tdt", -- Turdetanian
["তুরডুলিয়ান"] = "mis-tdl", -- Turdulian
["টুরি"] = "trd", -- Turi
["টুরিওয়ারা"] = "twt", -- Turiwára
["তুরকা"] = "tuz", -- Turka
["তুর্কানা"] = "tuv", -- Turkana
["তুর্কি"] = "tr", -- Turkish
["তুর্কি সাইন ল্যাঙ্গুয়েজ"] = "tsm", -- Turkish Sign Language
["তুর্কমেন"] = "tk", -- Turkmen
["তুর্কস অ্যান্ড কাইকোস ক্রেওল ইংলিশ"] = "tch", -- Turks and Caicos Creole English
["তুরোয়ো"] = "tru", -- Turoyo
["তুরুমসা"] = "tqm", -- Turumsa
["তুরুং"] = "try", -- Turung
["টাসকারোরা"] = "tus", -- Tuscarora
["টুটেলো"] = "tta", -- Tutelo
["টুটং"] = "ttg", -- Tutong
["টুটসা নাগা"] = "tvt", -- Tutsa Naga
["টুটুবা"] = "tmi", -- Tutuba
["টুটুটপেক মিক্সটেক"] = "mtu", -- Tututepec Mixtec
["টুটুটনি"] = "tuu", -- Tututni
["তুভালুয়ান"] = "tvl", -- Tuvaluan
["তুভান"] = "tyv", -- Tuvan
["তুওয়ালি ইফুর্গাও"] = "ifk", -- Tuwali Ifugao
["তুওয়ারি"] = "tww", -- Tuwari
["তুওয়ুলি"] = "bov", -- Tuwuli
["টক্সিনাওয়া"] = "tux", -- Tuxináwa
["টুক্সা"] = "tud", -- Tuxá
["তুয়ুকা"] = "tue", -- Tuyuca
["তুইয়ুহুন"] = "mis-tuh", -- Tuyuhun
["ত্বানা"] = "twa", -- Twana
["ট্যেনডি"] = "twn", -- Twendi
["টায়াপ"] = "kcg", -- Tyap
["টায়ারাইটি"] = "woa", -- Tyaraity
["টিয়ারর্নোটেপান্নার"] = "xph", -- Tyerrernotepanner
["ৎজ'উতুজিল"] = "tzj", -- Tz'utujil
["ৎজেল্টাল"] = "tzh", -- Tzeltal
["ৎজোৎজিল"] = "tzo", -- Tzotzil
["তাই"] = "tyz", -- Tày
["তাই টাক"] = "tyt", -- Tày Tac
["তায়ে বোই"] = "tas", -- Tây Bồi
["তেন"] = "lor", -- Téén
["তিরি"] = "cir", -- Tîrî
["টিউবাটুলবাল"] = "tub", -- Tübatulabal
["উ"] = "uuu", -- U
["উয়াব মেটো"] = "aoz", -- Uab Meto
["উয়ামু"] = "uam", -- Uamué
["উয়ারে"] = "ksj", -- Uare
["উবাগারা"] = "byc", -- Ubaghara
["উবাং"] = "uba", -- Ubang
["উবি"] = "ubi", -- Ubi
["উবির"] = "ubr", -- Ubir
["উবাইখ"] = "uby", -- Ubykh
["উকায়ালি-ইউরুয়া আশেনিনকা"] = "cpb", -- Ucayali-Yurúa Ashéninka
["উডা"] = "uda", -- Uda
["উদি"] = "udi", -- Udi
["উদিহে"] = "ude", -- Udihe
["উদমুর্ত"] = "udm", -- Udmurt
["উডুক"] = "udu", -- Uduk
["উফিম"] = "ufi", -- Ufim
["উগান্ডান সাইন ল্যাঙ্গুয়েজ"] = "ugn", -- Ugandan Sign Language
["উগারিতিক"] = "uga", -- Ugaritic
["উগেলে"] = "uge", -- Ughele
["উহামি"] = "uha", -- Uhami
["উইসায়"] = "uis", -- Uisai
["উজীর"] = "udj", -- Ujir
["উকাআন"] = "kcf", -- Ukaan
["উখওয়েজো"] = "ukh", -- Ukhwejo
["উকিট"] = "umi", -- Ukit
["উকপে-বায়োবিরি"] = "ukp", -- Ukpe-Bayobiri
["উকপেট-এহোম"] = "akd", -- Ukpet-Ehom
["ইউক্রেনিয়ান"] = "uk", -- Ukrainian
["ইউক্রেনিয়ান সাইন ল্যাঙ্গুয়েজ"] = "ukl", -- Ukrainian Sign Language
["উকুই"] = "uku", -- Ukue
["উকুরিগুমা"] = "ukg", -- Ukuriguma
["উকওয়া"] = "ukq", -- Ukwa
["উকওয়ানি-আবো-নডোনি"] = "ukw", -- Ukwuani-Aboh-Ndoni
["উলাউ-সুয়াইন"] = "svb", -- Ulau-Suain
["উলচ"] = "ulc", -- Ulch
["উল্ডেমে"] = "udl", -- Uldeme
["উলিপিয়ান"] = "uli", -- Ulithian
["উল্লাটান"] = "ull", -- Ullatan
["উলুম্যান্দা'"] = "ulm", -- Ulumanda'
["উলওয়া"] = "ulw", -- Ulwa
["উমা"] = "ppk", -- Uma
["উমা' লাসান"] = "xky", -- Uma' Lasan
["উমা' লুং"] = "ulu", -- Uma' Lung
["উমানাকাইনা"] = "gdn", -- Umanakaina
["উমাটিলা"] = "uma", -- Umatilla
["উম্বিন্ধামু"] = "umd", -- Umbindhamu
["উমব্রিয়ান"] = "xum", -- Umbrian
["উম্বু-উঙ্গু"] = "ubu", -- Umbu-Ungu
["উম্বুগার্লা"] = "umr", -- Umbugarla
["উম্বুন্ডু"] = "umb", -- Umbundu
["উম্বুইগামু"] = "umg", -- Umbuygamu
["উমে সামি"] = "sju", -- Ume Sami
["উমেডা"] = "upi", -- Umeda
["উমিইডা"] = "xud", -- Umiida
["উমিরায় দুমাগেট আগটা"] = "due", -- Umiray Dumaget Agta
["উমন"] = "umm", -- Umon
["উমোতিনা"] = "umo", -- Umotína
["উম্পিলা"] = "ump", -- Umpila
["উনা"] = "mtg", -- Una
["উনামী"] = "unm", -- Unami
["উনদে কাইলি"] = "unz", -- Unde Kaili
["আনডিটার্মিন্ড"] = "und", -- Undetermined
["উনিয়াপা"] = "bbn", -- Uneapa
["উনেমে"] = "une", -- Uneme
["উনগারাংগু"] = "xun", -- Unggaranggu
["উনগমি"] = "xgu", -- Unggumi
["উনসেরডয়েচ"] = "uln", -- Unserdeutsch
["উনূয়া"] = "onu", -- Unua
["উনুবাহে"] = "unu", -- Unubahe
["উওখা"] = "uok", -- Uokha
["আপার চেহালিস"] = "cjh", -- Upper Chehalis
["আপার গ্র্যান্ড ভ্যালি ড্যানি"] = "dna", -- Upper Grand Valley Dani
["আপার কিনাবাতাংগান"] = "dmg", -- Upper Kinabatangan
["আপার কুসকোকউইম"] = "kuu", -- Upper Kuskokwim
["আপার নেকাক্সা টোটোনাক"] = "tku", -- Upper Necaxa Totonac
["আপার সোরবিয়ান"] = "hsb", -- Upper Sorbian
["আপার তা'ওইহ"] = "tth", -- Upper Ta'oih
["আপার তানানা"] = "tau", -- Upper Tanana
["আপার তারোমি"] = "tov", -- Upper Taromi
["আপার উম্পকুয়া"] = "xup", -- Upper Umpqua
["উরা (পাপুয়া নিউ গিনি)"] = "uro", -- Ura (Papua New Guinea)
["উরা (ভানুয়াটু)"] = "uur", -- Ura (Vanuatu)
["উরাধি"] = "urf", -- Uradhi
["উরাক লাওই'"] = "urk", -- Urak Lawoi'
["উরালি"] = "url", -- Urali
["উরাপমিন"] = "urm", -- Urapmin
["উরারিনা"] = "ura", -- Urarina
["উরারতিয়ান"] = "xur", -- Urartian
["উরাট"] = "urt", -- Urat
["উর্দু"] = "ur", -- Urdu
["উরহবো"] = "urh", -- Urhobo
["উরি"] = "uvh", -- Uri
["উরিগিনা"] = "urg", -- Urigina
["উরিম"] = "uri", -- Urim
["উরিমো"] = "urx", -- Urimo
["উরনিনগাং"] = "urc", -- Urningangg
["উরু"] = "ure", -- Uru
["উরু-ইউ-ওয়াউ-ওয়াউ"] = "urz", -- Uru-Eu-Wau-Wau
["উরু-পা-ইন"] = "urp", -- Uru-Pa-In
["উরুয়াংননিরিন"] = "urn", -- Uruangnirin
["উরুয়াভা"] = "urv", -- Uruava
["উরুবু-কাপোর"] = "urb", -- Urubú-Kaapor
["উরুগুয়েয়ান সাইন ল্যাঙ্গুয়েজ"] = "ugy", -- Uruguayan Sign Language
["উরুম"] = "uum", -- Urum
["উরুমী"] = "uru", -- Urumi
["উসাঘাদে"] = "usk", -- Usaghade
["উসান"] = "wnu", -- Usan
["উসারুফা"] = "usa", -- Usarufa
["উশোজো"] = "ush", -- Ushojo
["উসিলা চিনান্টেক"] = "cuc", -- Usila Chinantec
["উসপ্যান্টেকো"] = "usp", -- Uspanteco
["উসুই"] = "usi", -- Usui
["উটার্মবুং"] = "omo", -- Utarmbung
["উটে"] = "ute", -- Ute
["উটু"] = "utu", -- Utu
["উভবিয়ে"] = "evh", -- Uvbie
["উউইনমাইল"] = "aus-uwi", -- Uwinymil
["উয়ায়া"] = "usu", -- Uya
["উয়াজিটায়া"] = "duk", -- Uyajitaya
["উইঘুর"] = "ug", -- Uyghur
["উজবেক"] = "uz", -- Uzbek
["উজবেকি আরবি"] = "auz", -- Uzbeki Arabic
["উজেকওয়ে"] = "eze", -- Uzekwe
["ভাগরি বুলি"] = "vaa", -- Vaagri Booli
["ভাগরি"] = "vgr", -- Vaghri
["ভাগুয়া"] = "tva", -- Vaghua
["ভাগলা"] = "vag", -- Vagla
["ভাই"] = "vai", -- Vai
["ভাইফেই"] = "vap", -- Vaiphei
["ভালে"] = "vae", -- Vale
["ভালেন্সিয়ান সাইন ল্যাঙ্গুয়েজ"] = "vsv", -- Valencian Sign Language
["ভ্যালি ন্যাসিওনাল চিনান্টেক"] = "cvn", -- Valle Nacional Chinantec
["ভ্যালি মাইডু"] = "vmv", -- Valley Maidu
["ভালমান"] = "van", -- Valman
["ভালপেই"] = "vlp", -- Valpei
["ভামালে"] = "mkt", -- Vamale
["ভামে"] = "mlr", -- Vame
["ভানডালিক"] = "xvn", -- Vandalic
["ভানগুনু"] = "mpr", -- Vangunu
["ভানিওমো"] = "vam", -- Vanimo
["ভানজি"] = "ira-wnj", -- Vanji
["ভানুম"] = "vau", -- Vanuma
["ভাও"] = "vao", -- Vao
["ভারহাদি"] = "vah", -- Varhadi
["ভারিসি"] = "vrs", -- Varisi
["ভার্লি"] = "vav", -- Varli
["ভাসাভি"] = "vas", -- Vasavi
["ভায়ু"] = "vay", -- Vayu
["ভেদ্দা"] = "ved", -- Veddah
["ভেহেস"] = "val", -- Vehes
["ভেমগো-মাবাস"] = "vem", -- Vemgo-Mabas
["ভেন্ডা"] = "ve", -- Venda
["ভেনেটান"] = "vec", -- Venetan
["ভেনেটিক"] = "xve", -- Venetic
["ভেনেজুয়েলান সাইন ল্যাঙ্গুয়েজ"] = "vsl", -- Venezuelan Sign Language
["ভেনটুরেনো"] = "veo", -- Ventureño
["ভেপস"] = "vep", -- Veps
["ভেরা'আ"] = "vra", -- Vera'a
["ভেস্টিনিয়ান"] = "xvs", -- Vestinian
["ভিদুন্ডা"] = "vid", -- Vidunda
["ভিয়েমো"] = "vig", -- Viemo
["ভিয়েতনামী"] = "vi", -- Vietnamese
["ভিলামোভিয়ান"] = "wym", -- Vilamovian
["ভিলেলা"] = "vil", -- Vilela
["ভিলি"] = "vif", -- Vili
["ভিলা ভিসিয়োসা আগটা"] = "dyg", -- Villa Viciosa Agta
["ভিন্সেন্টিয়ান ক্রেওল ইংলিশ"] = "svc", -- Vincentian Creole English
["ভার্জিন আইল্যান্ডস ক্রেওল"] = "vic", -- Virgin Islands Creole
["ভিসাভান"] = "vis", -- Vishavan
["ভিটি"] = "vit", -- Viti
["ভিটোউ"] = "vto", -- Vitou
["ভিয়ো"] = "gev", -- Viya
["ভ্ল্যাক্স রোমানি"] = "rmy", -- Vlax Romani
["ভোলাপুক"] = "vo", -- Volapük
["ভলগা জার্মান"] = "gmw-vog", -- Volga German
["ভোলসিয়ান"] = "xvo", -- Volscian
["ভোনো"] = "kch", -- Vono
["ভোরো"] = "vor", -- Voro
["ভোতিক"] = "vot", -- Votic
["ভুম্বু"] = "vum", -- Vumbu
["ভুনাপু"] = "vnp", -- Vunapu
["ভুনজো"] = "vun", -- Vunjo
["ভুরেশ"] = "msn", -- Vurës
["ভুটে"] = "vut", -- Vute
["ভোরো"] = "vro", -- Võro
["ওয়া"] = "wbm", -- Wa
["ওয়া'এমা"] = "wag", -- Wa'ema
["ওয়াআমা"] = "wwa", -- Waama
["ওয়াআমওয়াং"] = "wmn", -- Waamwang
["ওয়াব"] = "wab", -- Wab
["ওয়াবো"] = "wbb", -- Wabo
["ওয়াবোডা"] = "kmx", -- Waboda
["ওয়াচি গ্বে"] = "wci", -- Waci Gbe
["ওয়াডাগিনাম"] = "wdg", -- Wadaginam
["ওয়াডার"] = "wbq", -- Waddar
["ওয়াডি ওয়াডি"] = "xwd", -- Wadi Wadi
["ওয়াডিয়ারা কোলি"] = "kxp", -- Wadiyara Koli
["ওয়াডজাবাংগাই"] = "wdy", -- Wadjabangayi
["ওয়াডজিগিনি"] = "wdj", -- Wadjiginy
["ওয়াডজিগু"] = "wdu", -- Wadjigu
["ওয়াই রানা"] = "wrx", -- Wae Rana
["ওয়াফা"] = "waj", -- Waffa
["ওয়াগাওয়াগা"] = "wgb", -- Wagawaga
["ওয়াগায়া"] = "wga", -- Wagaya
["ওয়াগদি"] = "wbr", -- Wagdi
["ওয়াগেমান"] = "waq", -- Wageman
["ওয়াগি"] = "fad", -- Wagi
["ওয়াহাউ কায়ান"] = "whu", -- Wahau Kayan
["ওয়াহাউ কেনিয়াহ"] = "whk", -- Wahau Kenyah
["ওয়াহগি"] = "wgi", -- Wahgi
["ওয়াইগালি"] = "wbk", -- Waigali
["ওয়াইগেও"] = "wgo", -- Waigeo
["ওয়াইকুরি"] = "nai-wai", -- Waikuri
["ওয়াইলাকি"] = "wlk", -- Wailaki
["ওয়াইলাপা"] = "wlr", -- Wailapa
["ওয়াইমা'আ"] = "wmh", -- Waima'a
["ওয়াইমাহা"] = "bao", -- Waimaha
["ওয়াইমিরি-আত্রোয়ারি"] = "atr", -- Waimiri-Atroari
["ওয়াইনুম"] = "awd-wai", -- Wainumá
["ওয়াইওলি"] = "wli", -- Waioli
["ওয়াইতাকা"] = "sai-wai", -- Waitaká
["ওয়াইওয়াই"] = "waw", -- Waiwai
["ওয়াজা"] = "wja", -- Waja
["ওয়াজারি"] = "wbv", -- Wajarri
["ওয়াজুক"] = "xwj", -- Wajuk
["ওয়াকা"] = "wav", -- Waka
["ওয়াকাওয়াকা"] = "wkw", -- Wakawaka
["ওয়াখি"] = "wbl", -- Wakhi
["ওয়াকোনা"] = "waf", -- Wakoná
["ওয়ালা"] = "lgl", -- Wala
["ওয়ালাক"] = "wlw", -- Walak
["ওয়ালাংগামা"] = "nlw", -- Walangama
["ওয়ালি (ঘানা)"] = "wlx", -- Wali (Ghana)
["ওয়ালি (সুদান)"] = "wll", -- Wali (Sudan)
["ওয়ালিং"] = "wly", -- Waling
["ওয়ালিয়ো"] = "wla", -- Walio
["ওয়াল্লা ওয়াল্লা"] = "waa", -- Walla Walla
["ওয়ালিসিয়ান"] = "wls", -- Wallisian
["ওয়ালুন"] = "wa", -- Walloon
["ওয়ালমাজারি"] = "wmt", -- Walmajarri
["ওয়াম"] = "wmo", -- Wam
["ওয়ামাস"] = "wmc", -- Wamas
["ওয়ামবায়া"] = "wmb", -- Wambaya
["ওয়াম্বোন"] = "wms", -- Wambon
["ওয়াম্বুলে"] = "wme", -- Wambule
["ওয়ামে"] = "cou", -- Wamey
["ওয়ামিন"] = "wmi", -- Wamin
["ওয়াম্পার"] = "lbq", -- Wampar
["ওয়াম্পুর"] = "waz", -- Wampur
["ওয়ান"] = "wan", -- Wan
["ওয়ানাম্ব্রে"] = "wnb", -- Wanambre
["ওয়ানাপ"] = "wnp", -- Wanap
["ওয়ানচো"] = "nnp", -- Wancho
["ওয়ান্ডা"] = "wbh", -- Wanda
["ওয়ান্ডালা"] = "mfi", -- Wandala
["ওয়ান্ডামেন"] = "wad", -- Wandamen
["ওয়ান্ডারং"] = "wnd", -- Wandarang
["ওয়ান্ডজি"] = "wdd", -- Wandji
["ওয়ানেসি"] = "wne", -- Waneci
["ওয়ানগা"] = "lwg", -- Wanga
["ওয়াংগামালা"] = "wnm", -- Wanggamala
["ওয়াংগাংগুরু"] = "wgg", -- Wangganguru
["ওয়াংগোম"] = "wng", -- Wanggom
["ওয়াংকায়ুটিয়ুরু"] = "wky", -- Wangkayutyuru
["ওয়াংকুমারা"] = "xwk", -- Wangkumara
["ওয়ানহাম"] = "sai-wnm", -- Wanham
["ওয়ানজি"] = "wbi", -- Wanji
["ওয়ানমান"] = "wbt", -- Wanman
["ওয়ান্নু"] = "jub", -- Wannu
["ওয়ানো"] = "wno", -- Wano
["ওয়ানটোয়াট"] = "wnc", -- Wantoat
["ওয়ানুকাকা"] = "wnk", -- Wanukaka
["ওয়ানি"] = "wny", -- Wanyi
["ওয়ানে"] = "hwa", -- Wané
["ওয়াপান"] = "juk", -- Wapan
["ওয়াপিশানা"] = "wap", -- Wapishana
["ওয়াপ্পো"] = "wao", -- Wappo
["ওয়ার-জাইনতিয়া"] = "aml", -- War-Jaintia
["ওয়ারা"] = "wbf", -- Wara
["ওয়ারাও"] = "wba", -- Warao
["ওয়ারাফু"] = "wra", -- Warapu
["ওয়ারে সোরসোগন"] = "srv", -- Waray Sorsogon
["ওয়ারে-ওয়ারে"] = "war", -- Waray-Waray
["ওয়ারডামান"] = "wrr", -- Wardaman
["ওয়ারডান্দি"] = "wxw", -- Wardandi
["ওয়ারেকেনা"] = "gae", -- Warekena
["ওয়ারেম্বোরি"] = "wsa", -- Warembori
["ওয়ারি'"] = "pav", -- Wari'
["ওয়ারিস"] = "wrs", -- Waris
["ওয়ারিটাই"] = "wbe", -- Waritai
["ওয়ারিয়াংগা"] = "wri", -- Wariyangga
["ওয়ারজি"] = "wji", -- Warji
["ওয়ার্কায়-বিপিএম"] = "bgv", -- Warkay-Bipim
["ওয়ার্লম্যানপা"] = "wrl", -- Warlmanpa
["ওয়ার্লপিরি"] = "wbp", -- Warlpiri
["ওয়ার্লুয়ারা"] = "wrb", -- Warluwara
["ওয়ারনাং"] = "wrn", -- Warnang
["ওয়ারোপেন"] = "wrp", -- Waropen
["ওয়াররা"] = "wrz", -- Warray
["ওয়ার্গামাই"] = "wgy", -- Warrgamay
["ওয়ারওয়া"] = "wwr", -- Warrwa
["ওয়ারু"] = "wru", -- Waru
["ওয়ারুমুংগু"] = "wrm", -- Warumungu
["ওয়ারুনা"] = "wrv", -- Waruna
["ওয়ারুংগু"] = "wrg", -- Warungu
["ওয়ারওয়ার ফেনী"] = "hrw", -- Warwar Feni
["ওয়াসা"] = "wss", -- Wasa
["ওয়াসকো-উইশরাম"] = "wac", -- Wasco-Wishram
["ওয়াসেম্বো"] = "gsp", -- Wasembo
["ওয়াশো"] = "was", -- Washo
["ওয়াস্কিয়া"] = "wsk", -- Waskia
["ওয়াস্টেক"] = "hus", -- Wastek
["ওয়াসু"] = "wsu", -- Wasu
["ওয়াতাকাটউই"] = "wtk", -- Watakataui
["ওয়াতাম"] = "wax", -- Watam
["ওয়াথাউরং"] = "wth", -- Wathaurong
["ওয়াতিওয়া"] = "wtf", -- Watiwa
["ওয়াতুবেলা"] = "wah", -- Watubela
["ওয়াবে"] = "kop", -- Waube
["ওয়াউজা"] = "wau", -- Wauja
["ওয়াউইয়াই"] = "wuy", -- Wauyai
["ওয়াওয়া"] = "www", -- Wawa
["ওয়াওনি"] = "wow", -- Wawonii
["ওয়াক্সিয়াং"] = "wxa", -- Waxiang
["ওয়ায়াম্পি"] = "oym", -- Wayampi
["ওয়ায়ানা"] = "way", -- Wayana
["ওয়ায়ানাদ চেটি"] = "ctt", -- Wayanad Chetti
["ওয়ায়োরো"] = "wyr", -- Wayoró
["ওয়ায়ুমারা"] = "sai-way", -- Wayumara
["ওয়ায়ু"] = "guc", -- Wayuu
["ওয়েডাউ"] = "wed", -- Wedau
["ওয়েহ"] = "weh", -- Weh
["ওয়েলাউং"] = "weu", -- Welaung
["ওয়েলিকি"] = "klh", -- Weliki
["ওয়েলশ"] = "cy", -- Welsh
["ওয়েলশ রোমানি"] = "rmw", -- Welsh Romani
["ওয়েমালে"] = "weo", -- Wemale
["ওয়েম্বা-ওয়েম্বা"] = "xww", -- Wemba-Wemba
["ওয়েমে গ্বে"] = "wem", -- Weme Gbe
["ওয়েন্ডাত"] = "wdt", -- Wendat
["উইরি"] = "wer", -- Weri
["ওয়ার্সিং"] = "kvw", -- Wersing
["পশ্চিম আলবে বিকল"] = "fbl", -- West Albay Bikol
["পশ্চিম আম্বা"] = "nnd", -- West Ambae
["পশ্চিম সেন্ট্রাল বান্ডা"] = "bbp", -- West Central Banda
["পশ্চিম কোস্ট বাজাও"] = "bdr", -- West Coast Bajau
["পশ্চিম ডামার"] = "drn", -- West Damar
["পশ্চিম ফ্লেমিশ"] = "vls", -- West Flemish
["পশ্চিম ফ্রিজিয়ান"] = "fy", -- West Frisian
["পশ্চিম গ্রিনল্যান্ডিক পিজিন"] = "crp-gep", -- West Greenlandic Pidgin
["পশ্চিম লেম্বাতা"] = "lmj", -- West Lembata
["পশ্চিম মাকিয়ান"] = "mqs", -- West Makian
["পশ্চিম মাসেলা"] = "mss", -- West Masela
["পশ্চিম তারানগান"] = "txn", -- West Tarangan
["পশ্চিম উভেয়ান"] = "uve", -- West Uvean
["পশ্চিম-সেন্ট্রাল লিম্বা"] = "lia", -- West-Central Limba
["পশ্চিমি আপাচি"] = "apw", -- Western Apache
["পশ্চিমি আরের্নটে"] = "are", -- Western Arrernte
["পশ্চিমি বলিভিয়ান গুয়ারানি"] = "gnw", -- Western Bolivian Guaraní
["পশ্চিমি ব্রু"] = "brv", -- Western Bru
["পশ্চিমি বুকিডনন মানোবো"] = "mbb", -- Western Bukidnon Manobo
["পশ্চিমি চাম"] = "cja", -- Western Cham
["পশ্চিমি ড্যানি"] = "dnw", -- Western Dani
["পশ্চিমি ডুরাঙ্গো নাহুয়াতল"] = "azn", -- Western Durango Nahuatl
["পশ্চিমি ফিজিয়ান"] = "wyy", -- Western Fijian
["পশ্চিমি গুরুং"] = "gvr", -- Western Gurung
["পশ্চিমি হাইল্যান্ড চ্যাটিনো"] = "ctp", -- Western Highland Chatino
["পশ্চিমি হুয়াস্তেকা নাহুয়াতল"] = "nhw", -- Western Huasteca Nahuatl
["পশ্চিমি জিকাকুয়ে"] = "nai-wji", -- Western Jicaque
["পশ্চিমি জুক্সট্লাহুয়াকা মিক্সটেক"] = "jmx", -- Western Juxtlahuaca Mixtec
["পশ্চিমি কারাবোরো"] = "kza", -- Western Karaboro
["পশ্চিমি কাতু"] = "kuf", -- Western Katu
["পশ্চিমি কায়াহ"] = "kyu", -- Western Kayah
["পশ্চিমি কেরেস"] = "kjq", -- Western Keres
["পশ্চিমি ক্রাহন"] = "krw", -- Western Krahn
["পশ্চিমি লালু"] = "ywl", -- Western Lalu
["পশ্চিমি লাওয়া"] = "lcp", -- Western Lawa
["পশ্চিমি মাগার"] = "mrd", -- Western Magar
["পশ্চিমি মানিংকান"] = "mlq", -- Western Maninkakan
["পশ্চিমি মারি"] = "mrj", -- Western Mari
["পশ্চিমি মাশান হ্মং"] = "hmw", -- Western Mashan Hmong
["পশ্চিমি মেওহাং"] = "raf", -- Western Meohang
["পশ্চিমি মুরিয়া"] = "mut", -- Western Muria
["পশ্চিমি নিও-আরামাইক"] = "amw", -- Western Neo-Aramaic
["পশ্চিমি ওজিবওয়া"] = "ojw", -- Western Ojibwa
["পশ্চিমি পারবাতে খাম"] = "kjl", -- Western Parbate Kham
["পশ্চিমি পেনান"] = "pne", -- Western Penan
["পশ্চিমি পও"] = "pwo", -- Western Pwo
["পশ্চিমি সিইসলা"] = "ssl", -- Western Sisaala
["পশ্চিমি সুবানন"] = "suc", -- Western Subanon
["পশ্চিমি তামাঙ্গ"] = "tdg", -- Western Tamang
["পশ্চিমি টাউবুইড"] = "twb", -- Western Tawbuid
["পশ্চিমি টোটোনাক"] = "tqt", -- Western Totonac
["পশ্চিমি তুনেবো"] = "tnb", -- Western Tunebo
["পশ্চিমি জিয়াংসি মিয়াও"] = "mmr", -- Western Xiangxi Miao
["পশ্চিমি খউলা গ্বে"] = "xwl", -- Western Xwla Gbe
["পশ্চিমি ইয়ুগুর"] = "ybe", -- Western Yugur
["ওয়েওয়াউ"] = "wea", -- Wewaw
["ওয়েউয়া"] = "wew", -- Weyewa
["ওয়েয়তো"] = "woy", -- Weyto
["হোয়াইট গেলাও"] = "gir", -- White Gelao
["হোয়াইট হ্মং"] = "mww", -- White Hmong
["হোয়াইট লাচি"] = "lwh", -- White Lachi
["হোয়াইটসেন্ডস"] = "tnp", -- Whitesands
["উইয়ারুমুস"] = "tua", -- Wiarumus
["উইচিটা"] = "wic", -- Wichita
["উইচি ল্যাম্টেস গুয়িসনে"] = "mzh", -- Wichí Lhamtés Güisnay
["উইচি ল্যাম্টেস নকটেন"] = "mtp", -- Wichí Lhamtés Nocten
["উইচি ল্যাম্টেস ভেজোজ"] = "wlv", -- Wichí Lhamtés Vejoz
["উইক-ইপা"] = "wie", -- Wik-Epa
["উইক-ইয়িয়ান"] = "wij", -- Wik-Iiyanh
["উইক-কেইয়াবাগান"] = "wif", -- Wik-Keyangan
["উইক-মে'আনহা"] = "wih", -- Wik-Me'anha
["উইক-মুংকান"] = "wim", -- Wik-Mungkan
["উইক-নগাটানা"] = "wig", -- Wik-Ngathana
["উইকালকান"] = "wik", -- Wikalkan
["উইকngen্চেরা"] = "wua", -- Wikngenchera
["উইলাভিলা"] = "wil", -- Wilawila
["উইন্নেবাগো"] = "win", -- Winnebago
["উইনটু"] = "wnw", -- Wintu
["উইনি"] = "kst", -- Winyé
["উইপি"] = "gdr", -- Wipi
["উইরাজুরি"] = "wrh", -- Wiradjuri
["উইরাফ্যাড"] = "wir", -- Wiraféd
["উইরাঙ্গু"] = "wgu", -- Wirangu
["উইরু"] = "wiu", -- Wiru
["উইরো"] = "wpc", -- Wirö
["উইওয়া"] = "mbp", -- Wiwa
["উইয়োট"] = "wiy", -- Wiyot
["ওবে"] = "wob", -- Wobé
["ওকন"] = "xwc", -- Woccon
["ওগামুসিন"] = "wog", -- Wogamusin
["ওগেও"] = "woc", -- Wogeo
["ওই"] = "wbw", -- Woi
["ওইওউর্রুং"] = "wyi", -- Woiwurrung
["ওজেনাকা"] = "jod", -- Wojenaka
["ওলানে"] = "wle", -- Wolane
["ওলানি"] = "wod", -- Wolani
["ওলায়েট্টা"] = "wal", -- Wolaytta
["ওলেইয়ান"] = "woe", -- Woleaian
["ওলিও"] = "wlo", -- Wolio
["ওলোফ"] = "wo", -- Wolof
["ওমো"] = "wmx", -- Womo
["ওং-গিই"] = "aus-won", -- Wong-gie
["ওংগো"] = "won", -- Wongo
["উডস ক্রি"] = "cwd", -- Woods Cree
["ওয়ারিয়া"] = "wor", -- Woria
["ওরিমি"] = "kda", -- Worimi
["ওরোডুগু"] = "jud", -- Worodougou
["ওরোরা"] = "wro", -- Worora
["ওটাপুরি-কাটারকালাই"] = "wsv", -- Wotapuri-Katarqalai
["ওটু"] = "wtw", -- Wotu
["ওউন মেইউ"] = "noa", -- Woun Meu
["লিখিত ওইরাত"] = "xwo", -- Written Oirat
["উ"] = "wuu", -- Wu
["উডু"] = "wud", -- Wudu
["উহুয়ান"] = "mis-wuh", -- Wuhuan
["উয়েলগুরু"] = "aus-wul", -- Wulguru
["উলিউলি"] = "wlu", -- Wuliwuli
["উলনা"] = "wux", -- Wulna
["উম্বোকো"] = "bqm", -- Wumboko
["উম্বুভু"] = "wum", -- Wumbvu
["উমং"] = "ywu", -- Wumeng
["উনাই বুনু"] = "bwn", -- Wunai Bunu
["উনম্বাল"] = "wub", -- Wunambal
["উর্রু"] = "wur", -- Wurrugu
["উসা"] = "yig", -- Wusa
["উশি"] = "bse", -- Wushi
["উসি"] = "wsi", -- Wusi
["উটং"] = "wut", -- Wutung
["উটুনহুয়া"] = "wuh", -- Wutunhua
["উভুলু-আউয়া"] = "wuv", -- Wuvulu-Aua
["উয়ানডট"] = "wya", -- Wyandot
["ওয়ারা"] = "tci", -- Wára
["ওয়াংফা"] = "juw", -- Wãpha
["ওয়ে সাদার্ন"] = "gxx", -- Wè Southern
["ওয়ে পশ্চিমি"] = "wec", -- Wè Western
["ক্সাদানি জাপোটেক"] = "zax", -- Xadani Zapotec
["ক্সাক্রিয়াবা"] = "xkr", -- Xakriabá
["ক্সামতঙ্গা"] = "xan", -- Xamtanga
["ক্সানাগুইয়া জাপোটেক"] = "ztg", -- Xanaguía Zapotec
["ক্সাভান্তে"] = "xav", -- Xavante
["ক্সেরেন্তে"] = "xer", -- Xerénte
["ক্সেটা"] = "xet", -- Xetá
["ক্সহোসা"] = "xh", -- Xhosa
["জিয়ানবেই"] = "mis-xbi", -- Xianbei
["জিয়াং"] = "hsn", -- Xiang
["ক্সিবে"] = "sjo", -- Xibe
["ক্সিকোটেপেক দে জুয়ারেজ টোটোনাক"] = "too", -- Xicotepec de Juárez Totonac
["ক্সিনকা"] = "xin", -- Xinca
["ক্সিংগু আসুরিনি"] = "asn", -- Xingú Asuriní
["ক্সিওঙ্গনু"] = "mis-xnu", -- Xiongnu
["ক্সিপায়া"] = "xiy", -- Xipaya
["ক্সিরি"] = "xii", -- Xiri
["ক্সিরিয়ানা"] = "xir", -- Xiriâna
["ক্সিশানবা লালু"] = "ywt", -- Xishanba Lalo
["ক্সোকো"] = "sai-xoc", -- Xocó
["ক্সোকলেং"] = "xok", -- Xokleng
["ক্সুকুরু"] = "xoo", -- Xukurú
["ক্সওয়েলা গ্বে"] = "xwe", -- Xwela Gbe
["ক্সারাচুউ"] = "ane", -- Xârâcùù
["ক্সারাগুরে"] = "axx", -- Xârâgurè
["ইয়া"] = "iyx", -- Yaa
["য়াকু"] = "muu", -- Yaaku
["য়াবরানা"] = "yar", -- Yabarana
["য়াবানা"] = "ybn", -- Yabaâna
["য়াবেন"] = "ybm", -- Yaben
["য়াবং"] = "ybo", -- Yabong
["য়াবুলা য়াবুলা"] = "yxy", -- Yabula Yabula
["য়াসে"] = "ekr", -- Yace
["য়ায়েয়ামা"] = "rys", -- Yaeyama
["য়াফি"] = "wfg", -- Yafi
["য়াগারা"] = "yxg", -- Yagara
["য়াগারিয়া"] = "ygr", -- Yagaria
["য়াগ্নোবি"] = "yai", -- Yagnobi
["য়াগোমি"] = "ygm", -- Yagomi
["য়াগুয়া"] = "yad", -- Yagua
["য়াগওইয়া"] = "ygw", -- Yagwoia
["য়াহাদিয়ান"] = "ner", -- Yahadian
["য়াহাং"] = "rhp", -- Yahang
["য়াহুনা"] = "ynu", -- Yahuna
["য়াকা"] = "yaf", -- Yaka
["য়াকাইকেকে"] = "ykk", -- Yakaikeke
["য়াকান"] = "yka", -- Yakan
["য়াকিমা"] = "yak", -- Yakima
["য়াক্খা"] = "ybh", -- Yakkha
["য়াকোমা"] = "yky", -- Yakoma
["য়াকুট"] = "sah", -- Yakut
["য়ালা"] = "yba", -- Yala
["য়ালাহাতান"] = "jal", -- Yalahatan
["য়ালকালোরে"] = "xyl", -- Yalakalore
["য়ালার্নগা"] = "ylr", -- Yalarnnga
["য়ালে"] = "nce", -- Yale
["য়ালেবা"] = "ylb", -- Yaleba
["য়ালুনকা"] = "yal", -- Yalunka
["য়ালাল্যাগ জাপোটেক"] = "zpu", -- Yalálag Zapotec
["য়ামাপ"] = "ymp", -- Yamap
["য়াম্বা"] = "yam", -- Yamba
["য়াম্বেস"] = "ymb", -- Yambes
["য়াম্বেটা"] = "yat", -- Yambeta
["য়াম্ডেনা"] = "jmd", -- Yamdena
["য়ামেও"] = "yme", -- Yameo
["য়ামি"] = "tao", -- Yami
["য়ামিনাহুয়া"] = "yaa", -- Yaminahua
["য়ামোনগেরি"] = "ymg", -- Yamongeri
["য়াম্পু"] = "ybi", -- Yamphu
["ইয়ান-নাহু"] = "jay", -- Yan-nhangu
["য়ানা"] = "ynn", -- Yana
["য়ান্ডা"] = "yda", -- Yanda
["য়ান্ডা ডোগন"] = "dym", -- Yanda Dogon
["য়ান্ডজিবারা"] = "xyb", -- Yandjibara
["য়ান্ডরুয়ান্ধা"] = "ynd", -- Yandruwandha
["য়ানেসা'"] = "ame", -- Yanesha'
["য়াংবেন"] = "yav", -- Yangben
["ইয়াংকাল"] = "aus-ynk", -- Yangkaal
["য়াংগাম"] = "bsx", -- Yangkam
["য়াংম্যান"] = "jng", -- Yangman
["য়াংগো"] = "yng", -- Yango
["য়াংগুলাম"] = "ynl", -- Yangulam
["য়াংগুম দে"] = "yde", -- Yangum Dey
["য়াংগুম গেল"] = "ygl", -- Yangum Gel
["য়াংগুম মন"] = "ymo", -- Yangum Mon
["য়ানকুনিউটিজারা"] = "kdd", -- Yankunytjatjara
["য়ানোম্যাম"] = "wca", -- Yanomam
["য়ানোম্যামো"] = "guu", -- Yanomamö
["য়ানসি"] = "yns", -- Yansi
["ইয়ানইউওয়া"] = "jao", -- Yanyuwa
["য়াও"] = "yao", -- Yao
["য়াও (দক্ষিণ আমেরিকা)"] = "sai-yao", -- Yao (South America)
["য়াওসাকোর আসমাত"] = "asy", -- Yaosakor Asmat
["য়াউরে"] = "yre", -- Yaouré
["য়াপেস"] = "yap", -- Yapese
["য়াপুন্দা"] = "yev", -- Yapunda
["য়াকয়"] = "jaq", -- Yaqay
["য়াকুই"] = "yaq", -- Yaqui
["য়ারাওয়াটা"] = "yrw", -- Yarawata
["য়ারেবা"] = "yrb", -- Yareba
["য়ারেণি জাপোটেক"] = "zae", -- Yareni Zapotec
["য়ার্লি"] = "yxl", -- Yarli
["য়ার্লুইয়ান্দি"] = "yry", -- Yarluyandi
["য়ারুমা"] = "sai-yar", -- Yarumá
["য়ারি"] = "yri", -- Yarí
["য়াসা"] = "yko", -- Yasa
["য়াতাই"] = "yty", -- Yatay
["য়াতী জাপোটেক"] = "zty", -- Yatee Zapotec
["য়াতজাচি জাপোটেক"] = "zav", -- Yatzachi Zapotec
["য়াউল"] = "yla", -- Yaul
["য়াউর"] = "jau", -- Yaur
["য়াউটেপেক জাপোটেক"] = "zpb", -- Yautepec Zapotec
["য়াভিতেড়ো"] = "yvt", -- Yavitero
["য়াওয়া"] = "yva", -- Yawa
["য়াবালাপিতী"] = "yaw", -- Yawalapití
["য়াওয়ানাওয়া"] = "ywn", -- Yawanawa
["য়াওয়ারাবার্গা"] = "yww", -- Yawarawarga
["য়াওয়েইউহা"] = "yby", -- Yaweyuha
["য়াউইজিবায়া"] = "jbw", -- Yawijibaya
["য়াভিয়ো"] = "ybx", -- Yawiyo
["য়াউরু"] = "ywr", -- Yawuru
["য়াইগির"] = "xya", -- Yaygir
["য়াজঘুলামি"] = "yah", -- Yazghulami
["ইয়ে'কুয়ানা"] = "mch", -- Ye'kwana
["ইয়েই"] = "jei", -- Yei
["ইয়েখে"] = "ets", -- Yekhee
["ইয়েকোরা"] = "ykr", -- Yekora
["ইয়েলে"] = "yle", -- Yele
["ইয়েল্মেক"] = "jel", -- Yelmek
["ইয়েলোগু"] = "ylg", -- Yelogu
["ইয়েম্যাক"] = "hmk", -- Yemaek
["ইয়েম্বা"] = "ybb", -- Yemba
["ইয়েমেনী আরবি"] = "ayn", -- Yemeni Arabic
["ইয়েমসা"] = "jnj", -- Yemsa
["য়েন্ডাং"] = "yen", -- Yendang
["য়েনি"] = "yei", -- Yeni
["য়েনিশ"] = "yec", -- Yenish
["য়েরাকাই"] = "yra", -- Yerakai
["য়েরেটুআর"] = "gop", -- Yeretuar
["য়েরং"] = "yrn", -- Yerong
["য়েরুকুল"] = "yeu", -- Yerukula
["য়েশকওয়া"] = "yes", -- Yeskwa
["য়েশান-মায়ো"] = "yss", -- Yessan-Mayo
["য়েটফা"] = "yet", -- Yetfa
["ইয়েভানিক"] = "yej", -- Yevanic
["ইয়েয়ি"] = "yey", -- Yeyi
["য়িডিশ"] = "yi", -- Yiddish
["য়িডঘা"] = "ydg", -- Yidgha
["য়িডিনি"] = "yii", -- Yidiny
["য়িল"] = "yll", -- Yil
["য়িলান ক্রেওল"] = "ycr", -- Yilan Creole
["য়িমাস"] = "yee", -- Yimas
["য়িমচুংরু নাগা"] = "yim", -- Yimchungru Naga
["য়িনবাও কারেন"] = "kvu", -- Yinbaw Karen
["য়িনচিয়া"] = "yin", -- Yinchia
["য়িন্ডজিবার্নডি"] = "yij", -- Yindjibarndi
["য়িন্ডজিলান্দি"] = "yil", -- Yindjilandji
["য়িনে"] = "pib", -- Yine
["য়িন্গার্ডা"] = "yia", -- Yinggarda
["য়িনহাওয়াংগা"] = "ywg", -- Yinhawangka
["য়িনিনগায়ি"] = "ygi", -- Yiningayi
["য়িনতালে কারেন"] = "kvy", -- Yintale Karen
["য়িনউম"] = "yxm", -- Yinwum
["য়ির-য়োরন্ট"] = "yiy", -- Yir-Yoront
["য়িরানডালি"] = "ljw", -- Yirandali
["য়িস"] = "yis", -- Yis
["য়িথা য়িথা"] = "xth", -- Yitha Yitha
["য়োবা"] = "yob", -- Yoba
["য়োকোবুয়ে দিডা"] = "gud", -- Yocoboué Dida
["য়োগাদ"] = "yog", -- Yogad
["য়োইডিক"] = "ydk", -- Yoidik
["য়োকে"] = "yki", -- Yoke
["য়োলা"] = "yol", -- Yola
["য়োল্মো"] = "scp", -- Yolmo
["য়োলঙ্গু সাইন ল্যাঙ্গুয়েজ"] = "ygs", -- Yolngu Sign Language
["য়োলোক্সোচিটেল মিক্সটেক"] = "xty", -- Yoloxochitl Mixtec
["য়োম"] = "pil", -- Yom
["য়োম্বে"] = "yom", -- Yombe
["য়োনাগুনি"] = "yoi", -- Yonaguni
["য়োং"] = "yno", -- Yong
["য়োংকম"] = "yon", -- Yongkom
["য়োপনো"] = "yut", -- Yopno
["য়োরা"] = "mts", -- Yora
["য়োরোন"] = "yox", -- Yoron
["য়োর্তা য়োর্তা"] = "xyy", -- Yorta Yorta
["য়োরুবা"] = "yo", -- Yoruba
["য়োসোনডুয়া মিক্সটেক"] = "mpm", -- Yosondúa Mixtec
["য়োউলে জিনো"] = "jiu", -- Youle Jino
["য়োউনুও বুনু"] = "buh", -- Younuo Bunu
["য়োউট ওয়াম"] = "ytw", -- Yout Wam
["য়োয়"] = "yoy", -- Yoy
["য়ুয়াংগা"] = "nua", -- Yuanga
["য়ুকাটেক মায়া"] = "yua", -- Yucatec Maya
["য়ুকাটেক মায়া সাইন ল্যাঙ্গুয়েজ"] = "msd", -- Yucatec Maya Sign Language
["য়ুচি"] = "yuc", -- Yuchi
["য়ুকুয়ানে মিক্সটেক"] = "mvg", -- Yucuañe Mixtec
["য়ুকুন"] = "ycn", -- Yucuna
["য়ুগ"] = "yug", -- Yug
["য়ুগাম্বাল"] = "yub", -- Yugambal
["য়ুগোস্লাভিয়ান সাইন ল্যাঙ্গুয়েজ"] = "ysl", -- Yugoslavian Sign Language
["য়ুগুল"] = "ygu", -- Yugul
["য়ুহুপ"] = "yab", -- Yuhup
["য়ুকি"] = "yuk", -- Yuki
["য়ুকপা"] = "yup", -- Yukpa
["য়ুকুবেন"] = "ybl", -- Yukuben
["য়ুলু"] = "yul", -- Yulu
["য়ুমা"] = "yum", -- Yuma
["য়ুমানা"] = "awd-yum", -- Yumana
["য়ুপ'িক"] = "esu", -- Yup'ik
["য়ুপিল্টেপেকুয়ে"] = "nai-yup", -- Yupiltepeque
["য়ুপুয়া"] = "sai-yup", -- Yupua
["য়ুকুই"] = "yuq", -- Yuqui
["য়ুরাকারে"] = "yuz", -- Yuracare
["য়ুরি"] = "sai-yri", -- Yuri
["য়ুরোক"] = "yur", -- Yurok
["য়ুরু"] = "ljx", -- Yuru
["য়ুরুমাংগুই"] = "sai-yur", -- Yurumanguí
["য়ুরুতি"] = "yui", -- Yurutí
["য়ুটানডুচি মিক্সটেক"] = "mab", -- Yutanduchi Mixtec
["য়ুওয়ানা"] = "yau", -- Yuwana
["য়ুয়ু"] = "yxu", -- Yuyu
["য়ামানা"] = "yag", -- Yámana
["জাআচিলা জাপোটেক"] = "ztx", -- Zaachila Zapotec
["জাবানা"] = "kji", -- Zabana
["জাকাটেপেক চ্যাটিনো"] = "ctz", -- Zacatepec Chatino
["জাকাটলান-আহুয়াকাতলান-তেপেৎজিন্টলা নাহুয়াতল"] = "nhi", -- Zacatlán-Ahuacatlán-Tepetzintla Nahuatl
["জাঘাওয়া"] = "zag", -- Zaghawa
["জাইওয়া"] = "atb", -- Zaiwa
["জাখরিং"] = "zkr", -- Zakhring
["জাম্বিয়ান সাইন ল্যাঙ্গুয়েজ"] = "zsl", -- Zambian Sign Language
["জান গুলা"] = "zna", -- Zan Gula
["জানাকি"] = "zak", -- Zanaki
["জান্দে"] = "zne", -- Zande
["জান্সকারি"] = "zau", -- Zangskari
["জাংওয়াল"] = "zah", -- Zangwal
["জানিজা জাপোটেক"] = "zpw", -- Zaniza Zapotec
["জাপোটেক"] = "zap", -- Zapotec
["জারামো"] = "zaj", -- Zaramo
["জারি"] = "zaz", -- Zari
["জার্মা"] = "dje", -- Zarma
["জাউজউ"] = "zal", -- Zauzou
["জাই"] = "zwa", -- Zay
["জাইইন কারেন"] = "kxk", -- Zayein Karen
["জাইসে-জের্গুলা"] = "zay", -- Zayse-Zergulla
["জাজাকি"] = "zza", -- Zazaki
["জাজাও"] = "jaj", -- Zazao
["জ্বু"] = "sit-zbu", -- Zbu
["জিল্যান্ডিক"] = "zea", -- Zealandic
["জিম"] = "zua", -- Zeem
["জেম্বা"] = "dhm", -- Zemba
["জেমে নাগা"] = "nzm", -- Zeme Naga
["জেনাগ"] = "zeg", -- Zenag
["জেনাগা"] = "zen", -- Zenaga
["জেন্সোনটেপেক চ্যাটিনো"] = "czn", -- Zenzontepec Chatino
["ঝাবা"] = "zhb", -- Zhaba
["ঝাং-ঝুং"] = "xzh", -- Zhang-Zhung
["ঝেনান মিন"] = "nan-zhe", -- Zhenan Min
["ঝিরে"] = "zhi", -- Zhire
["ঝোয়া"] = "zhw", -- Zhoa
["ঝুয়াং"] = "za", -- Zhuang
["ঝার"] = "jjr", -- Zhár
["জিয়া"] = "zia", -- Zia
["জিয়ালো"] = "zil", -- Zialo
["জিগুলা"] = "ziw", -- Zigula
["জিমাকানি"] = "zik", -- Zimakani
["জিম্বা"] = "zmb", -- Zimba
["জিম্বাবুয়ে সাইন ল্যাঙ্গুয়েজ"] = "zib", -- Zimbabwe Sign Language
["জিনজা"] = "zin", -- Zinza
["জিপসার জার্মান"] = "gmw-zps", -- Zipser German
["জিরেনকেল"] = "zrn", -- Zirenkel
["জিরিয়া"] = "zir", -- Ziriya
["জিজিলিবাকান"] = "ziz", -- Zizilivakan
["জো'ই"] = "pto", -- Zo'é
["জোকুও"] = "yzk", -- Zokhuo
["জোগোচো জাপোটেক"] = "zpq", -- Zoogocho Zapotec
["জোটুং চিন"] = "czt", -- Zotung Chin
["জোউ"] = "zom", -- Zou
["জুলগো-জেমজেক"] = "gnd", -- Zulgo-Gemzek
["জুলু"] = "zu", -- Zulu
["জুমায়া"] = "zuy", -- Zumaya
["জুম্বুন"] = "jmb", -- Zumbun
["জুনি"] = "zun", -- Zuni
["জুওজিয়াং ঝুয়াং"] = "zzj", -- Zuojiang Zhuang
["জুয়ারা"] = "ber-zuw", -- Zuwara
["জাইফে"] = "zyp", -- Zyphe
["জাপারো"] = "zro", -- Záparo
["আহান"] = "ahn", -- Àhàn
["আঙ্কা"] = "acb", -- Áncá
["আয়ওউ"] = "nfl", -- Äiwoo
["আইনূ"] = "aib", -- Äynu
["ওমিয়ে"] = "aom", -- Ömie
["ওনগে"] = "oon", -- Önge
["ક્સাম"] = "xam", -- ǀXam
["আননি"] = "hnh", -- ǁAni
["গানা"] = "gnk", -- ǁGana
["ক্সিগউই"] = "xeg", -- ǁXegwi
["হোআন"] = "huc", -- ǂHoan
["কুং"] = "khi-kun", -- ǃKung
["ক্সোও"] = "nmn", -- ǃXóõ
["ইয়ারোয়ামে"] = "yro", -- Ỹaroamë
}
fd5h2y1p3zeibmzdsudm1iwexuiyq3s
মডিউল:family tree
828
52287
510582
323367
2026-06-10T03:37:56Z
Hiyuune
11971
510582
Scribunto
text/plain
--[=[
Authors: [[User:kc_kennylau]], [[User:JohnC5]], [[User:Erutuon]], [[User:Suzukaze-c]], [[User:Theknightwho]], [[User:AryamanA]]
--]=]
local export = {}
local regular_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")
function export.find_subtree(t, code)
for _, val in ipairs(t) do
if val.name == code then -- "name" is really code
return {val}
end
local result = export.find_subtree(val, code)
if result ~= nil then
return result
end
end
end
local family_icon = "F"
local variety_icon = "V"
local proto_language_icon = family_icon
local family_with_proto_language_icon = family_icon
local function format_node(code, is_protolanguage_or_has_protolanguage, options)
local canonical_name, category_name, class, icon, tooltip, lemma_count_text
if regular_languages[code] then
canonical_name = regular_languages[code]
category_name = canonical_name:match(" ^ভাষা") and canonical_name or canonical_name .. " ভাষা"
class = "familytree-lang"
if is_protolanguage_or_has_protolanguage then
class = class .. ' familytree-protolang'
icon = proto_language_icon
end
-- Add lemma count if the lemma_count option is set and category name exists
if options and options.lemma_count and category_name then
page_count = mw.site.stats.pagesInCategory(
canonical_name .. " লেমা",
"pages"
)
lemma_count_text = ' (' .. page_count .. ')'
end
elseif etymology_languages[code] then
canonical_name = etymology_languages[code]
class = "familytree-etymlang"
icon = variety_icon
tooltip = "Variety"
elseif families[code] then
canonical_name = families[code]
category_name = (canonical_name:match(" [Ll]anguages$") or canonical_name:match(" [Ll]ects$")) and canonical_name or
canonical_name .. " languages"
class = "familytree-family"
if is_protolanguage_or_has_protolanguage then
class = class .. ' familytree-hasprotolang'
icon = family_with_proto_language_icon
else
icon = family_icon
end
tooltip = "Language family"
end
return '<span class="' .. class .. '" '
.. (tooltip and 'title="' .. tooltip .. '"' or '') .. '>'
.. '[[:Category:' .. (category_name or canonical_name) .. '|'
.. canonical_name
.. ' <span class="familytree-code">(' .. code .. ')</span>]]'
.. (icon and ' <span class="familytree-icon">' .. icon .. '</span>' or '')
-- Include lemma count text if available
.. (lemma_count_text or '')
.. '</span>'
end
-- If neither options.show_all_families or options.show_etymology_languages is
-- falsy, then this function does nothing.
local function filter_nested_data(nested_data, options, protolanguage_of, is_protolanguage)
if not nested_data then -- ???
return nil
else
local name = nested_data.name
local first_child = nested_data[1]
-- This indicates that new_nested_data below should only be returned
-- if it contains non-etymology languages.
local check_for_non_etymology_children = false
-- If `show_all_families` is false and this is a family and its only
-- child is its proto-language, then replace the family with the
-- proto-language.
if options.hide_families_with_protolanguages and name and families[name]
and first_child and not nested_data[2]
and protolanguage_of[name] == first_child.name then
is_protolanguage[first_child.name] = true
return filter_nested_data(first_child, options, protolanguage_of, is_protolanguage)
elseif options.hide_etymology_languages
and etymology_languages[name] then
if nested_data[1] then
check_for_non_etymology_children = true
else
return nil
end
end
local new_nested_data = { name = name }
local i = 0
for _, subtable in ipairs(nested_data) do
subtable = filter_nested_data(subtable, options, protolanguage_of, is_protolanguage)
if subtable then
i = i + 1
new_nested_data[i] = subtable
end
end
if not check_for_non_etymology_children or new_nested_data[1] then
return new_nested_data
end
end
end
local function make_node(code, is_protolanguage, protolanguage_of, options)
return '</span> ' .. format_node(code,
is_protolanguage[code] or protolanguage_of[code] ~= nil, options)
end
local function only_child_is_protolanguage(tree, options, protolanguage_of)
return (options.family_under_protolanguage
or options.protolanguage_under_family)
and tree[1] and protolanguage_of[tree.name] == tree[1].name
end
export.are_all_children_etymology_languages = require("Module:memoize")(function (nested_data)
if not nested_data[1] then
return nil
end
for _, child in ipairs(nested_data) do
if not etymology_languages[child.name]
or export.are_all_children_etymology_languages(child) == false then
return false
end
end
return true
end)
local customcollapsible_number = 0
local customcollapsible_prefix = "familytree"
local function get_customcollapsible_id()
customcollapsible_number = customcollapsible_number + 1
return customcollapsible_prefix .. customcollapsible_number
end
local no_break_space = "\194\160"
local level_separator = (no_break_space):rep(3)
local expandtext, collapsetext = "[+]─", "[-]┬"
local function make_tree(data, is_protolanguage, protolanguage_of, options, prefix)
local result = {}
local function ins(val)
table.insert(result, val)
end
-- This tag is closed in the node generated by make_node.
prefix = prefix or '<span class="familytree-linedrawing">'
local branch = "├"
local next_level = prefix .. "│" .. level_separator
local length = #data
for i, val in ipairs(data) do
if i == length then
branch = "└"
next_level = prefix .. level_separator .. no_break_space
end
local code = val.name
local language_or_family_node =
make_node(code, is_protolanguage, protolanguage_of, options)
if not val[1] then
ins('<li>' .. prefix .. branch .. options.sterile_branch_text
.. language_or_family_node .. '</li>')
else
local customcollapsible_id = get_customcollapsible_id()
ins('<li>' .. prefix .. branch
.. '<span class="familytree-toggle mw-customtoggle-'
.. customcollapsible_id .. '">───┬</span>')
-- name me!
local flag = (options.family_under_protolanguage
or options.protolanguage_under_family)
and only_child_is_protolanguage(val, options, protolanguage_of)
local top_node
if flag then
code = val[1].name
val = val[1]
top_node = make_node(code, is_protolanguage, protolanguage_of, options)
if options.protolanguage_under_family then
top_node, language_or_family_node =
language_or_family_node, top_node
end
end
local all_children_are_etymology_languages =
export.are_all_children_etymology_languages(val)
local collapsible_ul = '<ul class="mw-collapsible'
.. (all_children_are_etymology_languages
and ' familytree-only-etym-children'
or '') .. '" '
.. 'id="mw-customcollapsible-' .. customcollapsible_id
.. '" data-expandtext="' .. expandtext
.. '" data-collapsetext="' .. collapsetext .. '">'
if flag then
ins(top_node
.. collapsible_ul .. '<li>' .. prefix
.. (i == length and no_break_space or "│")
.. level_separator .. "│")
end
ins(language_or_family_node)
if not flag then
ins(collapsible_ul)
end
-- Can't get default collapsibility script to apply the data-expandtext
-- and data-collapsetext attribute values to the custom toggle,
-- so have to have a custom script do it.
ins(make_tree(val, is_protolanguage, protolanguage_of, options, next_level))
ins('</ul></li>')
end
end
return table.concat(result)
end
local function get_number_parameter_in_range(args, arg, low, high)
local val = args[arg]
if val == "" or val == nil then
val = nil
else
val = tonumber(val)
if not (type(val) == "number"
and 0 <= val and val <= 6) then
error("Expected nothing or number between " .. low .. " and "
.. high .. " in parameter |" .. arg .. "=.")
end
end
return val
end
function export.show(frame)
local args = frame.args
local descendants_of = args[1]
local to_boolean = require("Module:yesno")
-- Determines whether families that have proto-languages will be shown.
local show_all_families = to_boolean(args[2] or args.fam)
-- Determines whether all etymology languages will be shown.
local show_etymology_languages = to_boolean(args[3] or args.etym)
-- Get the value for lemma_count argument
local lemma_count = to_boolean(args.lemma_count)
-- help! parameter name too long!
local sterile_branch_length = get_number_parameter_in_range(args, "sterile_branch_length", 0, 6)
-- Determines whether (if all families are shown) a family will be shown
-- on a line directly under and at the same level as its proto-language,
-- or the proto-language on a line directly under and at the same level as
-- its family.
local family_under_protolanguage = to_boolean(args.famunderproto)
local protolanguage_under_family = to_boolean(args.protounderfam)
if family_under_protolanguage and protolanguage_under_family then
error("Kindly choose between proto-language under family and family under proto-language.")
end
return export.print_children(descendants_of, {
hide_families_with_protolanguages = not show_all_families,
hide_etymology_languages = not show_etymology_languages,
family_under_protolanguage = family_under_protolanguage,
protolanguage_under_family = protolanguage_under_family,
sterile_branch_length = sterile_branch_length,
collapsed = require("Module:yesno")(args.collapsed),
lemma_count = lemma_count
})
end
function export.print_children(descendants_of, options)
local m_languages = require("Module:languages")
local m_table = require("Module:table")
local make_auto_subtabler = require("Module:auto-subtable")
descendants_of = m_languages.getByCode(descendants_of, nil, true, true)
local names = {}
local protolanguage_of = {}
local children = make_auto_subtabler{}
local descendants = descendants_of:getDescendantCodes()
table.insert(descendants, descendants_of:getCode())
if descendants_of:hasType("family") then
protolanguage_of[descendants_of:getCode()] = descendants_of:getProtoLanguageCode()
end
local memoized = {}
local get = function(code, func, ...)
local ret = memoized[code] or func(...)
if code then
memoized[code] = ret
end
return ret
end
for _, descendant_code in ipairs(descendants) do
-- Inner "repeat until true" loop allows break to work like continue, as it will always only run once.
repeat
local descendant = get(descendant_code, m_languages.getByCode, descendant_code, nil, true, true)
names[descendant_code] = descendant:getCanonicalName():gsub("Proto%-", "")
if descendant:hasType("language") then
local ancestors = m_table.shallowCopy(descendant:getAncestorCodes())
local parent_code = descendant:getParentCode()
if parent_code and descendant:hasType("etymology-only") then
local parent = get(parent_code, descendant.getParent, descendant)
if m_table.deepEquals(parent:getAncestorCodes(), ancestors) and
descendant:getFamilyCode() == parent:getFamilyCode() then
table.insert(children[parent:getCode()], descendant_code)
break
end
end
if #ancestors > 0 then
for _, ancestor in ipairs(ancestors) do
table.insert(children[ancestor], descendant_code)
end
break
end
else
local protolang = descendant:getProtoLanguageCode()
protolanguage_of[descendant_code] = protolang
if protolang and descendant:hasAncestor(protolang) then
table.insert(children[protolang], descendant_code)
break
end
end
local family_code = descendant:getFamilyCode()
if family_code then
local family = get(family_code, descendant.getFamily, descendant)
local protolang = get(family:getProtoLanguageCode(), family.getProtoLanguage, family)
if not protolanguage_of[family] then
protolanguage_of[family] = protolang and protolang:getCode()
end
if protolang and protolang:inFamily(family) and protolang:getCode() ~= descendant_code then
table.insert(children[protolang:getCode()], descendant_code)
else
table.insert(children[family:getCode()], descendant_code)
end
end
until true
end
-- No more auto subtabling needed.
children = children:un_auto_subtable()
-- Copy to new table, to filter out unwanted ancestors from descendants with multiple ancestors, where some are not descendants of the target language.
local parent_to_children_map = {}
for _, code in ipairs(descendants) do
parent_to_children_map[code] = children[code]
end
local function make_nested(data, children)
local make_nil = {}
for key, val in pairs(data) do
if type(key) == "number" then
if children[val] then
data[val] = make_nested(children[val], children)
table.insert(make_nil, key)
end
else
data[key] = make_nested(val, children)
end
end
if make_nil[2] then -- Make sure larger keys are removed first.
table.sort(make_nil, function (a, b) return a > b end)
end
for _, key in ipairs(make_nil) do
table.remove(data, key)
end
return data
end
local nested = make_nested(parent_to_children_map, parent_to_children_map)
local function deep_sort(current)
local result = {}
local is_table = {}
for key, val in pairs(current) do
if type(key) == "number" then
table.insert(result, val)
else
is_table[key] = true
table.insert(result, key)
end
end
table.sort(result, function(code1, code2)
return names[code1] < names[code2]
end)
for i = 1, #result do
if is_table[result[i]] then
local name = result[i]
result[i] = deep_sort(current[result[i]])
result[i].name = name
else
result[i] = { name = result[i] }
end
end
return result
end
nested = deep_sort(nested)
data = { nested = nested, protolanguage_of = protolanguage_of }
local nested_data, protolanguage_of = data.nested, data.protolanguage_of
nested_data = export.find_subtree(nested_data, descendants_of:getCode())
-- Return nil instead of a tree with only the root node.
if options.must_have_descendants and (nested_data == nil or #nested_data == 0 or nested_data[1] and #nested_data[1] == 0) then
return nil
end
local is_protolanguage = {}
if options.hide_families_with_protolanguages or options.hide_etymology_languages then
nested_data = filter_nested_data(nested_data, {
hide_families_with_protolanguages = options.hide_families_with_protolanguages,
hide_etymology_languages = options.hide_etymology_languages,
}, protolanguage_of, is_protolanguage)
end
if not nested_data or not next(nested_data) then
return nil
end
local result = {'<div class="familytree"><ul>'}
local function ins(val)
table.insert(result, val)
end
local tree_options = {
sterile_branch_text = '<span class="familytree-branch">'
.. ("─"):rep(options.sterile_branch_length or 4)
.. '</span>',
family_under_protolanguage = options.family_under_protolanguage,
protolanguage_under_family = options.protolanguage_under_family,
lemma_count = options.lemma_count,
}
local collapsetext, expandtext = 'Collapse', 'Expand'
for i, subtable in ipairs(nested_data) do
-- top language name
ins('<li>')
-- name me!
local flag = (options.family_under_protolanguage
or options.protolanguage_under_family)
and only_child_is_protolanguage(subtable, options, protolanguage_of)
local top_node = format_node(subtable.name)
local next_node
if flag then
subtable = subtable[1]
next_node = format_node(subtable.name)
if options.family_under_protolanguage then
top_node, next_node = next_node, top_node
end
end
ins(top_node)
-- top toggle
local customcollapsible_id = get_customcollapsible_id()
ins('<span class="familytree-toptoggle mw-customtoggle-'
.. customcollapsible_id .. '" style="display: none;">')
ins(options.collapsed and expandtext or collapsetext)
ins('</span>')
if flag then
ins('<li>')
ins(next_node)
end
-- tree
ins('<ul class="mw-collapsible')
if options.collapsed then
ins(' mw-collapsed')
end
ins('" id="mw-customcollapsible-' .. customcollapsible_id)
ins('" data-expandtext="' .. expandtext)
ins('" data-collapsetext="' .. collapsetext .. '">')
ins(make_tree(subtable, is_protolanguage, protolanguage_of, tree_options))
if flag then
ins('</li>')
end
ins('</ul></li>')
end
ins('</ul></div>')
ins(require("Module:TemplateStyles")("Module:family tree/style.css"))
return table.concat(result)
end
return export
sozrb5tyi3h1z8yut0irh1cxi0ocehh
মডিউল:category tree
828
67300
510583
501106
2026-06-10T04:23:49Z
Redmin
6857
-DPl
510583
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)
return require("Module:message box").maintenance(
"red",
"[[File:Ambox warning pn.svg|50px]]",
"This category is not defined in Wiktionary's category tree.",
text
)
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
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
-- 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("^Category:", "")
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 = "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 = "Category:" .. 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("^Category:", "") .. "." 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, ("[[Category:%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, ("[[Category:%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]*[Cc][Aa][Tt][EeGgOoRrYy _\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() == "টেমপ্লেট:স্বয়ংক্রিয় বিষয়শ্রেণী" 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
insert(categories, "[[Category:Categories that are not defined in the category tree]]")
insert(categories, totalPages == 0 and "[[Category:Empty categories]]" or nil)
insert(display, show_error(
"Double-check the category name for typos. <br>" ..
"[[Special:Search/Category: " .. current_title.text:gsub("^.+:", ""):gsub(" ", "~2 ") .. '~2|Search existing categories]] to check if this category should be created under a different name (for example, "Fruits" instead of "Fruit"). <br>' ..
"To add a new category to Wiktionary's category tree, please consult " .. current_frame:expandTemplate{title = "section link", args = {
"Help:Category#How_to_create_a_category",
}} .. "."))
-- Exit here, as all code beyond here relies on current not being nil
return concat(categories, "") .. concat(display, "\n\n"), 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, "[[Category:Categories with incorrect names]]")
insert(display, show_error(("Based on the data in the category tree, this category should be called '''[[:Category:%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())
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("^Thesaurus:(%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 (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(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("(.+) by language$")
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 "(এই টেমপ্লেটটি বিষয়শ্রেণী: নামস্থানে ব্যবহার করা উচিত।)"
elseif namespace ~= 14 then -- Category
error("এই টেমপ্লেটটি শুধুমাত্র বিষয়শ্রেণী: নামস্থানে ব্যবহার করা যাবে।")
end
local first_fail_args_handled, first_fail_cattext
-- 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 fruther 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.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
if not first_fail_cattext then
first_fail_cattext = cattext
first_fail_args_handled = info.args and true or false
end
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- If there were no matches, throw an error if any arguments were given, or otherwise return the cattext
-- from the first fail encountered. The final handlers call the boilers unconditionally, so there should
-- always be something to return.
if not first_fail_args_handled and next(other_args) then
error(extra_args_error)
end
return first_fail_cattext
end
-- TODO: new test entrypoint.
return export
8ygy085oiv955jkip5omwcjkqcn383b
510594
510583
2026-06-10T10:04:54Z
Redmin
6857
-DPL
510594
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)
return require("Module:message box").maintenance(
"red",
"[[File:Ambox warning pn.svg|50px]]",
"This category is not defined in Wiktionary's category tree.",
text
)
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
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
-- 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("^Category:", "")
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 = "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 = "Category:" .. 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("^Category:", "") .. "." 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, ("[[Category:%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, ("[[Category:%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]*[Cc][Aa][Tt][EeGgOoRrYy _\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() == "টেমপ্লেট:স্বয়ংক্রিয় বিষয়শ্রেণী" 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")
-- Are the parameters valid?
if not current then
insert(categories, "[[Category:Categories that are not defined in the category tree]]")
insert(categories, totalPages == 0 and "[[Category:Empty categories]]" or nil)
insert(display, show_error(
"Double-check the category name for typos. <br>" ..
"[[Special:Search/Category: " .. current_title.text:gsub("^.+:", ""):gsub(" ", "~2 ") .. '~2|Search existing categories]] to check if this category should be created under a different name (for example, "Fruits" instead of "Fruit"). <br>' ..
"To add a new category to Wiktionary's category tree, please consult " .. current_frame:expandTemplate{title = "section link", args = {
"Help:Category#How_to_create_a_category",
}} .. "."))
-- Exit here, as all code beyond here relies on current not being nil
return concat(categories, "") .. concat(display, "\n\n"), 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, "[[Category:Categories with incorrect names]]")
insert(display, show_error(("Based on the data in the category tree, this category should be called '''[[:Category:%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())
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("^Thesaurus:(%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 (.-) script$")
if script and baseLabel ~= "terms" then
local scriptObj = require("Module:scripts").getByCanonicalName(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("(.+) by language$")
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 "(এই টেমপ্লেটটি বিষয়শ্রেণী: নামস্থানে ব্যবহার করা উচিত।)"
elseif namespace ~= 14 then -- Category
error("এই টেমপ্লেটটি শুধুমাত্র বিষয়শ্রেণী: নামস্থানে ব্যবহার করা যাবে।")
end
local first_fail_args_handled, first_fail_cattext
-- 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 fruther 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.
submodule = require(category_tree_submodule_prefix .. submodule)
local cattext, failed = generate_output(submodule.main(info))
if failed then
if not first_fail_cattext then
first_fail_cattext = cattext
first_fail_args_handled = info.args and true or false
end
elseif not info.args and next(other_args) then
error(extra_args_error)
else
return cattext
end
end
end
-- If there were no matches, throw an error if any arguments were given, or otherwise return the cattext
-- from the first fail encountered. The final handlers call the boilers unconditionally, so there should
-- always be something to return.
if not first_fail_args_handled and next(other_args) then
error(extra_args_error)
end
return first_fail_cattext
end
-- TODO: new test entrypoint.
return export
2kvpgealw7q29d3cmbthl2bwx3yspjf
মডিউল:category tree/data
828
67301
510565
501114
2026-06-10T03:13:51Z
Hiyuune
11971
510565
Scribunto
text/plain
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.
"languages",
"miscellaneous",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "মডিউল: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 " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. 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("Raw category " .. category .. " defined in both [["
.. datamodule .. "]] and [[" .. 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("^Category:") 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
}
hylemkdhrv6wsbylfhf69tvodzwjusz
510572
510565
2026-06-10T03:29:08Z
Hiyuune
11971
510572
Scribunto
text/plain
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.
"languages",
"lemmas",
"miscellaneous",
}
-- Import subpages
for _, subpage in ipairs(subpages) do
local datamodule = "মডিউল: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 " .. label .. " defined in both [["
.. datamodule .. "]] and [[" .. 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("Raw category " .. category .. " defined in both [["
.. datamodule .. "]] and [[" .. 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("^Category:") 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
}
5kppcuegrjac8oxx5ae54w139rlrgr8
বিষয়শ্রেণী:লাতিন লেমা
14
72191
510576
244991
2026-06-10T03:34:14Z
Hiyuune
11971
510576
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
মডিউল:category tree/poscatboiler
828
156751
510575
325325
2026-06-10T03:34:01Z
Hiyuune
11971
510575
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 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 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
error("The parameter \"" .. key .. "\" was not recognized.")
end
end
local self = setmetatable({}, Category)
self._info = info
if not self._info.label then
error("No label was specified.")
end
self:initCommon()
if not self._data then
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 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)
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 = 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
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)
self._info.code = self._lang:getCode()
end
if self._data.sc then
if type(self._data.sc) ~= "string" then
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)
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 langs_with_modules = require(lang_specific_module)
local obj, seen = self._lang, {}
repeat
if langs_with_modules[obj:getCode()] then
local module = lang_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 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 = self._info.args or {},
called_from_inside = self._info.called_from_inside,
}
self._data, args_handled = handler(data)
if self._data then
if 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()
until not obj or seen[obj:getCode()]
end
-- Then check lang-independent labels.
if not self._data then
local labels = lang_independent_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 handlers.
if not self._data then
local data = {
label = self._info.label,
lang = self._lang,
sc = self._sc,
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
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
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
error("Internal error: `desc` must be a string, number, function, callable table or nil; received a " .. desc_type)
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
error("Internal error: the value returned by `desc` must be a string or nil; received a " .. desc_type)
end
local function add_obj_args(args, obj, obj_type)
if obj then
args[obj_type .. "code"] = obj:getCode()
args[obj_type .. "name"] = obj:getCanonicalName()
args[obj_type .. "disp"] = obj:getDisplayForm()
args[obj_type .. "cat"] = obj:getCategoryName()
args[obj_type .. "link"] = obj:makeCategoryLink()
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")
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._lang or self._info.raw then
ret = self._data.breadcrumb
else
ret = self._data.umbrella and self._data.umbrella.breadcrumb
end
if not ret then
ret = self._info.label
end
if type(ret) ~= "table" then
ret = {name = ret}
end
local name = self:substitute_template_specs(ret.name)
local nocap = ret.nocap
if self._sc then
name = name .. " in " .. self._sc:getDisplayForm()
end
return name, 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 .. " " .. self._sc:getDisplayForm()
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
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)
if spec == false then
return nil
end
return self:substitute_template_specs(spec or parent_spec)
end
function Category:canonicalize_parents_children(cats, is_children)
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)
local sc = self:inherit_spec(cat.sc, not raw and self._info.sc or nil)
-- Get the sortkey.
local sortkey = cat.sort
if type(sortkey) == "table" then
sortkey.sort_base = self:substitute_template_specs(sortkey.sort_base) or
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
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)
sortkey.sc = self:inherit_spec(sortkey.sc, sc)
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
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
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:getCanonicalName() .. " script"}
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()},
{name = parent2, sort = self._sc:getCanonicalName()},
}
else
local parents
if is_umbrella then
parents = self._data.umbrella and self._data.umbrella.parents or self._data.umbrella_parents
else
parents = self._data.parents
end
ret = self:canonicalize_parents_children(parents)
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
error(("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, lang, sc = self._data.catfix, self._data.catfix_sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode)
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
return lang, sc
elseif not self._data.umbrella then
return
end
-- umbrella
local langcode, sccode, lang, sc = self._data.umbrella.catfix, self._data.umbrella.catfix_sc
if langcode then
langcode = self:substitute_template_specs(langcode)
lang = get_lang(langcode)
end
if sccode then
sccode = self:substitute_template_specs(sccode)
sc = get_script(sccode)
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.
error("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
e54fbcl6q9cscot8wpw5feqvxsy8gzc
মডিউল:category tree/languages
828
164100
510564
501113
2026-06-10T03:12:45Z
Hiyuune
11971
510564
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["All languages"] = {
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 = {
"Fundamental",
},
}
raw_categories["All extinct languages"] = {
description = "This category contains the 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 = {
"All languages",
},
}
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-progressive.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-progressive.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'
}))
return sc:makeCategoryLink()
.. ' (<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 = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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("^(.*) language$")
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
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
}
pxumxz7hst5qqkh18vzbnigxb7bw3lr
510569
510564
2026-06-10T03:22:03Z
Hiyuune
11971
510569
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 = "This category contains the 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["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"সকল ভাষা",
},
}
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-progressive.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-progressive.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'
}))
return sc:makeCategoryLink()
.. ' (<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 = "সকল ভাষা", 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 = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "en"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
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
}
cjsy8a7doyg72cszncnooplo67kcoaz
510574
510569
2026-06-10T03:31:45Z
Hiyuune
11971
510574
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 = "This category contains the 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["Languages by country"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"সকল ভাষা",
},
}
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-progressive.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("bn"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-progressive.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'
}))
return sc:makeCategoryLink()
.. ' (<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 = "bn"}
local ret = {{name = "সকল ভাষা", 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 = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "bn"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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({"লেমা"}) 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
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 = "bn"}})
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
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 = "bn"}}},
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 = "bn"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
m9fb5my270y3yqkqn5zt1v56yve7kf4
510588
510574
2026-06-10T05:23:37Z
Hiyuune
11971
510588
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 = "This category contains the 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["দেশ অনুযায়ী ভাষা"] = {
topright = "{{commonscat|Languages by continent}}",
description = "Categories that group languages by country.",
additional = "{{{umbrella_meta_msg}}}",
parents = {
"সকল ভাষা",
},
}
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-progressive.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("bn"), term = entryname or canonicalName}), [=['''</div>
|-
| style="vertical-align: top; height: 35px;" | [[File:Codex icon book color-progressive.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'
}))
return sc:makeCategoryLink()
.. ' (<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 = "bn"}
local ret = {{name = "সকল ভাষা", 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 = "Category:" .. fam:getCategoryName(), sort = sortkey})
if lang:hasType("reconstructed") then
insert(ret, {
name = "Category:Reconstructed languages",
sort = {sort_base = canonicalName:gsub("^Proto%-", ""), lang = "bn"}
})
end
end
local function add_sc_cat(sc)
insert(ret, {name = "Category:" .. sc:getCategoryName() .. " languages", 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 = 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({"লেমা"}) 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
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("^(.*) ভাষা")
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 = parent .. " ভাষা", sort = sort_key})
end
else
insert(parents, {name = "দেশ অনুযায়ী ভাষা", sort = {sort_base = bare_location, lang = "bn"}})
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 = "Category:" .. locationcat, sort = " Languages"})
end
else
local location_cat = ("Category:%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 = "Languages"})
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 = "bn"}}},
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 = "bn"}}},
breadcrumb = lang:getCanonicalName() .. "-based",
}
end
end
end)
return {
RAW_CATEGORIES = raw_categories,
RAW_HANDLERS = raw_handlers
}
fkp82d3qe95fdftxias8fzeevdpk9c1
মডিউল:category tree/lemmas
828
164269
510571
501286
2026-06-10T03:28:53Z
Hiyuune
11971
510571
Scribunto
text/plain
local labels = {}
local raw_categories = {}
local handlers = {}
local ucfirst = require("Module:string utilities").ucfirst
-----------------------------------------------------------------------------
-- --
-- LABELS --
-- --
-----------------------------------------------------------------------------
local diminutive_augmentative_poses = {
"adjectives",
"adverbs",
"determiners",
"interjections",
"nouns",
"numerals",
"prefixes",
"proper nouns",
"pronouns",
"suffixes",
"verbs"
}
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["adjectives"] = {
description = "{{{langname}}} terms that give attributes to nouns, extending their definitions.",
parents = {"lemmas"},
}
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 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.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Possessable nouns by language",
},
}
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.",
parents = {"Lemmas subcategories by language"},
breadcrumb = "Unpossessable nouns by language",
},
}
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[case .. " " .. pos] = {
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
local labels2 = {}
-- Add "reconstructed" subcategories; add 'umbrella_parents' key if not
-- already present.
for key, data in pairs(labels) do
labels2[key] = data
if not data.umbrella_parents then
data.umbrella_parents = "Lemmas subcategories by language"
end
labels2["reconstructed " .. key] = {
description = "{{{langname}}} " .. key .. " that have been linguistically [[Wiktionary:Reconstructed terms|reconstructed]].",
umbrella_parents = "Lemmas subcategories by language",
parents = {key, {name = "reconstructed terms", sort = key}}
}
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 = labels2, RAW_CATEGORIES = raw_categories, HANDLERS = handlers}
9fw5n9uydq6glwv2wygsjfrghv52fyl
মডিউল:category tree/wiktionary maintenance
828
164307
510595
501324
2026-06-10T10:06:09Z
Redmin
6857
-DPL
510595
Scribunto
text/plain
local raw_categories = {}
local raw_handlers = {}
local m_template_parser = require("Module:template parser")
local get_lang = require("Module:languages").getByCode
local insert = table.insert
local is_internal_title = require("Module:pages").is_internal_title
local new_title = mw.title.new
local split_lang_label = require("Module:category tree").split_lang_label
local php_trim = require("Module:Scribunto").php_trim
local uses_hidden_category = require("Module:maintenance category").uses_hidden_category
-----------------------------------------------------------------------------
-- --
-- RAW CATEGORIES --
-- --
-----------------------------------------------------------------------------
raw_categories["Wiktionary maintenance"] = {
description = "Categories containing pages that are being tracked for attention and improvement by editors.",
breadcrumb = "Maintenance",
parents = "Wiktionary",
}
raw_categories["Empty categories"] = {
topright = "{{shortcut|CAT:EC}}",
description = "Categories with no members.",
additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories.
Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up.
Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with incorrect names"] = {
description = "Categories with names that do not match the expected form within the category tree.",
additional =
[=[This usually happens when additional parameters have been given to {{tl|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name.
==See also==
* [[:Category:Categories that are not defined in the category tree]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories that are not defined in the category tree"] = {
description = "Categories which use {{tl|auto cat}}, but which are not registered in the category tree data modules.",
additional = [=[See the error box displayed on any of these categories for more info.
==See also==
* [[:Category:Categories with incorrect names]]]=],
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries tagged as derogatory"] = {
description =
"Entries are placed in this category automatically when tagged with {{temp|derogatory}}. Do not add entries to this category manually.",
parents = "Wiktionary maintenance",
breadcrumb = "Tagged as derogatory",
can_be_empty = true,
hidden = true,
}
raw_categories["Entries with deprecated labels"] = {
description =
"Entries which use labels which have been marked as deprecated and should no longer be used; these should be replaced according to the table below.",
additional =
[=[See all labels: [[Module:labels/data]], [[Module:labels/data/regional]], [[Module:labels/data/topical]].
{| class="wikitable sortable"
! Label
! Replace with
|-
| christianity || Christianity
|-
| currency || numismatics
|-
| emergency || emergency medicine
|-
| greekmyth || Greek mythology
|-
| industry || manufacturing
|-
| islam || Islam
|-
| morphology || linguistic morphology
|-
| musici || musical instruments
|-
| ordinal || ex. 1: [[14th]]: <nowiki>{{abbreviation of|fourteenth|lang=en}}</nowiki> <br> ex. 2: [[fourth]] (in definition): "The [[ordinal]] form of the number [[four]]."
|-
| plural || in the plural (usually)
|-
| quantum || quantum mechanics
|-
| singular || in the singular (usually)
|-
| usually plural<br/>usually in plural</br>usually in the plural || usually<nowiki>|</nowiki>in the plural
|-
| dual || in the dual
|-
| usually dual<br/>usually in dual</br>usually in the dual || usually<nowiki>|</nowiki>in the dual
|-
| vector || linear algebra
|}]=],
breadcrumb = "With deprecated labels",
can_be_empty = true,
hidden = true,
parents = "Wiktionary maintenance",
}
raw_categories["Hidden categories"] = {
description =
"Categories using the <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> behavior switch, which hides the category from the lists of categories in its members and subcategories.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Indexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> behavior switch, which tells search engines to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Noindexed pages"] = {
description =
"Pages using the <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code> behavior switch, which tells search engines not to index the page.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using deprecated templates"] = {
description =
"This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.",
additional =
[=[This category is populated by {{tl|deprecated code}} and {{tl|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Category:Successfully deprecated templates]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Category:Pages using deprecated templates]]. Ideally, this category will be empty.
Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=],
breadcrumb = "Using deprecated templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using lite templates"] = {
description = "Pages which use at least one of the lite templates.",
additional = "See [[:Category:Lua-free templates]].",
breadcrumb = "Using lite templates",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with redundant inline etymon"] = {
description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.",
additional = "These should be reviewed and simplified to avoid redundant specification.",
breadcrumb = "Redundant inline etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using etymon with no ID"] = {
description =
"Pages where {{tl|etymon}} is used without an ID and the linked page has only one etymon template for the language.",
additional = "These should be updated to specify an explicit ID to avoid ambiguity if more etymons are added later.",
breadcrumb = "ID-less etymon",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with inline etymon for redlinks"] = {
description = "Pages where {{tl|etymon}} is used inside another {{tl|etymon}} and the target term is a redlink.",
additional = "These should be reviewed once the target entries are created.",
breadcrumb = "Inline etymon for redlinks",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with tab characters"] = {
description = "Pages which contain a tab character in their wikitext.",
additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].",
breadcrumb = "Tab characters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with language headings in the wrong order"] = {
description = "Pages in which the headings for each language's entry are in the wrong order.",
additional =
"Level 2 language headings should be in alphabetical order, except for Translingual and English, which go at the top (in that order).",
breadcrumb = "Language headings in the wrong order",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with nonstandard language headings"] = {
description = "Pages which contain a level 2 heading which does not match any language's canonical name.",
additional = "The level 2 language heading for each language should always be that language's canonical name.",
breadcrumb = "Nonstandard language headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with unwanted L1 headings"] = {
description = "Pages which contain an unwanted level 1 heading.",
additional =
"Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.",
breadcrumb = "Unwanted L1 headings",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw triple-brace template parameters"] = {
description = "Pages which contain raw template parameters in the form of triple braces.",
additional =
"Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.",
breadcrumb = "Raw template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DEFAULTSORT conflicts"] = {
topright = "{{shortcut|CAT:DEFAULTSORT}}",
description = "Pages on which the {{tl|DEFAULTSORT:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DISPLAYTITLE conflicts]].",
breadcrumb = "DEFAULTSORT conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with DISPLAYTITLE conflicts"] = {
topright = "{{shortcut|CAT:DISPLAYTITLE}}",
description =
"Pages on which the {{tl|DISPLAYTITLE:}} magic word has been used multiple times with different values.",
additional =
"In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{tl|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{tl|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." ..
"\n\nSee also [[:Category:Pages with DEFAULTSORT conflicts]].",
breadcrumb = "DISPLAYTITLE conflicts",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with raw sortkeys"] = {
description = "Pages on which a sortkey has been used with a raw category.",
additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." ..
"\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" ..
"By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.",
breadcrumb = "Raw sortkeys",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with module errors"] = {
topright = "{{shortcut|CAT:E|CAT:ERR|CAT:ERROR}}",
description = "Pages that have errors in a [[Wiktionary:Scribunto|Lua]] module.",
additional =
"If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]. Memory errors are a common source of these errors; see the discussion at [[Wiktionary:Lua memory errors]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[mw:Help:Dummy_edit#A_null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20module%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with ParserFunction errors]].",
breadcrumb = "Module errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages with ParserFunction errors"] = {
topright = "{{shortcut|CAT:PFE}}",
description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.",
additional =
"Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." ..
"\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." ..
"\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." ..
"\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." ..
"\n\nSee also [[:Category:Pages with module errors]].",
breadcrumb = "ParserFunction errors",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Requests for moves, mergers and splits"] = {
description = "Pages and categories which have been tagged with a request for them to be moved, merged or split.",
breadcrumb = "Moves, mergers and splits",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages to be merged"] = {
description = "Pages tagged to be merged by the {{tl|merge}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be moved"] = {
description = "Pages tagged to be moved by the {{tl|move}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Pages to be split"] = {
description = "Pages tagged to be split by the {{tl|split}} template.",
parents = "Requests for moves, mergers and splits",
can_be_empty = true,
}
raw_categories["Category and label treatment requests"] = {
description = "Content categories which have been tagged with {{tl|cltr}}, a request for them to be renamed, merged, split or deleted.",
parents = { "Wiktionary maintenance", "Requests" },
can_be_empty = true,
hidden = true,
}
raw_categories["Pages using invalid parameters when calling templates"] = {
description = "Pages that use unrecognized parameters when calling a template.",
breadcrumb = "Invalid template parameters",
parents = "Wiktionary maintenance",
can_be_empty = true,
}
raw_categories["Pages using catfix"] = {
description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.",
additional =
"This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Pages calling Template:minitoc"] = {
description = "Pages that display a mini table of contents by calling {{tl|minitoc}}.",
additional = "This is used on very large pages with many entries, to assist with navigation.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories calling Template:auto cat"] = {
description = "Categories that have been placed in another category by calling {{tl|auto cat}}.",
additional =
"This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{tl|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Categories with categories using raw markup"] = {
description =
"Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
raw_categories["Documentation subpages"] = {
description = "Documentation subpages of templates and modules.",
parents = "Template documentation",
}
raw_categories["Orphaned documentation subpages"] = {
description = "Documentation subpages whose main page was deleted, leaving the documentation orphaned.",
additional = "Pages whose documentation page was created before the main page was created will also appear here. These should not be deleted; a null edit (edit with no changes) should fix this.",
parents = {"Documentation subpages", "Wiktionary maintenance"},
breadcrumb_and_first_sort_key = "Orphaned",
can_be_empty = true,
}
raw_categories["Template documentation"] = {
description = "Pages and categories relating to template documentation.",
parents = "Wiktionary",
}
raw_categories["Templates and modules needing documentation"] = {
preceding = "{{also|:Category:Templates and modules with outdated documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] that require a documentation subpage.",
additional = "See [[Help:Documenting templates and modules]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Templates and modules with outdated documentation"] = {
preceding = "{{also|:Category:Templates and modules needing documentation}}",
description =
"[[Wiktionary:Templates|Templates]] and [[Wiktionary:Modules|modules]] whose documentation is out of date.",
additional = "See [[Help:Documenting templates]] for more information.",
parents = {"Template documentation", "Wiktionary maintenance"},
can_be_empty = true,
}
raw_categories["Pages using deprecated source tags"] = {
description =
"Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.",
breadcrumb = "Deprecated source tags",
parents = "Wiktionary maintenance",
can_be_empty = true,
hidden = true,
}
insert(raw_handlers, function(data)
local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$")
if not template_type then
return
end
local parents = { {
name = "Pages using invalid parameters when calling templates",
sort = template_type == "general use" and "*" or template_type,
} }
local lang = require("Module:languages").getByCanonicalName(template_type, nil, true)
if lang then
insert(parents, { name = "entry maintenance", is_label = true, lang = lang:getCode() })
end
return {
lang = lang and lang:getCode() or nil,
description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.",
parents = parents,
breadcrumb = template_type,
}
end)
do
local prefixes = require("Module:table").listToSet { "list", "P", "R", "RQ", "table", "U" }
local function add_parent(parents, seen, cat_type, sortkey)
if seen[cat_type] then
return
end
insert(parents, {
name = ("Pages using invalid parameters when calling %s templates"):format(cat_type),
sort = sortkey,
})
seen[cat_type] = true
end
insert(raw_handlers, function(data)
local template = data.category:match("^Pages using invalid parameters when calling (.+)$")
if not template then
return
end
-- Resolve any redirects.
template = new_title(template)
while template do
local redirect = template.redirectTarget
if not (redirect and is_internal_title(redirect)) then
break
end
template = redirect
end
-- Disallow templates which would always hidden maintennace categories (e.g. sandboxes).
if not (template and not uses_hidden_category(template)) then
return
end
local prefixed_text, lang = template.prefixedText
if template.namespace == 10 then
local name = template.text
-- Remove the prefix if present (e.g. "R:" or "RQ:").
local prefix, text = name:match("^(.-):(.+)")
if not (prefix and prefixes[prefix]) then
text = name
end
-- Check the initial language code, chopping off hyphenated sections until there's a match or they run out.
local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]")
while code do
lang = get_lang(code)
if lang then
break
end
code = code:match("(.+)%-%a*$")
end
-- If no match and it's a list: or table: template, check if the template name ends "/CODE".
if not lang and (prefix == "list" or prefix == "table") then
code = text:match("%f[^/]%l[%a-]*%a$")
if code then
lang = get_lang(code)
end
end
end
local sortkey = template.text
local parents, seen = {}, {}
-- Categorize as language-specific if a language was found.
if lang then
add_parent(parents, seen, lang:getCanonicalName(), sortkey)
end
-- Also grab any language categories from the template page.
for _, cat in ipairs(template.categories) do
if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then
local cat_lang = split_lang_label(new_title(cat).text)
if cat_lang then
add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey)
end
end
end
-- If none were found, categorize as general use.
if #parents == 0 then
add_parent(parents, seen, "general use", sortkey)
end
-- Only add can_be_empty if the template exists and contains checkparams.
local content, can_be_empty = template:getContent()
if content then
-- Check for {{#invoke:checkparams|warn|...}}.
-- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present.
for template in require("Module:template parser").find_templates(content) do
if template:get_name() == "#INVOKE:" then
local args = template:get_arguments()
local arg_2 = args[2]
if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then
can_be_empty = true
break
end
end
end
end
return {
canonical_name = "Pages using invalid parameters when calling " .. prefixed_text,
lang = lang and lang:getCode() or nil,
description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.")
:format(m_template_parser.getTemplateInvocationName(template)),
additional =
"These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.",
breadcrumb = prefixed_text,
parents = parents,
can_be_empty = can_be_empty,
hidden = true,
}
end)
end
return { RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers }
p79be8v3lil6cz1u760mh5l28cuhgd4
Gruß
0
168978
510561
2026-06-09T12:45:32Z
Redmin
6857
লেক্সিম লিংকার এক্সটেনশনের সাহায্যে উইকিউপাত্ত লেক্সিম L481849-এর জন্য একটি নতুন ভুক্তি তৈরি করছি
510561
wikitext
text/x-wiki
{{লে|L481849}}
t4udu8dw6dq2nqblop5n9dgz4ag1789
টেমপ্লেট:section link
10
168979
510566
2026-06-10T03:14:42Z
Hiyuune
11971
"<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:links/templates|section_link_t}}</onlyinclude></includeonly><!-- -->{{documentation}}" দিয়ে পাতা তৈরি
510566
wikitext
text/x-wiki
<includeonly><onlyinclude>{{safesubst:<noinclude/>#invoke:links/templates|section_link_t}}</onlyinclude></includeonly><!--
-->{{documentation}}
ibm6pphssf4ri0l6woztg05ytrgg9jz
মডিউল:message box
828
168980
510567
2026-06-10T03:15:14Z
Hiyuune
11971
+
510567
Scribunto
text/plain
local html_create = mw.html.create
local tostring = tostring
local export = {}
local function make_box(tag, rows, image, header, text)
tag = tag:addClass("noprint")
:tag("table")
:tag("tr")
:tag("td")
if rows > 1 then
tag:attr("rowspan", rows)
end
tag = tag:wikitext(image)
:done()
if header then
tag = tag:node(header)
:done()
:tag("tr")
end
return tostring(tag:tag("td")
:wikitext(text)
:allDone()) ..
require("Module:TemplateStyles")("Module:message box/styles.css")
end
function export.maintenance(color, image, title, text)
local div = html_create("div")
:addClass("maintenance-box")
:addClass("maintenance-box-" .. color)
local header = html_create("th")
:css("text-align", "left")
:wikitext(title)
return make_box(div, 2, image, header, text)
end
function export.request(image, text)
local div = html_create("div")
:addClass("request-box")
return make_box(div, 1, image, nil, text)
end
return export
0njvtu4cuuvz98uci9fdhcz9qzscuod
বিষয়শ্রেণী:ইংরেজি
14
168981
510579
2026-06-10T03:35:51Z
Hiyuune
11971
Hiyuune [[বিষয়শ্রেণী:ইংরেজি]] কে [[বিষয়শ্রেণী:ইংরেজি ভাষা]] শিরোনামে স্থানান্তর করেছেন
510579
wikitext
text/x-wiki
#পুনর্নির্দেশ [[:বিষয়শ্রেণী:ইংরেজি ভাষা]]
028bnqz5ow40eqj0mcme3lnqs4pvyjz
thingy
0
168982
510584
2026-06-10T05:15:59Z
Redmin
6857
লেক্সিম লিংকার এক্সটেনশনের সাহায্যে উইকিউপাত্ত লেক্সিম L1019638-এর জন্য একটি নতুন ভুক্তি তৈরি করছি
510584
wikitext
text/x-wiki
{{লে|L1019638}}
oej87o8zvz7vgcnl5e4tcf1a55w0b7z
behoove
0
168983
510585
2026-06-10T05:16:13Z
Redmin
6857
লেক্সিম লিংকার এক্সটেনশনের সাহায্যে উইকিউপাত্ত লেক্সিম L330903-এর জন্য একটি নতুন ভুক্তি তৈরি করছি
510585
wikitext
text/x-wiki
{{লে|L330903}}
awt1pe3gaprw64st5ley38uklnugdec
behove
0
168984
510586
2026-06-10T05:16:17Z
Redmin
6857
লেক্সিম লিংকার এক্সটেনশনের সাহায্যে উইকিউপাত্ত লেক্সিম L330903-এর জন্য একটি নতুন ভুক্তি তৈরি করছি
510586
wikitext
text/x-wiki
{{লে|L330903}}
awt1pe3gaprw64st5ley38uklnugdec
given name
0
168985
510587
2026-06-10T05:22:06Z
TheAhasan
14755
তৈরি
510587
wikitext
text/x-wiki
== {{ভাষা|en}} ==
=== উচ্চারণ ===
* {{আধ্বব|en|/ˌɡɪv.ən ˈneɪm/}}
*
=== বিশেষ্য ===
{{en-বিশেষ্য}}
# প্রদত্ত নাম, [[ডাকনাম]], নামের প্রথম অংশ (যা বংশসূত্রে পাওয়া পদবি বা টাইটেলের আগে বসে)।
==== সমার্থক শব্দ ====
* [[first name]]
* [[forename]]
* [[Christian name]]
==== বিপরীত শব্দ ====
* [[surname]]
* [[family name]]
pec5nvt7d0h2dskccj5s5hhae2z18dm
বিষয়শ্রেণী:মার্কিন যুক্তরাষ্ট্রের ভাষা
14
168986
510590
2026-06-10T05:25:19Z
Hiyuune
11971
"{{auto cat}}" দিয়ে পাতা তৈরি
510590
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
বিষয়শ্রেণী:দেশ অনুযায়ী ভাষা
14
168987
510591
2026-06-10T05:26:07Z
Hiyuune
11971
" auto cat}}{" দিয়ে পাতা তৈরি
510591
wikitext
text/x-wiki
auto cat}}{
cw7xel84b9endq8a6d9z2t4cos8n40u
510592
510591
2026-06-10T05:26:18Z
Hiyuune
11971
510592
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx